我有一个表单,用户可以使用html设置自己的输入样式。我想用PHP清理服务器端的输入。但是,我想确保所有输入都是安全的,并且与我希望的相匹配。我已经有了XSS保护,所以不是要删除脚本。
当用户提供输入时,我想删除p
,img
,a
,hr
,br
,{{1}以外的标记},tbody
,tr
,td
,pre
,ul
,ol
和li
(基本上所有文字格式除外)申报单)。我想删除span
的{{1}}以外的所有属性,href
的{{1}}和<a>
的{{1}}。对于src
样式,我只想保留以下属性:
<img>
style
<p>
<p>
此外,我希望能够将文本裁剪为一定长度,同时保留结束标记并确保每个开始标记也有一个结束标记。
例如,Stack Overflow编辑器如何在保存并将其显示给用户之前解析并清理输入?
感谢。
答案 0 :(得分:2)
我使用http://htmlpurifier.org/来清理html-input。您可以定义允许的标记,属性和样式。我从我的项目中添加了代码作为示例。
$configuration = HTMLPurifier_Config::createDefault();
$configuration->set('Attr.EnableID', true);
$configuration->set('AutoFormat.RemoveEmpty', true);
$configuration->set('AutoFormat.RemoveEmpty.RemoveNbsp', true);
$configuration->set('HTML.AllowedAttributes', array('span.style', '*.id', '*.src', 'a.href', 'table.style', 'img.style', 'td.colspan', 'td.rowspan', 'td.style'));
$styles = array('margin-left', 'color', 'background-color', 'text-decoration', 'font-weight', 'font-style', 'border', 'border-collapse', 'height');
$configuration->set('CSS.AllowedProperties', $styles);
$htmlPurifier = new HTMLPurifier($configuration);
return $htmlPurifier->purify($html);