2016-09-03 4 views
-1

のための完全に安全私の方法です。私の方法は何かを説明しましょう。は、私はチャットのウェブサイトを持っていると私はそれがXSSが安全であるかどうかを知りたいXSS

私は、AJAX要求から着信されている画面に新しいメッセージを追加するには、このjQueryのコードを使用します。

$("#message").prepend(req.msg); 

私はこれが脆弱であるが、DB上のメッセージがエンコードされている知っています。エンコードされたよう

<text>TEST</test> 

それはデータベースに保存されている:私はそのペイロードメッセージの送信時にそう

&lt;text&gt;TEST&lt;/test&gt; 

を私はthis答えで.htmlentitiesをバイパスしているシナリオ()関数を知っています。まもなく:私たちは、このHTMLコードにa onclick=alert(document.cookie)入力を送信する場合

<input value=<%= HtmlEncode(somevar) %> id=textbox> 

は、それはなります:

<input value=a onclick=alert(document.cookie) id=textbox> 

だから、このシナリオでは、エンコーディング < > ; &文字が私たちを救うことはできません。しかし、私はこのようなコードを書いていないので、私はその脆弱性から安全だと思う。私のサーバは次のようなJSONを返します:

..."msg" : "<tr><td><b>user:<\b> &lt;text&gt;TEST&lt;/test&gt;<\td><\tr>",... 

そして、私は直接msgをデータに追加します。私はこれが完全に安全だと思う。ハッカーはXSSに< > ; &文字を使用する必要があります。 \\\とエンコードしています。しかし、多分私は何かを逃している。それは完全に安全ですか?

+1

私はデータベースにHTMLエスケープされたデータを格納しません。HTMLパーサの代わりにテキストパーサを使用してページに挿入するだけです。そして、すべての属性値を引用符で囲み、挿入された内容の引用符をエスケープします。 – Oriol

+0

申し訳ありませんが、あなたは何をページに「挿入」しますか?エスケープされていないメッセージを保存し、印刷前に実行時にエスケープすることをお勧めしますか?それは何か変わるのだろうか? – Unhappy

+0

例えば、 '$(" message#).prepend(document.createTextNode(req.msg)); 'req.msg'をHTMLとして解析するのではなく、テキストノードの前に追加します。 – Oriol

答えて

1

号はそうではありません。データの転送方法によって、エスケープされていないHTMLタグを誰かが入力できるようになります。 htmlencodeが脱出するためには何もありませんので、これは、そのままデータベースに入力されます

\u003cscript\u003ealert(1)\u003c/script\u003e 

:誰かがこのペイロードを掲載することを言います。しかし、それはJSONに入れ、JSONはを解析され、それはこのなっ言われています:

<script>alert(1)</script> 

や悪質なコードを実行します。より良い解決策は、JSONの生データをエンコードし、HTMLエスケープメントメカニズムをクライアント側で使用することです。

JSONでサーバ側エスケープ\を使用すると、完全に安全だと思います。

+0

あなたは何かを見逃しました。私は "\"を "\\"にエンコードします。サーバーのデータは '\\ u003cscript \\ u003ealert(1)\\ u003c/script \\ u003e'です。 – Unhappy

+0

あなたはそれを一度も言及しませんでした。 – RamenChef

関連する問題