【问题标题】:Cross site scripting possibility?跨站点脚本的可能性?
【发布时间】:2014-02-20 06:33:05
【问题描述】:

如果我通过这个值

return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)

到一个文本框,这是否暴露于 XSS?由于我是新手,谁能帮我解决这个问题?

【问题讨论】:

    标签: c# security xss


    【解决方案1】:

    一个好的起点是OWASP XSS Cheat Sheet

    基本上,XSS 是一个难题。如果您不需要在页面上允许 html,请不要。适当地编码您的输入。不要尝试手动过滤。这困难而且很容易出错。要么使用经过验证的库,要么阻止所有 html。

    【讨论】:

      【解决方案2】:

      从您的代码中不清楚您的 controlIdtypepost 变量来自何处。

      return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", controlId,type,post)
      

      除非它们是您自己设置的(例如type = "hidden";),否则您应该假设它们是不安全的(即使它们来自您自己的数据库)。现在不安全并不意味着本质上不安全,它意味着它们输出的上下文(在这种情况下为 HTML)是不安全的。

      例如如果他们在您的变量之一中输入" /&gt;&lt;script&gt;alert('foo');&lt;/script&gt;&lt;,则会导致 JavaScript 被执行。这是因为如果 post 发生更改,您的代码将在 HTML 中呈现以下内容:

      <input type="hidden" id="bar" post="True" type="hidden" value="" /><script>alert('foo');</script>"< />
      

      为了使它们对 HTML 安全,您必须使用 Server.HtmlEncode() 函数。您的代码的安全版本是:

      return String.Format(CultureInfo.InvariantCulture, "<input type=\"hidden\" id=\"{0}\" post=\"True\" type=\"{1}\" value=\"{2}\" />", Server.HtmlEncode(controlId), Server.HtmlEncode(type) , Server.HtmlEncode(post))
      

      这将防止任何人在任何变量中输入 " 字符并破坏您的 HTML 字符串(它将变为 &amp;quot; 并将由浏览器呈现为 ")。

      @Vineet Verma 的回答涉及Cross Site Request Forgery (XSRF),这与Cross Site Scripting (XSS) 完全不同。

      @akirilov 的回答建议对输入进行编码。在我看来这是错误的,因为只有在输出时输入才是不安全的。例如,输出到 JSON 需要与 HTML 完全不同的编码。这就是为什么您通常应该允许任何输入进入您的应用程序,但在输出时进行编码。查看XSS (Cross Site Scripting) Prevention Cheat Sheet 并在输出到不同上下文时遵循他们的指导方针。

      输入验证仅适用于您可以轻松验证的内容(例如社会保险号)。验证输入不包含有害的 JavaScript 代码要困难得多。这就是为什么最好在输出时进行编码,这将使您的应用程序免受XSS 的影响。

      【讨论】:

        【解决方案3】:

        甚至可以通过此代码伪造跨站点脚本。

        试试这个方法:

        1. 在页面中创建一个名为 say token 的隐藏变量。
        2. 将唯一且随机的值字符串传递给隐藏变量,并将该值存储在会话中。
        3. 对于到达服务器的每个请求,请检查会话中的值和令牌隐藏字段中的值是否相同。

        如果 session 和 token 中的值不同,则可能是 XSS 攻击。如果它们相同,则意味着您的反应很好。

        谷歌还有其他对策。

        【讨论】:

        • 您的答案似乎与 CSRF 保护有关,而不是 XSS
        猜你喜欢
        • 2014-01-27
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 2019-10-13
        • 1970-01-01
        相关资源
        最近更新 更多