我有一个与娱乐相关的网站。所以,我曾想过用一种新的方法来防止XSS攻击。我创建了以下单词列表
alert(, javascript, <script>,<script,vbscript,<layer>,
<layer,scriptalert,HTTP-EQUIV,mocha:,<object>,<object,
AllowScriptAccess,text/javascript,<link>, <link,<?php, <?import,
我原以为是因为我的网站与娱乐有关,所以我不希望普通用户(恶意用户除外)在评论中使用这类词语。所以,我决定从用户提交的字符串中删除所有上述逗号分隔的单词。我需要你的建议。这样做之后我不需要像工具一样使用htmlpurifier吗?
注意:我没有使用htmlspecialchars(),因为它还会转换我的富文本编辑器(CKEditor)生成的标签,因此用户格式化将会消失。
答案 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: <b>test word</b>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;
}