web-dev-qa-db-ja.com

XSS攻撃をブロックするには、<と>をエスケープするだけで十分ですか?

この質問に対する答えは「いいえ」だと確信していますが、<>&lt;&gt;に単純に変換する方法を見つけることができないようです。反映された永続的なXSSを完全にブロックしません。

CSRFについて話しているのではありません。

これがXSSをブロックしない場合、この防御を回避する方法の例を提供できますか?

14
M. Biolic

属性で信頼できない文字列("で引用)を使用する場合は、"&quotとしてエスケープする必要があります。

そうでなければ、JavaScriptを簡単に挿入できます。たとえば、<a href="{{str}}">strは、たとえば" onmouseover='something-evil'"です。

7
ThiefMaster

データが挿入されている場所に応じて、すべてのXSS攻撃に<または>が含まれるわけではありません。

https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#Why_Can.27t_I_Just_HTML_Entity_Encode_Untrusted_Data.3F

10
Brent Friar

いいえ。<>'"、および&をエスケープするだけでは不十分な例をいくつか示します。

例1:

<a href="{{myUrl}}">

XSS攻撃:

myUrl = "javascript:alert(1)"

例2:

<script>var page = {{myVar}};</script>

XSS攻撃:

myVar = "1;alert(1)"

これらの攻撃を防ぐ方法については、 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet を参照してください。

5
priomsrb

いいえ、それだけでは不十分です。 XSSは、HTMLの信頼できないデータだけでなく、JavaScriptやCSSにも含まれていることを忘れないでください。 「varmyVar = [input];」のような状況を考えてみてください。その[入力]値を使用して、山かっこに近づくことなく、あらゆる種類の悪意のあることができます。 XSSチートシートにはさらに多くの例があります: http://ha.ckers.org/xss.html

タグでASP.NETについて言及しました。あなたが見たいのは[AntiXSS library][1]。これを取得し、適切な出力エンコーディングを使用します。

Encoder.CssEncode()
Encoder.HtmlEncode()
Encoder.HtmlAttributeEncode()
Encoder.JavaScriptEncode()

などなど。NETで独自の文字置換を試みる理由はまったくありません。

3
Troy Hunt