1

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

4

2 回答 2

3

是的,在写入 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;

到溪流。

请注意,使用<%:andWriteEncodedText仅适用于输出到 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>供浏览器解释的内容。

于 2015-02-25T10:27:03.743 回答
0

只是尝试过,遗憾的是它并不能保护您免受跨站点脚本的影响我制作了一个 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

于 2015-02-25T00:54:10.797 回答