请阅读下面的详细信息,这是一个示例函数,可以放在一个生成相同结果的控制器中。数据库结构进一步向下发布:
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 / ERIC-二梅科/采访-埃里克二叔meco_66454_w250.jpg
它在数据库中结束为:
我已经完成$ this-&gt; db-&gt; 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
我想我还有一些额外的信息。
就像我说的那样,发布的实际字符串是:
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()会将其转换为:
这赢了&#039; t http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg
这当然会破坏“不会”这个词,因为&符号会被转换两次。
答案 0 :(得分:0)
在将数据插入表格时,您应该使用urlencode()
进行网址编码,并在选择数据后使用urldecode()
。
它更清洁,你不必担心特殊字符。
答案 1 :(得分:0)
试试这个:
$array = array(
'comment_set_id' => 2993,
'comment_user_id' => 40,
'comment_enabled' => 1,
'comment_is_spam' => 0,
'comment_time_added' => 1358090826,
'comment_time_updated' => 1358090826
);
$this->db->set('comment_original',$comment_original,FALSE);
$this->db->set($array);
$this->db->insert('comments');
答案 2 :(得分:0)
是否有任何理由使用$ _POST而不是$ this-&gt; input-&gt; post()?然后,您可以将表单验证规则与xss_clean一起使用。
答案 3 :(得分:-1)
尝试使用htmlentities转换该网址,然后再将其传递给数据库。
$comment_html = htmlentities($string);
另外,请确保var_dump(不是echo)$ this-&gt; db-&gt; last_query()。特殊字符的输出方式不同。
var_dump($this->db->last_query());