CodeIgniter Active Records 在插入数据时不会自动转义单引号
CodeIgniter Active Records is not auto escaping a single quote while inserting the data
我正在 CodeIgniter 3.1.11 中开发一个电子商务网站,Active Records 不会自动转义单引号。但是在文档中提到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'"), //see the extra single quote here after the name Jon
);
$this->db->insert('test',$ar);
我已经手动尝试了 escape_str 函数,但是这是在单引号前添加反斜杠 Jon\'
所以内联 js 不会执行,但它是一个电子商务网站可能也有真正的单引号,例如。 男装,女装 但是如果我使用 escape_str 那么它将显示为 Mens\'s Clothes ,Women\'s Clothes
在此做什么情况?有什么建议吗?
使用CI的函数escape_str() to manually escape strings and when getting the data back the php function 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'
插入到值中会导致
<input type="text" name="username" value="joe'" onmouseover="alert(1)">
edit: 因此您评论说有很多文件要更改,您也可以将此方法与 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)'>
这不再干扰您的其他单引号(只是 运行 代码片段)
我正在 CodeIgniter 3.1.11 中开发一个电子商务网站,Active Records 不会自动转义单引号。但是在文档中提到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'"), //see the extra single quote here after the name Jon
);
$this->db->insert('test',$ar);
我已经手动尝试了 escape_str 函数,但是这是在单引号前添加反斜杠 Jon\'
所以内联 js 不会执行,但它是一个电子商务网站可能也有真正的单引号,例如。 男装,女装 但是如果我使用 escape_str 那么它将显示为 Mens\'s Clothes ,Women\'s Clothes
在此做什么情况?有什么建议吗?
使用CI的函数escape_str() to manually escape strings and when getting the data back the php function 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'
插入到值中会导致
<input type="text" name="username" value="joe'" onmouseover="alert(1)">
edit: 因此您评论说有很多文件要更改,您也可以将此方法与 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)'>
这不再干扰您的其他单引号(只是 运行 代码片段)