添加了示例代码
请阅读下面的详细信息,这是一个示例函数,可以放入生成相同结果的控制器中。数据库结构进一步向下发布:
public function test()
{
if(isset($_POST['comment_original']))
{
$this->load->library('form_validation');
$comment_original = $this->form_validation->xss_clean(html_escape($_POST['comment_original']));
var_dump($comment_original);
$this->db->insert('comments', array(
'comment_set_id' => 2993,
'comment_user_id' => 40,
'comment_original' => $comment_original,
'comment_enabled' => 1,
'comment_is_spam' => 0,
'comment_time_added' => 1358090826,
'comment_time_updated' => 1358090826
));
var_dump($this->db->last_query());
}
$this->output->set_output('<form method="post">
<textarea name="comment_original"></textarea>
<br />
<input type="submit" />
</form>');
}
原来的问题
嘿伙计们,当我尝试将这样的字符串插入到我的数据库中时,插入到 TEXT 列中。
http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg _
它在数据库中结束为:
我已经完成了 $this->db->last_query() 以显示 Codeigniter 正在运行什么查询,它返回:
INSERT INTO `comments` (`comment_set_id`, `comment_user_id`, `comment_original`, `comment_html`, `comment_enabled`, `comment_is_spam`, `comment_time_added`, `comment_time_updated`, `comment_ip_address`) VALUES (2993, 40, 'http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg', 'http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg', 1, 0, 1358090826, 1358090826, 'XXX')
因此,在尝试插入之前,它似乎没有被剥离。将那个确切的字符串放入 php 我的管理员用完整的字符串插入就好了。
有人知道为什么会这样吗?
额外的信息
它将删除“é”之后的任何内容,因此同样的事情也会发生在这样的字符串上:
http://img.chronofoot.com /éric-di-meco/interview-eric-di-meco_66454_w250.jpg 这是额外的虚拟文本
表单中发布的字符串实际上是这样的:
http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg
但是 xss_clean 将 %E9 转换为 é 这实际上不是我想要的,但我想对核心 xxs_clean 函数做任何事情。
最后一点,这就是我的桌子的样子,尽管我认为这没有任何区别:
CREATE TABLE IF NOT EXISTS `comments` (
`comment_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`comment_set_id` int(10) unsigned NOT NULL,
`comment_user_id` mediumint(6) unsigned NOT NULL,
`comment_original` text NOT NULL,
`comment_html` text NOT NULL,
`comment_attachments` text,
`comment_time_added` int(10) unsigned NOT NULL,
`comment_time_updated` int(10) unsigned NOT NULL,
`comment_enabled` tinyint(1) NOT NULL DEFAULT '1',
`comment_is_spam` tinyint(1) NOT NULL DEFAULT '0',
`comment_has_attachments` tinyint(1) NOT NULL DEFAULT '0',
`comment_has_edits` tinyint(1) NOT NULL DEFAULT '0',
`comment_ip_address` varchar(64) DEFAULT NULL,
PRIMARY KEY (`comment_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
更新的问题:转义 HTML
只是想我会提供一些额外的信息。
所以就像我说的实际发布的字符串是这样的:
http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg
这通过 html_escape 和 xss_clean。如果我先通过 xss_clean 然后它返回一个空字符串
var_dump($this->form_validation->xss_clean(html_escape($_POST['comment_original'])))
//Returns http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg
首先是 xss_clean
var_dump(html_escape($this->form_validation->xss_clean($_POST['comment_original'])))
//Returns ''
htmlentities 将以某种方式解决它,因为它将字符串转换为:
http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg
但是这个表单只是添加评论,所以可以添加任意数量的文本和 htmlentities,所以如果发布这样的内容:
这不起作用http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg
html_escape() 会将其转换为此
这不起作用http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg
xss_clean() 然后将其转换为此
这不起作用http://img.chronofoot.com /éric-di-meco/interview-eric-di-meco_66454_w250.jpg
然后 htmlentities() 会将其转换为:
这不会工作http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg
这当然会破坏“不会”这个词,因为&符号将被转换两次。