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表单中的内容,如果这些检查以某种方式中断生产,您会很高兴您在其他地方有备份. 此外,它促进了良好的做法.
您认为哪个更麻烦:
无论你选择哪一个,都有你的答案.就个人而言,我倾向于倾向于偏执的一面.
如果有的话,你可以做到这两点:创建你自己的函数,首先检查null然后调用intval(),然后使用它.然后你就可以获得两全其美的效果.