使用PHP从html输入中删除某些标记

时间:2016-07-20 04:19:55

标签: php html parsing dom sanitization

我有一个表单,用户可以使用html设置自己的输入样式。我想用PHP清理服务器端的输入。但是,我想确保所有输入都是安全的,并且与我希望的相匹配。我已经有了XSS保护,所以不是要删除脚本。

当用户提供输入时,我想删除pimgahrbr,{{1}以外的标记},tbodytrtdpreulolli(基本上所有文字格式除外)申报单)。我想删除span的{​​{1}}以外的所有属性,href的{​​{1}}和<a>的{​​{1}}。对于src样式,我只想保留以下属性:

  • <img>
  • style
  • <p>
  • <p>
  • 开头的任何内容

此外,我希望能够将文本裁剪为一定长度,同时保留结束标记并确保每个开始标记也有一个结束标记。

例如,Stack Overflow编辑器如何在保存并将其显示给用户之前解析并清理输入?

感谢。

1 个答案:

答案 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);