防止XSS攻击的新方法

时间:2013-03-28 10:16:12

标签: php security xss

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

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

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

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

5 个答案:

答案 0 :(得分:4)

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

<scri<script>pt> 

您的代码将删除中间<script>,保留外部<script>并保存到页面。

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

答案 1 :(得分:3)

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

有许多许多将HTML中的脚本放入上述列表的方法,以及许多使用转义表单来规避过滤器的方法。你永远不会用这种天真的序列黑名单来捕捉所有潜在的“有害”结构,如果你尝试,你会给用户带来真正的评论带来的不便。 (例如,禁止使用以on开头的单词...)

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

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

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

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

答案 2 :(得分:2)

为什么不制作一个功能来恢复为您想要提供的特定代码所做的更改htmlspecialchars(),例如<b><i><a>等?

答案 3 :(得分:1)

除了躲避你的清单之外,使用白名单而不是黑名单总是更好。

在这种情况下,您已经拥有了一个明确的要支持的标记列表,因此只需使用一些HTML净化器将<em><b>等白名单标记。

答案 4 :(得分:0)

你可以试试

<强>ヶ辆()

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;
}