我正在构建一个Codeigniter应用程序,我正在努力防止SQL注入.我正在使用Active Record方法构建我的所有查询.我知道Active Record会自动清理输入,但我想知道到底在多大程度上?它只是逃避所有引用,还是做得更多?如何防止混淆的SQL注入或其他更高级的类型?
基本上,我正在寻找CI如何清理数据的深入解释.谁知道?
完全像这样(对于MySQL驱动程序):
尝试mysql_real_escape_string()
(99%的情况下会是这种情况)
回落 mysql_escape_string()
回落 addslashes()
手动逃脱%
,并_
在LIKE
通过条件str_replace()
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查询不会中断或执行意外操作,并且仅在数据库查询的上下文中使用,以确保基于传递给它的内容的正确语法.
没有任何魔法可以使所有数据对于任何上下文(如HTML,CSV或XML输出)都安全,并且只是在您考虑它的情况下:xss_clean()
它不是一个通用的解决方案,也不是100%防弹,有时它实际上是不合适的.Active Record类会自动执行查询转义,但对于其他所有内容,您应该使用输出而不是输入以正确的方式为给定的上下文手动转义/清理数据.