问题 codeigniter如何消毒输入?


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

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


1735
2017-11-04 23:42


起源

考虑过看一下CI的代码? - Beat
很多信息: google.com.ng/... - Mob
PDO任何人? php.net/pdo - Bailey Parker
CI(至少我知道的版本)积极进行 sanitizes (这意味着:更改!)输入(这很糟糕)。在执行任何控制器操作之前,它会在启动请求时执行此操作。有谁记得我们讨厌多少 magic_quotes_gpc? - Rudie
“消毒”数据完全取决于上下文。 @Rudie:这是一个运行CI的配置设置 xss_clean() 全球所有 $_REQUEST 数据,它确实很糟糕(篡改原始数据),我不建议使用它,除非你是一个新手,只需要一个安全毯,用于实时应用程序,同时你学习如何 正确 处理转义,验证和处理输出。 - Wesley Murch


答案:


完全像这样(对于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类会自动执行查询转义,但对于其他所有内容,您应该以正确的方式手动转义/清理数据以获取给定的上下文, 产量, 不是你的 输入


9
2017-11-05 15:45



我不完全确定你的意思是通过消毒我的输出而不是输入。我想我明白,如果我试图阻止XSS攻击,但如果我使用活动记录类构建一个mysql查询怎么办?那可能是什么样的? - Erreth
无论你在AR级别投掷什么,最终都是安全的 mysql_real_escape_string,附加的安全性 `escaping` 表和数据库名称。为安全起见,您不需要对其进行清理,仅用于有效性(整数值,最大长度,格式等)。看到 stackoverflow.com/questions/4171115/..., stackoverflow.com/questions/5288953/... - Wesley Murch


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

CodeIgniter UserGuide安全性


3
2017-11-05 15:37



我明白。我正在使用表单验证类,但我想我应该在我拥有的每个表单上使用它。我肯定要做一些更积极的消毒和验证。谢谢! - Erreth


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

$this->db->last_query()

您将确切地看到查询的外观,以便您可以验证是否正确清理了。


1
2017-11-04 23:56