htmltextwriter 和跨站点脚本

htmltextwriter and cross site scripting

只是一个简短的问题,我被要求检查 vb 应用程序并修复所有可能发生跨站点脚本的地方。我将 <%= 更改为 <%: 并且他们在代码中将 html 放在一起的所有地方并注入了一个字符串,我相应地更改为 server.htmlencode 或 server.urlencode。我的问题是有时他们使用 htmlwriter。我假设如果他们使用 htmlwriter 我不需要担心跨站点脚本,因为 writer 会自动编码任何字符串。对吗?

遗憾的是,它并不能保护您免受跨站点脚本的攻击我制作了一个 aspx 页面并在后面的代码中放置了

 protected void Page_Load(object sender, EventArgs e)
    {
        StringWriter stringWriter = new StringWriter();
        using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter)) {
            writer.RenderBeginTag(HtmlTextWriterTag.Label);
            writer.Write(
            " < script > alert('.Net and the Terrible, Horrible, No Good, Very Bad Script');</ script > ");                   
            writer.RenderEndTag();
        }
        Response.Write(stringWriter);
    }

我 运行 页面和 javascript 警报弹出,所以我猜 htmltextwriter 不能保护您免受跨站点脚本攻击

是的,它确实可以在写入 HTML 文档时保护您免受 XSS 攻击,但是必须使用 HtmlTextWriter.WriteEncodedText 方法。

' Assign a value to a string variable, 
' encode it, and write it to a page.
colHeads = "<custID> & <invoice#>" 
writer.WriteEncodedText(colHeads)
writer.WriteBreak()

会输出

&lt;custID&gt; &amp; &lt;invoice#&gt;

到信息流。

请注意,使用 <%:WriteEncodedText 仅适用于输出到 HTML 上下文。当输出到 JavaScript:

时,它们应该 而不是
<script>
var myVariable = '<%: thisIsWrong %>';
</script>

在这种情况下,应该使用 (带有 <%= %> 括号以防止不正确的 HTML 编码)。此函数还可以正确编码特殊字符,因此如果要在脚本标记中呈现 </script> 以试图关闭准备好进行 XSS 攻击的 HTML 脚本标记,它将呈现为:

\u003c/script\u003e

这是 JavaScript 的正确编码,可以将其理解为 </script>,但浏览器不会将其解释为文字结束脚本标记。一些天真编写的 JavaScript 编码例程不会转换它,因为该序列不包含 \"' 字符。我只是想为其他发现此问题的人提及防止 XSS 的一些细微差别 post.

如果您不能确保关闭脚本标签没有被渲染,那么像这样的攻击是可能的

</script><script>alert(1)</script>

在浏览器中呈现为

<script type="text/javascript">

alert('</script><script>alert(1)</script>');

</script>

浏览器将解释以 alert('</script> 结尾的脚本标签,并简单地执行新脚本标签中的内容。

使用 JavaScriptStringEncode 函数这是安全的,因为它呈现为:

<script type="text/javascript">

alert('\u003c/script\u003e\u003cscript\u003ealert(1)\u003c/script\u003e');

</script>

其中不包含 </script> 供浏览器解释。