3

私はこのようなphpコードを持っています

<?php
    $input_from_user = "w' onclick = 'alert(document.cookie);'";
    $i_am_barcelona_fan = htmlentities($input_from_user);
?>
<input type = 'text' name = 'messi_fan' value ='<?php echo $i_am_barcelona_fan;?>' />

XSS 攻撃から保護するために使用htmlentitiesしていますが、それでも上記の文字列に対して脆弱です。コードが XSS 攻撃に対して脆弱なのはなぜですか? コードから保護するにはどうすればよいですか?

4

2 に答える 2

2

PHPコードに導入された外部入力を決して信頼しないでください。外部入力をコードで使用する前に、必ずサニタイズして検証してください。filter_var および filter_input 関数は、テキストをサニタイズし、テキスト形式 (電子メール アドレスなど) を検証できます。

外部入力は何でもかまいません: $_GET と $_POST フォームの入力データ、$_SERVER スーパーグローバルのいくつかの値、fopen('php://input', 'r') 経由の HTTP リクエスト本体。外部からの入力は、ユーザーが送信したフォーム データに限定されないことに注意してください。アップロードおよびダウンロードされたファイル、セッション値、Cookie データ、およびサードパーティの Web サービスからのデータも外部からの入力です。

外部データは後で保存、結合、およびアクセスできますが、外部入力のままです。データを処理、出力、連結、またはコードに含めるたびに、データが適切にフィルター処理され、信頼できるかどうかを自問してください。

データは、その目的に基づいて異なる方法でフィルタリングされる場合があります。たとえば、フィルタリングされていない外部入力が HTML ページ出力に渡されると、サイトで HTML と JavaScript を実行できます。これはクロスサイト スクリプティング (XSS) として知られており、非常に危険な攻撃になる可能性があります。XSS を回避する 1 つの方法は、strip_tags 関数を使用して HTML タグを削除するか、htmlentities または htmlspecialchars 関数を使用して特別な意味を持つ文字をそれぞれの HTML エンティティにエスケープすることにより、ユーザーが生成したすべてのデータをページに出力する前にサニタイズすることです。

もう 1 つの例は、コマンド ラインで実行するオプションを渡すことです。これは非常に危険な場合があります (通常は悪い考えです) が、組み込みの escapeshellarg 関数を使用して、実行されたコマンドの引数をサニタイズできます。

最後の例は、ファイルシステムからロードするファイルを決定するために外部入力を受け入れることです。これは、ファイル名をファイル パスに変更することで悪用される可能性があります。ファイル パスから「/」、「../」、null バイト、またはその他の文字を削除して、隠しファイル、非公開ファイル、機密ファイルを読み込めないようにする必要があります。

データのフィルタリングについて学ぶ ( http://www.php.net/manual/en/book.filter.php )

filter_var について学ぶ ( http://php.net/manual/en/function.filter-var.php )

于 2013-04-04T04:52:34.267 に答える
2

PHPに引用符もエスケープするように指示しているのではなく、htmlspecialchars()代わりに次を使用する必要があります。

<input type = 'text' name = 'messi_fan' value ='<?php echo htmlspecialchars($input_from_user, ENT_QUOTES, 'UTF-8'); ?>' />

デモ

于 2013-04-04T04:56:53.223 に答える