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 函数将单引号转换为 &#039;,因此不会干扰代码中的其他单引号。浏览器的输出是 '

$ar = array(
   'name'=>htmlentities("Jon'", ENT_QUOTES)
);
$this->db->insert('test',$ar);

注意标记 ENT_QUOTES 的使用:它将转换双引号和单引号。

现在,在您的 html 中,您将在从数据库中获取值时获得此代码:

<input type='text' name='username' value='Jon&#039;' onmouseover='alert(1)'>

这不再干扰您的其他单引号(只是 运行 代码片段)