如何正确准备要插入数据库的字符串并将其放入输入类型" text"后来

时间:2013-08-12 00:11:55

标签: php mysql database validation escaping

我正在一个论坛上,用户可以在那里输入自己的帖子(后来编辑它们),我需要他们的输入才能被正确地转义,保护,验证,......这似乎不是一件困难的事情。但是我一路上遇到了一些严重的问题。

我想我已经完成了内容转发,这是我使用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 &lt;&quot;&gt; test &lt;&#039;&gt;

然后我将新转换的字符串插入数据库。到目前为止,我认为我做的一切都还不错,但是一旦我的用户需要编辑帖子标题,我需要将其从数据库中输出并输入“text”。这是我搞砸的地方..

当我从数据库中获取字符串test &lt;&quot;&gt; test &lt;&#039;&gt;并将其插入输入类型“text”的值时,它会正确显示,但如果我想像内容那样清除它&quot;&#039;转回"' ..

当我不净化时,帖子标题是否仍然受xss注入保护?

还是有更好的/更简单的替代方法吗?

注意:我正在使用PDO,因此转义输入数据以防止sql注入不会成为问题。

0 个答案:

没有答案