リリース前に必要なセキュリティ対策
SQLインジェクション
- バインド変数を利用する
- フレームワークを利用する(勝手にエスケープしてくれる)
domによる表示箇所のxss対策
- jqueryの「text」関数を使って作る → 勝手にエスケープしてくれる
http://d.hatena.ne.jp/ockeghem/20110905/p1
例1 $("#name").text(res); 文字列の入力(resがユーザー入力値の場合)
例2 $("<td>").text(res); 要素の入力(resがdomの場合)
上記関数を使わない場合は、evalインジェクション&引用符エスケープする
var res = eval("("+out+")");
→ jsonを囲んでいるブレースがブロックと解釈されるのを防ぐ
- ユーザーの入力値を$()に直接入れない
http://subtech.g.hatena.ne.jp/mala/20110624/1308881526
$('#'+res)にすると、$(function(){...}) や $("<p>")、属性など有害なコードを実行される恐れがある
$(location.hash) ← やりがちな悪い例
jsonの直接ブラウジング(表示)によるxss対策
- Content-Typeをapplication/jsonに設定する
ブラウザがhtmlとして処理できなければjsonに直接書いても実行できない
IEはコンテンツ内容で勝手にContent-typeが変わるので以下も追加する
「X-Content-Type-Options: nosniff」
- ブラウザからの直接リクエストをブロック
jqueryとかjsのプラグインでは以下のヘッダが自動で渡される
「X-Requested-With: XMLHttpRequest」ので、それをサーバー側でチェックする
if ($_SERVER['HTTP_X_REQUESTED_WITH'] !== 'XMLHttpRequest') {
die(json_encode(array('stat' => "参照不成功:不正な呼び出し")));
}
攻撃文字列を書き込めないようにする
- 特殊文字エスケープして返す
json_encodeのオプションパラメータを指定する
<?php
$a = array('x'=>'<>\'"&'); echo json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
【実行結果】 {"x":"\u003C\u003E\u0027\u0022\u0026"}
- HTMLエスケープをあらかじめしておく
JSONハイジャック対策
ソース上に置いてあるだけのオブジェクトを読みだす技術がある
最新のブラウザでは対策されているので問題はないけど、Androidがまずいらしい
- jsonデータをjavascriptとして実行できないようにする
jsonデータの先頭にwhile(1); などを書いて、script要素から呼ばれた場合
無限ループになるようにする(Gmailなどはこれを使っている)
※ただし、jQuery等Javascriptライブラリの機能と競合する可能性がある
- script要素からのリクエストにはレスポンスを返さないようにする
トークンあるいはリクエストヘッダX-Requested-Withを利用する
UTF-7と誤認させない
- X-Requested-Withヘッダのチェック
- 「+」記号もエスケープしておく
UTF-7と誤認させると、機密情報を漏洩させる手法の対策
オープンリダイレクタ
urlのパラメータでを悪用する
例1)https://example.jp/login.php?url=<罠サイトのURL> → 罠サイトにリダイレクト
例2)http://あなたのサイト.com?location=%0d%0d<script type=”text/javascript”>alert('悪用コード');</script> → 悪意あるコードをコンテンツで実行
2行以上改行すると、その先をレスポンスボディ(コンテンツ)として読み込む
http://viral-community.com/security/http-header-injection-1901/
- リダイレクト先のURLを内部で持ってパラメータはID指定にする
- ドメインチェックを厳重にする
http://into.cocolog-nifty.com/pulog/2013/11/post-66f9.html
- パラメータをエスケープしてから設定する