0

データベースへの画像パスのアップロードを簡単にしたい漫画サイトがあります。

正しい資格情報をチェックするログイン画面があります。

            <?php 

        $username = isset($_POST['username']) ? $_POST['username'] : "";
        $password = isset($_POST['pw']) ? $_POST['pw'] : "";


        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            if(verify($username, $password) == 1) {
                header("Location: ?action=admin");
            }
            else {
                echo "<center>Incorrect credentials</center>";
            }
        }

        function verify($user, $pw) {
            include './scripts/dbconnect.php';

            $result = $mysqli->query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'"); 

            return $result->num_rows;
        }

        include 'include/footer.php';
        ?>

次に、アップロード画面にログインします。

残念ながら、ユーザーがしなければならないことは、アップロード ページの URL を推測するだけで、ログイン画面をスキップできます...

/HTwS/?action=login ('login' を 'admin' に置き換えるだけで...) したがって、私の最初の防御策は、アップロード ページの名前をそれほど明白にしないことです...ユーザーがまだそれを推測している場合... URLを変更できない別の方法で確認できますか?

ありがとう!

4

2 に答える 2

1

まあ、これはかなり安全ではありません。あなたがやりたいことは、ログイン時にいくつかのセッション変数を設定することです(、、$_SESSION[user_id]など$_SESSION[permission_type])。次に、各管理ページの上部に、設定した変数をverifyAdmin()チェックすることで、ログインしているユーザーが実際に管理者であるかどうかをチェックする機能を設定できます。$_SESSIONそうでない場合は、ログインページにリダイレクトされます。

管理者がログインするときに、いくつかのセッション変数を次のように設定します。

$_SESSION[user_id] = id_of_admin;
$_SESSION[permission_type] = 'admin';

verifyAdminは次のようになります。

function verifyAdmin() {
   if(!isset($_SESSION[username]) || !isset($_SESSION[permission_type]) || $_SESSION[permission_type] != 'admin'){
        header("Location: login.php");
    }
}

次に、各管理ページの上部で、これを簡単に行うことができます。

verifyAdmin();

検証関数は次のようになります。

function verify($user, $pw) {
    include './scripts/dbconnect.php';
    $result = $mysqli -> query("SELECT username, password FROM users WHERE username='" . $user . "' AND password='" . $pw . "'");
    if ($result -> num_rows == 1) {
        $_SESSION[username] = $user;
        $_SESSION[permission_type] = 'admin';
    }
    return $result -> num_rows;
}
于 2013-01-13T21:40:48.603 に答える
0

このコードのチャンクは、SQL インジェクションに対しても脆弱です。これらの $_POST 変数をサニタイズする必要があります。

于 2013-01-13T22:14:11.757 に答える