我正在一个论坛上,用户可以在那里输入自己的帖子(后来编辑它们),我需要他们的输入才能被正确地转义,保护,验证,......这似乎不是一件困难的事情。但是我一路上遇到了一些严重的问题。
我想我已经完成了内容转发,这是我使用HTMLPurifier的方式:
$content = Markdown::defaultTransform($_POST['content']);
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'UTF-8');
$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
$config->set('Cache.DefinitionImpl', null);
$config->set('HTML.Allowed', 'a[href|title],blockquote[cite],p,ul,li,strong,em,pre,code,img[src]');
$purifier = new HTMLPurifier($config);
$title = $purifier->purify($title);
$content = $purifier->purify($content);
输入是markdown,所以首先我将其转换为HTML然后我用HTMLPurifier净化HTML。
这是一个简单的部分,但是为帖子标题做同样的事情更难.. 通过这样做,我可以很容易地将标题输入插入到数据库中:
$title = htmlentities(preg_replace('!\s+!', ' ', trim($_POST['title'])), ENT_QUOTES);
这将处理单引号,双引号,<和>。
示例:test <"> test <'>
将转换为test <"> test <'>
。
然后我将新转换的字符串插入数据库。到目前为止,我认为我做的一切都还不错,但是一旦我的用户需要编辑帖子标题,我需要将其从数据库中输出并输入“text”。这是我搞砸的地方..
当我从数据库中获取字符串test <"> test <'>
并将其插入输入类型“text”的值时,它会正确显示,但如果我想像内容那样清除它"
和'
转回"
和'
..
当我不净化时,帖子标题是否仍然受xss注入保护?
还是有更好的/更简单的替代方法吗?
注意:我正在使用PDO,因此转义输入数据以防止sql注入不会成为问题。