gpt4 book ai didi

mysql - Codeigniter mysql 插入查询剥离字符串

转载 作者:行者123 更新时间:2023-11-30 23:50:31 26 4
gpt4 key购买 nike

添加示例代码

请阅读下面的完整详细信息,这是一个示例函数,可以放在生成相同结果的 Controller 中。数据库结构贴在下面:

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 This is extra dummy text

在表单中发布的字符串实际上是这样的:

http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg

但是 xss_clean 将 %E9 转换为 é 这实际上不是我想要的,但我尝试对核心 xxs_clean 函数做任何事情。

最后一点,这就是我的 table 的样子,尽管我认为这没有任何区别:

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,所以如果发布了类似这样的内容:

This won't work http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg

html_escape() 会把它转换成这个

This won't work http://img.chronofoot.com/%E9ric-di-meco/interview-eric-di-meco_66454_w250.jpg

xss_clean() 然后把它转换成这个

This won't work http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg

然后 htmlentities() 会将其转换为:

This won&#039;t work http://img.chronofoot.com/éric-di-meco/interview-eric-di-meco_66454_w250.jpg

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

最佳答案

在向表中插入数据时,您应该只使用 urlencode() 进行 URL 编码,并在选择数据后使用 urldecode()

它更简洁,您不必担心特殊字符。

关于mysql - Codeigniter mysql 插入查询剥离字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com