XSS(クロスサイトスクリプティング)の基本的な対策は何をすればいいのかがぼんやりしている方向けの書いています。
対策方法はタイトルの通り、XSS(クロスサイトスクリプティング)対策の基本は入力値制限とサニタイジング(スクリプトの無害化)です。
入力値制限
POST/GET送信する入力フィールドの値を制限することで、スクリプト入力ができないようにする対策です。
・数値のみ
・文字数制限
・記号の不許可
によって制限することができます。
サニタイジング(スクリプトの無害化)
画面への表示時にスクリプトが埋め込まれている場合に、タグ等をエスケープして文字列として扱うことで、スクリプトが実行されないようにする対策です。
これは、htmlspecialchars関数で実装します。
例)
1 2 3 |
<?php echo htmlspecialchars($Message, ENT_QUOTES); ?> |
入力値制限されているのに、なぜスクリプトが埋め込まれる可能性があるのか?
それは、すべての入力フィールドで上記すべての入力値制限を設定できないケースでは入り込む余地があります。
例えば、ブログ記事の本文は数値と記号も入りますし、文字数が数文字程度に制限はできません。
ではすべての項目にhtmlspecialchars関数を設定しないといけないのかというとそうでもないです。
htmlspecialcharsは文字数が多いため、ラッパー関数として以下のようにすることが一般的です。
※ラッパーとはラップ(包み込む)の人称形です。
1 2 3 4 5 6 |
function h($str) { return htmlspecialchars($str, ENT_QUOTES, 'UTF-8') } |
Laravel(PHPフレームワーク)では、{{}}と変数を囲むだけでエスケープ処理されます。
1 2 3 |
{{ $msg }} |
まとめ
・入力値制限でスクリプトが入力される可能性を排除する。
・htmlspecialchars関数でスクリプトの実行を無害化できる。
・htmlspecialchars関数はラッパー関数にして使用することが一般的である。
・Laravelフレームワークでは{{}}でエスケープ可能である。