我正在构建一个Codeigniter应用程序,并尽力防止SQL注入。我使用Active Record方法来构造所有查询。我知道Active Record自动对输入进行了消毒,但我想知道它到底消毒了多少?它只是转义所有引号,还是做得更多?如何防止混淆的SQL注入或其他更高级的注入方式?
基本上,我正在寻找有关CI如何净化数据的详细解释。有人知道吗?
我正在构建一个Codeigniter应用程序,并尽力防止SQL注入。我使用Active Record方法来构造所有查询。我知道Active Record自动对输入进行了消毒,但我想知道它到底消毒了多少?它只是转义所有引号,还是做得更多?如何防止混淆的SQL注入或其他更高级的注入方式?
基本上,我正在寻找有关CI如何净化数据的详细解释。有人知道吗?
MySQL驱动程序中的实现方式(完全一样):
mysql_real_escape_string()
(99%的情况下都是这样)mysql_escape_string()
addslashes()
str_replace()
手动转义LIKE
条件中的%
和_
/**
* Escape String
*
* @access public
* @param string
* @param bool whether or not the string will be used in a LIKE condition
* @return string
*/
function escape_str($str, $like = FALSE)
{
if (is_array($str))
{
foreach ($str as $key => $val)
{
$str[$key] = $this->escape_str($val, $like);
}
return $str;
}
if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id))
{
$str = mysql_real_escape_string($str, $this->conn_id);
}
elseif (function_exists('mysql_escape_string'))
{
$str = mysql_escape_string($str);
}
else
{
$str = addslashes($str);
}
// escape LIKE condition wildcards
if ($like === TRUE)
{
$str = str_replace(array('%', '_'), array('\\%', '\\_'), $str);
}
return $str;
}
mysql_real_escape_string
一样安全,并具有转义表和数据库名称的额外安全性。 您不需要为了安全而对其进行净化,只需要进行有效性检查(整数值,最大长度,格式等)。 请参见http://stackoverflow.com/questions/4171115/is-mysql-real-escape-string-enough-to-anti-sql-injection/4171134#4171134,http://stackoverflow.com/questions/5288953-is-mysql-real-escape-string-broken - Wesley Murch您可以使用last_query()
方法随时查看最新的查询。
$this->db->last_query()
您将看到查询的确切样子,以便验证是否已正确进行了清理。
magic_quotes_gpc
吗? - Rudie$_REQUEST
数据上全局运行 CI 的xss_clean()
函数,但它会破坏原始数据。除非你是一个需要在学习如何 正确 处理转义、验证和处理输出时为实时应用提供安全保护的新手,否则我不建议使用它。 - Wesley Murch$config['global_xss_filtering'] = FALSE;
。 - Wesley Murch