如何保护通过CKEditor提交的数据

时间:2013-03-25 11:26:03

标签: php security ckeditor

我在我的网站中使用CKEditor让用户发表评论。 CKEditor有很多按钮来组成评论。假设用户将他的评论粗体和斜体这样的喜欢

This is comment

CKEditor将输出以下html

<i><strong>This is comment</strong></i>

现在,如果我将这个html存储在mysql数据库中并按原样输出到网页上,而不用htmlspecialchars()包装它,那么Comment将显示在页面粗体和斜体上,这就是我想要的。

但另一方面如果我用htmlspecialchars()包装评论并将其显示在网页上,它将显示为

<i><strong>This is comment</strong></i>

但是我不希望这样显示,我希望用户格式化。但是,如果我不用htmlspecialchars()包装它,它是有风险的,它可能导致XSS攻击和其他安全风险。

我如何实现这两个目的 (1)。保持用户格式 (2)。同时保护HTML内容

5 个答案:

答案 0 :(得分:4)

您需要绘制一个白名单,列出您希望用户包含哪些元素和属性(例如,允许<strong>但不允许<script>;允许<a href>但不允许{{1然后通过解析输入,删除所有不适合您的模式的元素和属性,并将结果序列化为HTML来强制执行它。

这是一项艰苦的工作,无法使用一些简单的正则表达式或<div onmouseover>(即使它确实符合您的需要,也不适合XSS)。建议您使用现有的库来执行此操作 - HTML Purifier就是PHP之类的。

答案 1 :(得分:1)

strip_tags函数具有允许或禁止标记的选项。使用php.net获取有关条带标记的更多参考。您必须删除不需要或不允许的标记。如果你不这样做,它也可能被javascripts所支持。

在您存储时使用htmlspecialchars并在显示时使用htmlspecialchars_decode。这将有助于您保持用户格式化内容的格式

答案 2 :(得分:1)

我认为您正在寻找strip_tags。它将从字符串中删除所有html和php标记,并仅允许给定标记,如<strong><i>

<?php 
$str = "<i><strong>this is a comment<strong></i><script>here is script</script>";
echo $str = strip_tags($str,"<i><strong>");
 ?>

php.net documentation for strip_tags

答案 3 :(得分:0)

有两种选择可供选择。首先,您可以删除所有HTML并使用BB代码解析器来允许用户发布BB标签,而不是HTML - http://php.net/manual/en/book.bbcode.php

其次,您可以删除除少数标签之外的所有HTML。我不知道任何个人解析器,但我之前已经在网站上看到它(墨菲定律我现在找不到)。您应该能够通过足够复杂的RegEx替换检查来实现这一目标。

答案 4 :(得分:0)

在将其打印回屏幕之前使用它:

 function html_escape($raw_input)
        {
            return htmlspecialchars($raw_input, ENT_QUOTES | ENT_HTML401, 'UTF-8');     
        }