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()
会输出
<custID> & <invoice#>
到信息流。
请注意,使用 <%:
和 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>
供浏览器解释。
只是一个简短的问题,我被要求检查 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()
会输出
<custID> & <invoice#>
到信息流。
请注意,使用 <%:
和 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>
供浏览器解释。