我有textarea
评论。我需要允许'
和\
以及html
代码等标记(例如<b> , <i> , <br>
)。
我尝试htmlspecialchars($comment,ENT_QUOTES);
,但这样{@ 1}}和'
是允许的,但\
标签不允许。这就是输入html
完全变为assassin's <b>creed
。但我需要它成为刺客的信条。
如果我不使用assassin's <b>creed
,htmlspecialchars($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
输出:刺客信条
答案 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);
// <p>The <strike>quick</strike> "brown" <strong>fox</strong> jumped <hr /> 'over' the <em>lazy dog</em>.</p>
http://phpfiddle.org/main/code/yru-fb1
注意:您仍然必须防止SQL注入。 Phil Cross'answer解决了这个问题。