我需要一种方法:
允许用户仅使用<strong>
和<p>
标记。
以避免用户将CSS与这些标记一起使用(例如,这不能起作用:<p style="margin:1000px;"> hello </p>
)。
以避免使用XSS。
htmlspecialchars
是不够的,因为它会转换html实体中的所有代码。
strip_tag
是不够的,因为它允许标签中包含CSS。
那么我可以使用哪些PHP函数来执行此操作?
我不希望使用像html净化器这样的外部库。
答案 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/
ķ。