如何解决CodeIgniter Active Records 在插入数据时不会自动转义单引号
我正在 CodeIgniter 3.1.11 中开发电子商务网站,Active Records 不会自动转义单引号。但是在文档中提到活动记录将自动转义输入。
$ar = array(
'name'=>"Jon'",//see the extra single quote here after the name Jon
);
$this->db->insert('test',$ar);
此代码将在数据库中添加单引号,如果我获取此数据并将其显示在 HTML 中,那么任何人都可以在那里执行内联 js,例如。 Jon' onmouseover='alert(1)
此输入将在页面上执行内联 js。
<input type='text' name='username' value='Jon' onmouseover='alert(1)'
看到这里 onmouseover 被添加为额外的属性。
$ar = array(
'name'=>$this->db->escape_str("Jon'"),$ar);
我已经手动尝试了 escape_str 函数,但这是在单引号 Jon\'
前添加反斜杠,因此内联 js 不会执行,但它是一个电子商务网站,可能有是真正的单引号也有,例如。 Men's Clothes,Women's Clothes 但是如果我使用 escape_str 那么它会显示为 Mens\'s Clothes,Women\'s Clothes
在这种情况下该怎么办?有什么建议吗?
解决方法
使用 CI 的函数 escape_str() 手动转义字符串,并在取回数据时使用 php 函数 html_entity_decode():
echo html_entity_decode('joe\',Mens\'s Clothes,Women\'s Clothes');
哪个输出
joe',Mens's Clothes,Women's Clothes
或者更好地将您的输入字段更改为:
<input type="text" name="username" value="" onmouseover="alert(1)">
然后从 CI insert() 自动转义将为您服务,因为将 joe'
插入 value 导致
<input type="text" name="username" value="joe'" onmouseover="alert(1)">
编辑:因此您评论说有许多文件要更改,您也可以将此方法与 htmlentities() 一起使用:
此 php 函数将单引号转换为 '
,因此不会干扰代码中的其他单引号。浏览器的输出是'
$ar = array(
'name'=>htmlentities("Jon'",ENT_QUOTES)
);
$this->db->insert('test',$ar);
注意标志 ENT_QUOTES
的使用:它将转换双引号和单引号。
现在在您的 html 中,您将在从数据库中获取值时获得此代码:
<input type='text' name='username' value='Jon'' onmouseover='alert(1)'>
不再干扰您的其他单引号(只需运行代码片段)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。