【问题标题】:htmltextwriter and cross site scriptinghtmltextwriter 和跨站点脚本
【发布时间】:2015-02-24 19:03:04
【问题描述】:

只是一个简单的问题,我被要求通过一个 vb 应用程序并修复所有可能发生跨站点脚本的地方。我将

【问题讨论】:

    标签: asp.net vb.net webforms xss htmlwriter


    【解决方案1】:

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

    到流。

    请注意,使用 &lt;%:WriteEncodedText 仅适用于输出到 HTML 上下文。在输出到 JavaScript 时应该使用它们:

    <script>
    var myVariable = '<%: thisIsWrong %>';
    </script>
    

    在这种情况下,应该使用HttpUtility.JavaScriptStringEncode(使用&lt;%= %&gt; 括号来防止HTML 编码错误)。此函数还正确编码特殊字符,因此如果 &lt;/script&gt; 被呈现在脚本标签中以尝试关闭 HTML 脚本标签以准备 XSS 攻击,它将被呈现为:

    \u003c/script\u003e
    

    这是 JavaScript 将其理解为 &lt;/script&gt; 的正确编码,但浏览器不会将其解释为文字结束脚本标记。一些幼稚编写的 JavaScript 编码例程不会转换它,因为该序列不包含 \"' 字符。我只是想为其他找到这篇文章的人提及一些防止 XSS 的细微差别。

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

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

    在浏览器中的呈现方式

    <script type="text/javascript">
    
    alert('</script><script>alert(1)</script>');
    
    </script>
    

    并且浏览器将解释以alert('&lt;/script&gt; 结尾的脚本标签并简单地执行新脚本标签中的内容。

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

    <script type="text/javascript">
    
    alert('\u003c/script\u003e\u003cscript\u003ealert(1)\u003c/script\u003e');
    
    </script>
    

    其中不包含供浏览器解释的&lt;/script&gt;

    【讨论】:

      【解决方案2】:

      不幸的是,它并不能保护您免受跨站点脚本的侵害。我创建了一个 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 的影响

      【讨论】:

      • 将 writer.Write 替换为 writer.WriteEncodedText 即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2014-01-27
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 2017-03-31
      相关资源
      最近更新 更多