【发布时间】:2015-02-24 19:03:04
【问题描述】:
只是一个简单的问题,我被要求通过一个 vb 应用程序并修复所有可能发生跨站点脚本的地方。我将
【问题讨论】:
标签: asp.net vb.net webforms xss htmlwriter
只是一个简单的问题,我被要求通过一个 vb 应用程序并修复所有可能发生跨站点脚本的地方。我将
【问题讨论】:
标签: asp.net vb.net webforms xss htmlwriter
是的,在写入 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()
会输出
<custID> & <invoice#>
到流。
请注意,使用 <%: 和 WriteEncodedText 仅适用于输出到 HTML 上下文。在输出到 JavaScript 时应该不使用它们:
<script>
var myVariable = '<%: thisIsWrong %>';
</script>
在这种情况下,应该使用HttpUtility.JavaScriptStringEncode(使用<%= %> 括号来防止HTML 编码错误)。此函数还正确编码特殊字符,因此如果 </script> 被呈现在脚本标签中以尝试关闭 HTML 脚本标签以准备 XSS 攻击,它将被呈现为:
\u003c/script\u003e
这是 JavaScript 将其理解为 </script> 的正确编码,但浏览器不会将其解释为文字结束脚本标记。一些幼稚编写的 JavaScript 编码例程不会转换它,因为该序列不包含 \、" 或 ' 字符。我只是想为其他找到这篇文章的人提及一些防止 XSS 的细微差别。
如果你不确定关闭脚本标签没有被渲染,那么这样的攻击是可能的
</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>。
【讨论】:
不幸的是,它并不能保护您免受跨站点脚本的侵害。我创建了一个 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 不能保护您免受跨站点 scipting 的影响
【讨论】: