【问题标题】:New Way To Prevent XSS Attacks防止 XSS 攻击的新方法
【发布时间】:2013-03-28 10:16:11
【问题描述】:

我有一个与娱乐相关的网站。所以,我想到了用一种新的方法来防止 XSS 攻击。我创建了以下单词列表

alert(, javascript, <script>,<script,vbscript,<layer>,
<layer,scriptalert,HTTP-EQUIV,mocha:,<object>,<object,
AllowScriptAccess,text/javascript,<link>, <link,<?php, <?import,

我认为因为我的网站与娱乐有关,所以我不希望普通用户(恶意用户除外)在他的评论中使用这种词。所以,我决定从用户提交的字符串中删除所有上述逗号分隔的单词。我需要你的建议。这样做后我不需要使用类似 htmlpurifier 的工具吗?

注意:我没有使用 htmlspecialchars(),因为它还会转换从我的富文本编辑器 (CKEditor) 生成的标签,因此用户格式化将消失。

【问题讨论】:

  • 请不要使用这个。简单的规避方法: 还有很多其他方法。
  • 我投票决定将此问题作为离题结束,因为它要求进行代码审查(因此这太宽泛/基于意见)。它可能会被调整为the code review stackexchange 的主题。

标签: php security xss


【解决方案1】:

使用黑名单是个坏主意,因为它很容易规避。例如,您正在检查并可能删除&lt;script&gt;。为了规避这种情况,恶意用户可以输入:

<scri<script>pt> 

您的代码将去掉中间的&lt;script&gt;,而将外部的&lt;script&gt; 原封不动并保存到页面中。

如果您需要输入 HTML 而您的用户不需要,请阻止他们输入 HTML。您需要有一个单独的方法,只有您可以访问,才能输入带有 HTML 的文章。

【讨论】:

    【解决方案2】:

    这种方法误解了 HTML 注入问题是什么,而且完全无效。

    与上面的列表相比,将脚本放入 HTML 中的方法有很多,很多,还有很多方法可以通过使用转义形式来规避过滤器。您将永远无法通过这种幼稚的序列黑名单捕获所有潜在的“有害”构造,并且如果您尝试使用真正的 cmets,您将给用户带来不便。 (例如禁止使用以on...开头的词)

    防止HTML注入型XSS的正确方法是:

    • 在输出应该是普通文本(绝大多数内容)的内容时使用htmlspecialchars()

    • 如果您需要允许用户提供的 HTML 标记,请将您希望允许的无害标签和属性列入白名单,并使用 HTMLPurifier 或其他类似库强制执行。

    这是编写 Web 应用程序的标准且易于理解的部分,实施起来并不困难。

    【讨论】:

      【解决方案3】:

      为什么不只创建一个函数来恢复htmlspecialchars() 对您希望可用的特定标签所做的更改,例如&lt;b&gt;&lt;i&gt;&lt;a&gt; 等?

      【讨论】:

        【解决方案4】:

        除了绕过您的列表的黑客之外,使用白名单总是比使用黑名单更好。

        在这种情况下,您已经有了想要支持的标签的明确列表,因此只需使用一些 HTML 净化器将 &lt;em&gt;&lt;b&gt; 等标签列入白名单。

        【讨论】:

          【解决方案5】:

          你可以试试

          htmlentities()

          echo htmlentities("<b>test word</b>");
          
          ouput: &lt;b&gt;test word&lt;/b&gt;gt;
          

          strip_tags()

          echo strip_tags("<b>test word</b>");
          
          ouput: test word
          

          mysql_real_escape_string()

          或者尝试一个简单的函数

          function clean_string($str) {
            if (!get_magic_quotes_gpc()) {
              $str = addslashes($str);
            }
            $str = strip_tags(htmlspecialchars($str));
            return $str;
          }
          

          【讨论】:

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