PHP では、パラメーター化されたクエリを使用することが SQL インジェクションを防ぐ最善の方法であることを知っています。
しかし、次のような他の目的に使用されるユーザー入力のサニタイズについてはどうでしょうか。
- ユーザーへの表示 (潜在的なクロスサイト スクリプティング ベクトル)
- 電子メールのアドレス指定またはメッセージ本文への入力
htmlentities()
データベース以外での使用をサニタイズする最善の方法はありますか? ここでベストプラクティスと見なされるものは何ですか?
PHP では、パラメーター化されたクエリを使用することが SQL インジェクションを防ぐ最善の方法であることを知っています。
しかし、次のような他の目的に使用されるユーザー入力のサニタイズについてはどうでしょうか。
htmlentities()
データベース以外での使用をサニタイズする最善の方法はありますか? ここでベストプラクティスと見なされるものは何ですか?
PHP で最適な xss フィルターは次のとおりです。
htmlspecialchars($_POST['param'],ENT_QUOTES);
引用符もエンコードする必要がある理由は、一部のxss を悪用するために <> を必要としないためです。たとえば、これは xss に対して脆弱です:
print('<A HREF="http://www.xssed.com/'.htmlspecialchars($_REQUEST[xss]).'">link</a>');
この場合、onmouseover を使用できるため、javascript を実行するために <> は必要ありません。攻撃の例を次に示します。
$_REQUEST[xss]='" onMouseOver="alert(/xss/)"';
ENT_QUOTES が二重引用符を処理します。
電子メールは少し異なります。JavaScriptはメール クライアントによって実行されるべきではありません。実行されている場合でも、Same Origin ポリシーにより、サイトは影響を受けません。しかし、安全のために、私はまだ を使用しますhtmlspecialchars($var,ENT_QUOTES);
。ただし、PHP の mail() 関数は、CRLF インジェクションと呼ばれる別の種類の脆弱性に屈する可能性があります。PHP-Nukeに対する脆弱性の例を次に示します。次のような関数呼び出しがある場合:次に、ユーザーが$header にmail($fmail, $subject, $message, $header);
注入できないようにする必要があります。\r\n
脆弱なコード:
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";
パッチ:
$_GET[name]=str_replace(array("\r","\n"),$_GET[name]);
$header="From: \"$_GET[name]\" <$ymail>\nX-Mailer: PHP";
また、危険な HTML を取り除き、安全な入力を残す HTML Purifier をチェックアウトすることもできます。どの HTML を許可/禁止するかについて、独自のルールを作成することもできます。
最初に、特定のフィールドのルールを作成できます。たとえば、電子メールは、文字、数字、@ (アットマーク? 実際には何と呼ばれているか)、およびピリオドのみで構成される必要があるため、それから XSS を形成することはできません。htmlentities()
またはを使用してリソースを無駄にする必要はありませんhtmlspeicalchars()
。
いいえ、
1) 準備済みステートメントは SQL インジェクションの解決策ではありません。ほとんどの場合、プリペアド ステートメントは変数バインディングを意味するため、透過的なエスケープは SQL インジェクションを防ぐ効果的な方法です。
2) 入力をサニタイズしないでください -出力をサニタイズします。必ず入力を検証してください (たとえば、開始日が終了日よりも前になるようにします)。ただし、データの表現は、PHP コードを離れる時点でのみ変更する必要があります。HTML に直接書き込まれたデータをサニタイズする方法は、URL に書き込まれたデータをサニタイズする方法とは異なります。データをサニタイズして JavaScript 文字列変数に書き込む方法とは異なります。SQL ステートメントに挿入するためにデータをサニタイズする方法とは異なります。モデムに送信する前にデータをサニタイズする方法とは異なります...
...何をする?データのすべての可能な表現を作成しますか? データの普遍的な表現を作成しますか?
C.