3

我在我的网站中使用 CKEditor 让用户发表他们的评论。CKEditor 有很多按钮来撰写评论。假设如果用户将他的评论设为粗体和斜体,例如

This is comment

CKEditor 将输出以下 html

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

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

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

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

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

我怎样才能实现这两个目的(1)。保留用户格式 (2)。同时保护 HTML 内容

4

5 回答 5

4

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

这是一项艰巨的工作,无法使用一些简单的正则表达式或strip_tags(即使它确实满足您的需求,这也不是 XSS 的适当解决方案)。建议您使用现有的库来执行此操作 - HTML Purifier就是用于 PHP 的库。

于 2013-03-25T13:38:10.980 回答
1

strip_tags函数具有允许或禁止标签的选项。使用 php.net 获取有关条形标签的更多参考。您必须去除不需要或不允许的标签。如果你不这样做,那么它也可能会被 javascripts 破坏。

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

于 2013-03-25T11:41:33.597 回答
1

我想你正在寻找strip_tags。它将从字符串中删除所有 html 和 php 标签,并且只允许给定的标签,如<strong><i>etc

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

strip_tags 的 php.net 文档

于 2013-03-25T11:56:14.253 回答
0

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

 function html_escape($raw_input)
        {
            return htmlspecialchars($raw_input, ENT_QUOTES | ENT_HTML401, 'UTF-8');     
        }
于 2013-07-02T06:51:17.873 回答
0

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

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

于 2013-03-25T11:29:49.953 回答