Codeigniter mysql插入查询剥离字符串

时间:2013-01-13 15:54:55

标签: mysql codeigniter xss

添加了示例代码

请阅读下面的详细信息,这是一个示例函数,可以放在一个生成相同结果的控制器中。数据库结构进一步向下发布:

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

它在数据库中结束为:

  

http://img.chronofoot.com/

我已经完成$ 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

更新的问题:转义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()会将其转换为:

  

这赢了&#039; t http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg

这当然会破坏“不会”这个词,因为&符号会被转换两次。

4 个答案:

答案 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());