【问题标题】:XSS attack preventionXSS攻击防范
【发布时间】:2011-02-16 10:00:35
【问题描述】:

我正在开发一个网络应用程序,用户可以在其中响应博客条目。这是一个安全问题,因为他们可以发送将呈现给其他用户(并由 javascript 执行)的危险数据。

他们无法格式化他们发送的文本。没有“粗体”,没有颜色,没有任何东西。只是简单的文字。 我想出了这个正则表达式来解决我的问题:

[^\\w\\s.?!()]

因此,任何不是单词字符(aZ、AZ、0-9)、不是空格、“.”、“?”、“!”、“(”或“)”的内容都将被替换为空字符细绳。比每个引号都替换为:“&quot”。

我在前端检查数据,然后在我的服务器上检查。

有没有人可以绕过这个“解决方案”?

我想知道 StackOverflow 是如何做到这一点的?这里有很多格式,所以他们必须好好处理它。

【问题讨论】:

  • 你的服务器端语言是什么?
  • 你没说<>,这可能是xss中最重要的字符...

标签: java javascript security xss


【解决方案1】:

如果您只想要简单的文本不必担心过滤特定的 html 标记。您想要与 PHP 的 htmlspecialchars() 等效。使用它的一个好方法是print htmlspecialchars($var,ENT_QUOTES); 这个函数将执行以下编码:

'&' (ampersand) becomes '&'
'"' (double quote) becomes '"' when ENT_NOQUOTES is not set.
''' (single quote) becomes ''' only when ENT_QUOTES is set.
'<' (less than) becomes '&lt;'
'>' (greater than) becomes '&gt;'

这是在最低级别解决 XSS 的问题,您不需要一些您不理解的复杂库/正则表达式(并且可能是不安全的,毕竟复杂性是安全的敌人)。

确保通过运行free xss scanner测试您的 XSS 过滤器

【讨论】:

    【解决方案2】:

    我同意 Tomalak 的观点,只是想补充几点。

    1. 不允许使用 HTML 标记。这个想法是将用户输入视为文本,并在呈现它们之前将其视为 html 转义字符。为此目的使用OWASP's ESAPI 项目。 This page explains the various possible encodings 你应该知道。
    2. 如果您必须允许 HTML 标记,请使用库为您进行过滤。不要编写自己的正则表达式;他们很难做对。使用 OWASP's Anti-Samy project - 它是专门为这个用例设计的。

    【讨论】:

      【解决方案3】:

      我建议阅读the XSS Prevention Cheat Sheet,其中详细介绍了避免 XSS 攻击的最佳实践。 本质上,您需要过滤的内容取决于使用它的上下文。

      例如,在这种情况下:

      <body>...ESCAPE UNTRUSTED DATA BEFORE PUTTING HERE...</body>
      

      你需要做的:

      & --> &amp;
      < --> &lt;
      > --> &gt;
      " --> &quot;
      ' --> &#x27;     &apos; is not recommended
      / --> &#x2F;     forward slash is included as it helps end an HTML entity
      

      而对于href="" 示例,您需要做一个urlscape:

      “除字母数字字符外,使用%HH转义格式转义所有ASCII值小于256的字符。在数据中包含不受信任的数据:不应允许URL,因为没有好的方法可以通过转义来禁用攻击以防止切换出 URL。所有属性都应该被引用。未引用的属性可以用许多字符分开,包括 [space] % * + , - / ; ^ 和 |。请注意,实体编码在这种情况下是无用的。 "

      虽然引用的文章给出了完整的结论,但希望此答案中有足够的信息可以帮助您入门。

      【讨论】:

        【解决方案4】:
        1. 不允许使用 HTML 标记。
        2. 不要输出用户输入的任何内容,而无需先进行 HTML 转义。这是更重要的一点!这样做,您将永远不会遇到 XSS 问题。
        3. 提供预览功能,让用户可以在发布前看到它的样子。

        如果您必须允许 HTML 标签,请定义白名单并检查用户输入。您甚至可以为此使用正则表达式。

        假设您允许&lt;p&gt;&lt;a href="..."&gt;&lt;img src="..."&gt;

        1. 在用户字符串中查找与&lt;\S[^&gt;]*&gt;匹配的所有内容
        2. 对于每场比赛,对照&lt;(p|a href="[^"]+"|img src="[^"]+")/?&gt;|&lt;/(a|p)&gt;检查
        3. 如果它不符合严格的正则表达式,请将其丢弃。
        4. 参见上面的第 2 点。
        5. 努力故意破坏您的系统。请其他人尝试破坏您的系统。

        【讨论】:

          【解决方案5】:

          可以使用 Fiddler 绕过前端,例如通过附加表单信息。 在后端使用 html 编码,例如 = <a>

          这样文本将显示为文本而不是 html 元素。

          【讨论】:

            【解决方案6】:

            首先删除所有错误的字符序列,例如UTF-8 过长,Unicode 无效。

            您需要更明确地说明 是被剥离还是变成实体。

            您还需要去除或编码双 单引号,否则攻击者可以在您未预料到的地方添加内在事件,例如'>

            如果您真的想允许 HTML 的某些子集,请小心尝试使用正则表达式解析它,尤其是您自己想出的那些,例如浏览器将呈现棘手的标签&lt;a b="&gt;"onMouseOver=alert(42)&gt; 就好了,正则表达式可能不匹配。查看前面提到的Anti-Samy

            如果您允许 HTML 标记具有 hrefsrc 属性,请确保它们指向 http(s): 方案,而不是 javascript: 方案。

            【讨论】:

              猜你喜欢
              • 2022-01-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-08
              • 2023-03-04
              相关资源
              最近更新 更多