2

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

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

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

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

4

5 回答 5

4

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

<scri<script>pt> 

您的代码将去掉中间<script>部分,使外部<script>保持完整并保存到页面中。

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

于 2013-03-28T10:25:11.077 回答
3

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

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

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

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

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

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

于 2013-03-28T11:59:41.007 回答
2

为什么不创建一个功能来恢复对htmlspecialchars()您希望可用的特定标签所做的更改,例如<b><i><a>等?

于 2013-03-28T10:21:37.263 回答
1

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

在这种情况下,您已经有了想要支持的标签的清晰列表,因此只需使用一些 HTML 净化器将 、 等标签列入白<em>名单<b>

于 2013-03-28T10:20:59.917 回答
0

你可以试试

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;
}
于 2013-03-28T10:20:49.137 回答