代码之家  ›  专栏  ›  技术社区  ›  Ivan Krechetov

有时允许动态SQL而不进行清理可以吗?

  •  5
  • Ivan Krechetov  · 技术社区  · 16 年前

    我的PHP项目合作伙伴反对我在动态SQL中总是清理整数值的做法。我们尽可能使用参数化查询。但对于更新和删除条件 Zend_Db_Adapter

    $db->delete('table_foo', 'id = ' . intval($obj->get_id()));
    

    这是等效的,但是的较短版本(我检查了ZF源代码):

    $db->delete('table_foo', $db->qouteInto('id = ?', $obj->get_id(), 'INTEGER'));
    

    我的搭档强烈反对这一点 intval() ,说如果 $obj

    他说,如果我们清理所有HTML表单输入,整数ID就不可能进入 '; DROP TABLE ...' ' OR 1 = 1 $_SESSION 他说。

    $db->update->(
        'table_foo',
        $columns,
        'string_column_bar = ' . $db->qoute($string_value))
    );
    

    我没能证明他错了,他也没能证明我错了。你也可以吗?

    8 回复  |  直到 16 年前
        1
  •  7
  •   Amber    16 年前

    你认为哪一个更麻烦?

    • 必须跟踪没有导致SQL查询失败的错误。

    无论你选哪一个,都有你的答案。就我个人而言,我也倾向于偏执的一面。

    intval() ,并改用它。这样你就可以两全其美了。

        2
  •  10
  •   Community Mohan Dere    5 年前

    坦率地说,你的伴侣疯了:消毒很便宜,没有理由不这么做。 即使您正在清理HTML表单中的内容,如果这些检查在生产过程中以某种方式中断,您也会很高兴在其他地方有一个备份。 此外,它还促进了良好的实践。

    你应该用清洁的方法

        3
  •  3
  •   Tom H zenazn    15 年前

    我认为你的搭档错了——他没有考虑将数据之间的关注点分离 桑纳化 在模型(数据库代码所在的位置)和数据中 验证

    通常,表单验证逻辑将位于模型应用程序的单独区域中。例如,当向表单元素添加验证器时,这通常是在表单类本身中完成的。这一层验证代码的目的是验证表单的输入,并在出现任何错误时返回相应的消息。

    因此,我认为模型中的数据清理应该与此分开考虑,因为模型实际上是一个独立的类,因此应该负责自己的数据清理。从理论上讲,您应该能够在应用程序中的其他地方重新使用此模型,因此该模型不应假定已在其他地方(即作为表单验证层的一部分)进行了清理。

    您的合作伙伴关于不注意失败的SQL查询的主要观点在实践中并不是一个真正的问题——最好是防御性地编写代码。

        4
  •  1
  •   StasM    16 年前

        5
  •  0
  •   NDM    16 年前

    表单输入应该总是对idd进行清理,但并不是每个进入查询的变量都应该清理。。。
    变量的来源在这里起着重要作用。

        6
  •  0
  •   Erlock    16 年前

    如果深入查看Zend框架代码,您将看到$db->quoteInto()转换为$db->引号,返回(字符串)intval($value),类型为整数。

    如果类型未定义,$db->_quote()被调用。其代码如下:

    protected function _quote($value)
    {
        if (is_int($value) || is_float($value)) {
            return $value;
        }
        return "'" . addcslashes($value, "\000\n\r\\'\"\032") . "'";
    }
    

    无论使用何种调用方法(无论是否指定类型),$db->删除是完全安全的。

        7
  •  0
  •   Tower    16 年前

        8
  •  0
  •   monokrome    16 年前

    应从表单检索的所有数据都应进行清理。没有例外。从系统中检索到的所有数据在进入系统之前都应该经过清理,因此在再次从系统中检索时不应该进行清理。

    问题是,这个整数从哪里来?