リリース前に必要なセキュリティ対策

SQLインジェクション

  • バインド変数を利用する

 

domによる表示箇所のxss対策

  • jqueryの「text」関数を使って作る → 勝手にエスケープしてくれる

    http://d.hatena.ne.jp/ockeghem/20110905/p1

    例1 $("#name").text(res); 文字列の入力(resがユーザー入力値の場合)

    例2 $("<td>").text(res);   要素の入力(resがdomの場合)

 

  • PHPjson_encode関数を使ってjsonを作る → 勝手にエスケープしてくれる

    上記関数を使わない場合は、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などはこれを使っている)

   ※ただし、jQueryJavascriptライブラリの機能と競合する可能性がある

 

  • 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

 

  • パラメータをエスケープしてから設定する