JSONPセキュリティ対策ソリューションの新たな構想

6184 ワード

jsonpセキュリティ予防は、以下の点に分けられます.
1、calbackパラメータが意外にjsコードを遮断することを防止し、特殊文字のシングルクォーテーションマークのダブルクォーテーションマーク、改行符にはリスクがあります.
2、calbackパラメータがscriptなどの悪意のあるタグを追加し、XSSの脆弱性を防ぐ.
3、ドメイン横断要求の濫用を防止し、不法サイトの悪用を防止する.
第三の点に対して、我々はソースreferホワイトリストのマッチングとcookie Tokenメカニズムによって制限することができます.
前の2つのポイントは、伝統的なやり方には以下のような種類があります.
1、特殊な文字を手作業でフィルタし、カギカッコなどを使って、潜在的な悪意のある文字を見つけたら、サーバーから拒否され、エラーを返します.この方式は比較的厳格であるが、それに伴う問題である.
失敗率は向上します.特に対外開発者に対して.また、JSでは悪意のある文字の変形が非常に多く、この方法ではすべての不正な文字を列挙する必要があり、見落としがある可能性があります.私たち
潜在的な悪意のある文字をすべて遮断してはいけません.確かに一部の必要性がありますので、これらの文字を入力して保存してください.
2、calbackパラメータに対して厳正なフォーマット検査を行い、または指定されたフォーマットを強制的に約束します.基本的には安全問題は徹底的に解決できますが、同じようにコール端子は完全に透明ではなく、使用します.
関連の制限と約束を追加的に知る必要があり、必要でないコミュニケーションコストを引き起こす可能性があります.
3、パッケージに戻ってheaderヘッドを追加し、MIMEタイプを強制的に指定し、HTML方式で解析し、XSSホールを防止する.これは完璧な解決策のようです.でも、とても怪しいです
また、いくつかのバージョンのファイアフォックスブラウザで直接にMIMEタイプをJAVALSCRIPTにアクセスする場合、ブラウザはHTMLに従って解析されます.このブラウザのデザインかもしれません.
欠陥がありますが、私たちが設定したheaderを無視しました.すべてのブラウザが厳密にMIMEタイプによる解析を保証することができません.
私達の注目点はずっとユーザーの入力を制限することにありますが、別のレベルからこの問題を考えてください.
まずJS自身の特性を調べます.
JSONPの本質はグローバル・コールバック関数を構成し、その後スクリプトタグをロードしてコールバック関数を起動することです.
私たちは通常関数を使ってこのように書くことができます.
function test(){}test();
全体の関数では、デフォルトはwindowのメンバーです.表示することもできます.
window.test = function(){};window.test();
JSのオブジェクトのメンバーは文字列索引を使用してアクセスできます.
window['test']=function(){};window['test']();
今注意しましたか?このようにして、私達はすでに関数名を文字列の文脈に完全に制限しました.理論的に注入防止の仕事をしている限り、calbackパラメータは文字列の上下から飛び出すことができません.
文が意外にコードを実行するものです.PHPを例にとると、シングル文字列の注入防止はJson_を直接使用することもできます.encodeこの文字列は実装されます.
window['alert("123");abc']();
上記のcalbackパラメータは注入のリスクがありますが、calbackパラメータは文字列内部に厳密に制限されていますので、テキストとしてだけ使えます.
しかし、まだxssホールの問題があります.
次の例を見てください
window['alert(123);']();
私達は引用符の内部に厳密に制限されていますが、js注入にはならないと保証していますが、直接ブラウザにこのjsonp要求を入力してもHTML解析に従って、XSS<が発生します.p>
<span style="カラー:rgb(51,51,51);font-family:'宋体';font-size:14 px;"抜け穴は、headerを設置しても防ぎにくいです.ボルトspant;
<p>lt;span style="font-size:14 px">lt;span style="text-indent:28 px">lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;bragt;lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;spant>ボルトspant;さらに、ブラウザ内にテキストが表示されないようにする必要があります.gt;ラベルであれば、問題は徹底的に解決することができます.ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトp>
<p>lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px";基本的な考え方はサービスの中で一回のurlencodeをすることです.一方、Outputでは、デコデコルミポーネントを出力して、尖った括弧を表示するのを回避します.Urlencodeが過ぎた文字列は、アルファベットのみ可能です.spant>ボルトp>
<p>lt;span style="font-size:14 px">lt;span style="text-indent:28 px">lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px";数字%もついでに注入の問題も解決しました.spant>lt;bragt;ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトp>
<p>lt;span style="font-size:14 px">lt;span style="text-indent:28 px">lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51);font-family:'宋体;text-indent:28 px;>lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;span style="カラー:rgb(51,51,51,51);font-family:'宋体';font-size:14 px;text-indent:28 px">lt;spant>ボルトspant;最後に短いコードを添付します.jsonpの安全問題を根本的に解決します.spant>lt;bragt;ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトp>
<p>lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="text-indent:28 px">lt;span style="font-size:14 px">ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトspant>ボルトp>
<pregt;lt;code class=「langage-javascript」&ボルトphp header('Content-type:text/javascript')この文を加えるとchromeの警告を解除できます.calback=urlencode($u GET['calback]);echo「window[decodeURIComponent]」({calback})({ret:0,msg:'OK})///.codet>ボルトpregt;
<bragt;
<p style="border-width:0 px;list-style:none;>lt;span style=「font-size:14 px;」gt;要求1:http://www.test.com/a.php?callback=alert(123)abc</spant>ボルトp>
<p style="border-width:0 px;list-style:none;>lt;span style=「font-size:14 px;」gt;応答1:window[decodeURIComponent]({ret:0,msg:'OK');&ボルトspant>ボルトp>
<p style="border-width:0 px;list-style:none;>lt;span style=「font-size:14 px;」gt;要求2:http://www.test.com/a.php?callback=<スクリプト>alert(123);
応答2:window[decodeURIComponent('%3 Cscript%3 Ealert(123)%3 B%2 Fscript%3 E')({ret:0,msg:'OK')
上記のいくつかの例は、Jsonpセキュリティ・ホールが完全に回避されていることを証明しています.注入を試みる悪意のあるパラメータがあっても、プログラムが完全に正常に動作していることを最大限に保証します.