是否可以在没有清理的情况下允许动态SQL?

Iva*_*tov 5 php sql security zend-framework

我在PHP项目上的合作伙伴反对我总是在动态SQL中清理整数值的做法.我们尽可能使用参数化查询.但是对于UPDATE和DELETE条件,Zend_Db_Adapter需要一个非参数化的SQL字符串.这就是为什么我,即使没有想到,总是写下这样的东西:

$db->delete('table_foo', 'id = ' . intval($obj->get_id()));
Run Code Online (Sandbox Code Playgroud)

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

$db->delete('table_foo', $db->qouteInto('id = ?', $obj->get_id(), 'INTEGER'));
Run Code Online (Sandbox Code Playgroud)

我的伙伴强烈反对这一点intval(),说如果$objID为null(该对象尚未保存到DB),我将不会注意到错误,并且DB操作将以静默方式执行.这就是他实际发生的事情.

他说,如果我们清理所有HTML表单输入,那么整数ID就不可能进入'; DROP TABLE ...',或' OR 1 = 1'或者另一个讨厌的值,并插入到我们的SQL查询中.因此,我只是偏执,使我们的生活变得更加复杂."不要再相信$_SESSION价值了"他说.

但是,对于字符串值条件,他同意:

$db->update->(
    'table_foo',
    $columns,
    'string_column_bar = ' . $db->qoute($string_value))
);
Run Code Online (Sandbox Code Playgroud)

我没有证明他错了,他没有证明我错了.你能做到吗?

Jus*_*son 10

坦率地说,你的伴侣不在他的摇滚乐队:消毒是便宜的,没有充分的理由不去做. 即使您正在清理HTML表单中的内容,如果这些检查以某种方式中断生产,您会很高兴您在其他地方有备份. 此外,它促进了良好的做法.

你应该彻底消毒


Amb*_*ber 7

您认为哪个更麻烦:

  • 必须跟踪不会导致SQL查询失败的错误.
  • 在清理表单输入时出错并且有人利用这些数据后必须恢复数据.

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

如果有的话,你可以做到这两点:创建你自己的函数,首先检查null然后调用intval(),然后使用它.然后你就可以获得两全其美的效果.