コードをコピーします コードは次のとおりです。
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_tags、htmlentities などの関数を使用してフィルタリングまたはエスケープします。
echo htmlentities($_SERVER['PHP_SELF']);
-- 分割 --
上記の例では、常に慎重なコーディング精神を維持する必要があります。 Chris Shiflett は、XSS を防ぐための 2 つの基本的なセキュリティのアイデアをブログで非常にわかりやすくまとめています。 上記を「
入力をフィルターし、出力をエスケープFilter input<br>Escape output」に翻訳しました。詳しい内容は、ここでは割愛しますが、彼のブログ
の記事をご参照ください。