我正在构建一个 Codeigniter 应用程序,并且正在尽最大努力防止 SQL 注入。我正在使用 Active Record 方法来构建我的所有查询。我知道 Active Record 会自动清理输入,但我想知道到底清理到什么程度?它只是简单地转义了所有引号,还是做了更多的事情?如何防止混淆的 SQL 注入或其他更高级的注入?
基本上,我正在寻找有关 CI 如何清理数据的深入解释。有人知道吗?
就像这样(对于 MySQL 驱动程序):
- Tries
mysql_real_escape_string()
(99%的情况都是这样)
- 回落至
mysql_escape_string()
- 回落至
addslashes()
- 手动逃生
%
and _
in LIKE
条件通过str_replace()
https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294 https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294
/**
* 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 查询不会中断或执行意外操作,并且仅在数据库查询上下文中使用,以确保基于您传递给它的语法正确。
没有什么魔法可以保证所有数据的安全any上下文(如 HTML、CSV 或 XML 输出),以防万一您正在考虑它:xss_clean()
不是一刀切的解决方案,也不是 100% 万无一失的,有时它实际上是相当不合适的。 Active Record 类会自动执行查询转义,但对于其他所有内容,您应该针对给定上下文以正确的方式手动转义/清理数据,并使用您的output, 不是你的input.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)