我在我的网站中使用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内容
答案 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>");
?>
答案 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');
}