2

我需要一个方法:

  1. 让用户使用 ONLY<strong><p>标签。

  2. 避免用户将 CSS 与这些标签一起使用(例如,这不能正常工作:)<p style="margin:1000px;"> hello </p>

  3. 避免 XSS。

    • htmlspecialchars还不够,因为它转换了 html 实体中的所有标签。

    • strip_tag是不够的,因为它允许在标签中使用 CSS。

那么我可以使用哪些 PHP 函数来执行此操作?

不想使用像 html purifier 这样的外部库。

4

3 回答 3

2

我能想到的最好的主意(在您需要的范围内)是使用自定义的文本字符串,<p>然后<strong>str_replace输出中使用 HTML 标记。这样他们就不能注入任何狡猾的东西。

您在写帖子时会在很多论坛网站上看到这一点,用户可以在其中单击段落和粗体图标,它将[p][/p]代替<p></p>. 然后在输出 str_replace [p]with<p>[/p]with </p>。如果他们放入任何自定义 CSS 或脚本,那么string_replace将会失败并且不会输出浏览器将呈现的任何 HTML。

于 2013-05-07T11:32:25.360 回答
2

您可以为这个非常有限的 HTML 子集编写自己的小词法分析器和解析器:

$input = '…';
$tokens = preg_split('~(</?(?:p|strong)\s*>)~', $input, -1, PREG_SPLIT_DELIM_CAPTURE);
var_dump($tokens);

foreach ($tokens as $i => &$token) {
    if ($i % 2 === 0) {
        // text
        $token = htmlspecialchars($token);
    } else {
        // tag
    }
}
$output = implode('', $tokens);
于 2013-05-07T18:42:42.473 回答
0

Web 采用了像 MarkDown 语言这样的解决方案,正是为了这些目的。

也许你应该在客户端实现一个 Markdown 编辑器,在服务器端实现一个 Markdown 解码器。从 XSS / CSS 的角度来看,它将允许您的用户格式化他们的文本但阻止它们。

http://daringfireball.net/projects/markdown/

K。

于 2013-05-07T20:29:10.907 回答