1

添加了示例代码

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

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 _

它在数据库中结束为:

http://img.chronofoot.com/

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

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

4

4 回答 4

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');
于 2013-01-13T17:27:46.487 回答
0

是否有任何理由在 $this->input->post() 上使用 $_POST?然后您可以将表单验证规则与 xss_clean 一起使用。

于 2013-01-14T08:04:51.643 回答
0

您应该urlencode()在将数据插入表时使用 URL 编码,并urldecode()在选择数据后使用。

它更干净,您不必担心特殊字符。

于 2013-01-13T16:21:36.543 回答
-1

在将它传递给数据库之前,尝试使用 htmlentities 转换该 url。

$comment_html = htmlentities($string);

另外,确保你 var_dump(不是 echo)$this->db->last_query()。特殊字符会以不同的方式输出。

var_dump($this->db->last_query());
于 2013-01-13T16:44:09.417 回答