codeigniter如何消毒输入?

时间:2011-11-04 23:42:56

标签: php sql codeigniter sql-injection

我正在构建一个Codeigniter应用程序,我正在努力防止SQL注入。我正在使用Active Record方法构建我的所有查询。我知道Active Record会自动清理输入,但我想知道到底在多大程度上?它只是逃避所有引用,还是做得更多?如何防止混淆的SQL注入或其他更高级的类型?

基本上,我正在寻找CI如何清理数据的深入解释。有人知道吗?

3 个答案:

答案 0 :(得分:9)

正好像这样(对于MySQL驱动程序):

  • 尝试mysql_real_escape_string()(这将是99%的情况)
  • 回到mysql_escape_string()
  • 回到addslashes()
  • 通过%
  • _条件下手动转义LIKEstr_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类会自动执行查询转义,但对于其他所有内容,您应该使用输出而不是输入以正确的方式手动转义/清理数据。输入

答案 1 :(得分:3)

Active Record仅转义数据,没有别的。转义可以防止SQL注入。然后在表单上使用验证类验证。应该照顾好你的问题。以下是其他CodeIgniter安全项的链接:

CodeIgniter UserGuide Security

答案 2 :(得分:1)

您始终可以使用last_query()方法查看最新查询。

$this->db->last_query()

您将看到查询的确切内容,以便您可以验证是否正确清理。