如何避免使用XSS和CSS但允许用户使用某些HTML标记?

时间:2013-05-07 11:29:09

标签: php security xss

我需要一种方法:

  1. 允许用户仅使用<strong><p>标记。

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

  3. 以避免使用XSS。

    • htmlspecialchars是不够的,因为它会转换html实体中的所有代码。

    • strip_tag是不够的,因为它允许标签中包含CSS。

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

    不希望使用像html净化器这样的外部库。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

网络采用MarkDown语言等解决方案,正是出于这些目的。

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

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

ķ。