ホームページ >php教程 >php手册 >PHP_SELF のセキュリティ問題を信用しないでください

PHP_SELF のセキュリティ問題を信用しないでください

WBOY
WBOYオリジナル
2016-06-13 12:22:111423ブラウズ

コードをコピーします コードは次のとおりです。



;?php
if (isset($_REQUEST['submitted']) && $_REQUEST['submitted'] == '1') {
echo "フォーム送信済み!"
}
; ?>









コードは正しいように見えますが、隠れた危険があります。 foo.php として保存し、PHP 環境で使用してみましょう

foo.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo
アクセスすると、JavaScript アラートがポップアップ表示されます。これは明らかに、別の

XSS インジェクション脆弱性です。理由は

にあります。
echo $_SERVER['PHP_SELF'];
フィルタリングされていない値は、このステートメントに直接出力されます。ソースをたどるために、PHP マニュアルの記述を見てみましょう

'PHP_SELF'<br><br>The filename of the currently executing script, relative to the document root. <br>For instance, $_SERVER['PHP_SELF'] in a script at the address <br>http://example.com/test.php/foo.bar would be /test.php/foo.bar. The __FILE__ <br>constant contains the full path and filename of the current (i.e. included) file.<br>If PHP is running as a command-line processor this variable contains the script <br>name since PHP 4.3.0. Previously it was not available. 
その理由は非常に明らかです。$_SERVER['PHP_SELF'] はサーバーによって提供される環境変数であるように見えますが、実際には $_POST および $_GET と同じであり、ユーザー。

$_COOKIE など、他にも同様の変数が多数あります (ユーザーが Cookie を「操作」したい場合、私たちにできることは何もありません)。解決策は簡単です。

strip_tagshtmlentities などの関数を使用してフィルタリングまたはエスケープします。

echo htmlentities($_SERVER['PHP_SELF']); 

-- 分割 --

上記の例では、常に慎重なコーディング精神を維持する必要があります。 Chris Shiflett は、XSS を防ぐための 2 つの基本的なセキュリティのアイデアをブログ

で非常にわかりやすくまとめています。 上記を「

入力をフィルターし、出力をエスケープ
Filter input<br>Escape output
」に翻訳しました。詳しい内容は、ここでは割愛しますが、彼のブログ

の記事をご参照ください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。