Laravelのクロスサイトスクリプティング対策
Controller側で対策する
Laravelでは他のPHPフレームワークと同様に悪意あるスクリプトを無害化(サニタイズ)する機能が備わっています。
フォームからJavaScriptのコードが送信されたとします。
<script>alert('XSS!')</script>
Laravelの
e()
を利用してJavaScriptのコードを無害化することが出来ます。
$textarea = e(Input::get('textarea'));
$textareaをデータベースにinsertすると無害化された状態でデータが挿入されます。
<script>alert('XSS!')</script>
e()で無害化していない場合はjsのままデータが挿入されるため、Viewで出力した際に、javascriptコードは実行されます。
View側で対策する
エスケープタグ
View側で出力する際にjsを無害化することも可能で、Bladeテンプレートのエスケープタグを使います。
{{{ }}}
実際には以下のように利用します。
<td>{{{$data->textarea}}}</td>
上のエスケープタグを使えば、仮にデータベース上に実行可能なjavascriptコードが保存されていたとしてもView側で出力する前に無害化することが出来ます。
エスケープタグの変更
Bladeテンプレートのエスケープタグは変更することが可能です。変更するためには、
Blade::setEscapedContentTags()
を利用して変更します。
app/start/global.php
に下のコードを追記します。
Blade::setContentTags('{{', '}}'); Blade::setEscapedContentTags('[{{', '}}]');
この変更により以下のエスケープタグでXSS対策を行うことが可能になります。
[{{ }}]