0

私は既存のWebサイトで作業しており、セキュリティの問題を探しています。ブラウザがリダイレクトされた後、PHPスクリプトが中止されたと言っても差し支えありませんか、それとも巧妙なユーザーがスクリプトを強制的に続行させることができますか。ユーザーが現在ログインしている場合、「is_logged_in」は1または0を返すと想定します。この関数には脆弱性がないと想定します。コードは次のとおりです。

<?
$fp = fopen("./debug.txt", "a");
fwrite("BEFORE LOGIN CHECK\n");

if(!is_logged_in()) {
         fwrite("Not authed \n");
         header("Location: $url", TRUE, 302);
}
fwrite("Passed auth check \n");
/* Code to do some logged in functionality here */
?>

ログインしたユーザーで通常のブラウザを使用すると、

BEFORE LOGIN CHECK
Passed auth check

ログインしていないユーザーの場合

BEFORE LOGIN CHECK
Not authed

生のリクエストを使用して、スクリプトを開いたままにする(そしてリダイレクトを無視する)ことは可能ですか?

BEFORE LOGIN CHECK
Not authed
Passed auth check

基本的に、ifブロックに入り、リダイレクトヘッダーを取得して無視し、スクリプトの実行を続行します。

そうでない場合は、次のようにして問題を修正します。

if(!is_logged_in()) {
         fwrite("Not authed \n");
         header("Location: $url", TRUE, 302);
         die();
}

しかし、これが問題であるかどうかはわかりません。

4

3 に答える 3

2

正解です。PHPの実行を停止するには、そのヘッダーを使用するexit();か、その後にヘッダーを使用する必要があります。die();

を使用header()することで、単一のHTTPヘッダーを設定するだけで、PHPにとっては何の意味もありません。設定header('X-CHEESE', 'cheddar');すると、それがうまく実行され、処理が続行されます。

使用したダイはPHPに実行を停止するように指示し、ブラウザが引き継ぐため、場所を見つけると、指定されたURLに移動します。

于 2013-03-19T14:38:30.633 に答える
0

ヘッダーメソッドはスクリプトの実行を終了しないため、ユーザーはリダイレクトヘッダーを取得しますが、スクリプトの残りの部分は引き続き実行されます(これは危険です)。

die()するか、リダイレクト後にコードを終了します。

編集:

次のコードでテストした後:

$fp = fopen("debug.txt", "a");
fwrite($fp,"BEFORE LOGIN CHECK\n");

if(true) {
         fwrite($fp,"Not authed \n");
         header("Location: index.php", TRUE, 302);
}
fwrite($fp,"Passed auth check \n");
fclose($fp);

if内の値をfalseに変更すると、これがdebug.txtファイルに追加されます。

BEFORE LOGIN CHECK
Passed auth check 

trueに変更すると、これがdebug.txtに追加されます。

BEFORE LOGIN CHECK
Not authed 
Passed auth check 
于 2013-03-19T14:38:02.833 に答える
0

ヘッダーの後にしない場合exit;、スクリプトは引き続き実行されます。

HTTP 200 をクライアントに送信するときにこれを使用したことがあり、content-length: 0 です。そのため、クライアントは何もせず、PHP は実行を続けます。

于 2013-03-19T14:36:52.933 に答える