我需要一个方法:
让用户使用 ONLY
<strong>和<p>标签。避免用户将 CSS 与这些标签一起使用(例如,这不能正常工作:)
<p style="margin:1000px;"> hello </p>。避免 XSS。
htmlspecialchars还不够,因为它转换了 html 实体中的所有标签。strip_tag是不够的,因为它允许在标签中使用 CSS。
那么我可以使用哪些 PHP 函数来执行此操作?
我不想使用像 html purifier 这样的外部库。
我能想到的最好的主意(在您需要的范围内)是使用自定义的文本字符串,<p>然后<strong>在str_replace输出中使用 HTML 标记。这样他们就不能注入任何狡猾的东西。
您在写帖子时会在很多论坛网站上看到这一点,用户可以在其中单击段落和粗体图标,它将[p][/p]代替<p></p>. 然后在输出 str_replace [p]with<p>和[/p]with </p>。如果他们放入任何自定义 CSS 或脚本,那么string_replace将会失败并且不会输出浏览器将呈现的任何 HTML。
您可以为这个非常有限的 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);
Web 采用了像 MarkDown 语言这样的解决方案,正是为了这些目的。
也许你应该在客户端实现一个 Markdown 编辑器,在服务器端实现一个 Markdown 解码器。从 XSS / CSS 的角度来看,它将允许您的用户格式化他们的文本但阻止它们。
http://daringfireball.net/projects/markdown/
K。