如何在PHP中允许特殊标签?

时间:2014-02-15 23:24:26

标签: php html mysql sql

我有textarea评论。我需要允许'\以及html代码等标记(例如<b> , <i> , <br>)。

我尝试htmlspecialchars($comment,ENT_QUOTES);,但这样{@ 1}}和'是允许的,但\标签不允许。这就是输入html完全变为assassin's <b>creed。但我需要它成为刺客的信条

如果我不使用assassin's <b>creedhtmlspecialchars($comment,ENT_QUOTES);会因为assassin's <b>creed而造成麻烦。但'应该成为刺客的信条

我怎么能解决这个问题?

我希望它足够清楚

由于

修改

应该是这样的:

输入:assassins <b>creed

输出:刺客的信条

使用assassin's <b>creed

输入:htmlspecialchars

输出:assassin's <b>creed

不使用任何功能:

输入:assassin's <b>creed

无法插入数据库

不使用任何功能:

输入:assassin's <b>creed

输出:刺客信条

3 个答案:

答案 0 :(得分:1)

您的问题是您正在使用htmlspecialchars()来转义数据库数据。

这不应该用于转义发往数据库的数据。看起来你无意中自己注入了SQL。

由于我不知道您如何连接数据库,我会发布几种方法来正确地转义数据:

<强> MySQL的 虽然你不应该使用这个功能,因为它已被弃用且不受支持,我将发布如何正确转义:

$data = "Assassin's <b>creed</b>";

$data = mysql_real_escape_string($data);
$result = mysql_query("INSERT INTO .... ");

<强> PDO

$conn = new PDO("{$connection_string}");

$data = "Assassin's <b>Creed</b>";
$conn->prepare("INSERT INTO tbl_games (title) VALUES (?)");
$conn->execute(array($data));

<强>笨

$this->db->insert('tbl_games', array('title' => "Assassin's <b>Creed</b>"));

我不确定mysqli的功能(或其他)。 在任何情况下,您都不需要使用htmlspecialchars()来转义数据。

使用数据库的内置功能来转义数据或研究预备语句。

答案 1 :(得分:0)

如果你想允许html标签等你不能用htmlspecialchars或类似的php函数清理数据。您必须为此目的使用库(清理数据同时允许标记)我建议htmlpurifier

或者您可以使用所见即所得的网络编辑器,例如http://www.tinymce.com/http://ckeditor.com/

答案 2 :(得分:0)

您最好的选择是使用htmlpurifier等库(在可选项answer中提到)。如果这不是一个选项,像下面这样的函数将允许您保留html标记:

function htmlspecialchars_whitelist(
        array $whitelist,
        $string,
        $flags = ENT_COMPAT,
        $encoding = 'UTF-8',
        $double_encode = true) {

    $regex = implode('|', $whitelist);
    preg_match_all("#<(?:(?:$regex) ?/?|/(?:$regex))>#", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);

    $pos = 0;
    $buffer = '';

    foreach ($matches as $match) {
        $off = $match[0][3];
        $substr = substr($string, $pos, $off - $pos);
        $substr = htmlspecialchars($substr, $flags, $encoding, $double_encode);
        $buffer .= $substr;
        $buffer .= $match[0][0];
        $pos = $off + strlen($match[0][0]);
    }

    $buffer .= htmlspecialchars(substr($string, $pos), $flags, $encoding, $double_encode);

    return $buffer;
}

示例:

$whitelist = array('b', 'strong', 'i', 'em', 'strike', 'br');
$html = "<p>The <strike>quick</strike> \"brown\" <strong>fox</strong> jumped <hr /> 'over' the <em>lazy dog</em>.</p>";
echo htmlspecialchars_whitelist($whitelist, $html, ENT_QUOTES);
// &lt;p&gt;The <strike>quick</strike> &quot;brown&quot; <strong>fox</strong> jumped &lt;hr /&gt; &#039;over&#039; the <em>lazy dog</em>.&lt;/p&gt;

http://phpfiddle.org/main/code/yru-fb1

注意:您仍然必须防止SQL注入。 Phil Cross'answer解决了这个问题。