2

一人のユーザーのために、phpでアクセスが制限された非常にシンプルなページを作りたいとしましょう。許可されたユーザーがページのディレクトリとURLを知っているget場合、URLバーのメソッドを介してユーザー名とパスワード(彼が知っているはずです)を手動で渡し、スクリプトに対して自動的にチェックすることができます。ユーザー名とパスワードのはハードコーディングされますか?スクリプトには、if statementtrueでない場合、コンテンツを表示しないというものがあります。どのような欠陥がある可能性がありますか?

URL

http://example.com/admin.php?user=admin&password=1324

admin.php

<?php if($_GET['user'] == 'admin' && $_GET['password'] == '1324')){
// display content here
}else{
echo "You're not authorized to visit this page";
} ?>

シナリオ2:post方法

上記のシナリオと同様に、このシナリオでは、許可されたユーザーがユーザー名とパスワードをフォームに入力し、実際のadmin.phpファイルで処理されます。同様のif statementことが使用され、$_POST[]今回はスーパーグローバルで入力をチェックします。

<?php if($_POST['user'] == 'admin' && $_POST['password'] == '1324'){
  // display content here
}else{
  echo "You're not authorized to visit this page";
} ?>
4

3 に答える 3

4

どちらにも欠点があります。

方法 1 を使用すると、ヘッダーに渡された変数がページ履歴に保存されることになります。つまり、PC にアクセスできる人は誰でもそれらを検索して見つけることができ、その過程で自分自身にアクセス権を与えることができます。検索エンジンはリンクを取得して保存し、世界中に公開することもできます.

方法 2 を使用する場合、安全なページにアクセスするたびに POST データを再送信する必要があります。つまり、リンクで十分だったはずのボタンやフォームがごちゃごちゃになってしまいます。ただし、最初の方法の問題は解消されます。

これらの両方に対するより良い方法は、$_SESSION 変数を使用することです。これにより、データへのアクセスを制御するために使用できる「キー」をユーザーに提供しながら、基本的にデータをサーバー側に保存できます。このキーはデフォルトで Cookie に保存されます。

使用例は次のとおりです。

//Say the user is "admin", and the password is "1234"
//This data could be used to 'log in' via post.
//First of all we start the session, and check to see if the user is logged in
//If the user has the session active, they'll have a cookie on their PC which links to it
session_start();
if ($_SESSION['login']==true || ($_POST['user']=="admin" && $_POST['pass']=="1234")) {
    //If they already have a session, give them access.
    //If not, check for posted UN & PW and if correct, give access.
    $_SESSION['login']=true; //Set login to true in case they got in via UN & PW
    //Do stuff for when logged in
}
else { //Not already logged in, not sent a password

    //Give the user a login form redirecting to this page.

}

これの利点は次のとおりです。

  • ユーザー側にパスワードを保存しない
  • ブラウザを閉じると期限切れになるセッション キー
  • パスワードはインターネット上で一度だけ渡されます
于 2012-08-24T23:05:51.297 に答える
1

はいGETPOSTフォームから渡す必要があります。多くの理由から、安全な方法ではありません。

しかし、はい、必要に応じて で渡すことができますGET。1 つの URL で、彼は立ち入り禁止エリアにジャンプできます。

ところで、ユーザー名とパスワードを確認するとき:

if($_GET['user'] == 'admin' && $_GET['password'] == '1324' && $_GET['password'] != '' && $_GET['username'] != '')

すでにデータに対して検証しているため、最後の部分を除外できます

if($_GET['user'] == 'admin' && $_GET['password'] == '1324')
于 2012-08-24T22:51:33.260 に答える
0

このようなもの

if (!isset($_SERVER['PHP_AUTH_USER'])) {
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'Text to send if user hits Cancel button';
    exit;
} else {
    $expectdUsername = 'username';
    $expectedPassword =  'secret';

    if($_SERVER['PHP_AUTH_USER'] != $expectdUsername || 
        $_SERVER['PHP_AUTH_PW'] != $expectedPassword) {
        echo 'Invalid username/password';
        exit;
    }

    //Add a cookie, set a flag on session or something
    //display the page
}

それはによって呼び出すことができます

http:// username:secret@thepage.com

于 2012-08-24T23:44:25.900 に答える