2011-12-14 92 views
2

我在看一些Zend Framework的代码,开发人员,我与使用工作,并在其中我看到以下内容:Zend Framework的SQL注入防护

$select = new Zend_Db_Select($DB); 
$sql = $select->where("id ='".$id."'");    

现在的$ id不被任何消毒,我的印象是,如果你使用占位符,你只能通过Zend注入保护 - 这个字符串是脆弱的,我想。

该代码的作者声称zend照顾它即使在这种情况下,虽然我找不到它所说的文档。

任何人都可以清除,如果这实际上是安全的?

回答

5

你是对的。其他开发者错了。

如果您查看文档here,您可以在页面底部找到有关讨论示例#20的注释,如果这些参数来自用户输入,那么它们将受SQL注入处理。例#20或多或少与你粘贴的代码做同样的事情。 (虽然,你的代码有单引号,但这当然不会让它更安全。)

我不知道为什么有人会忽略占位符,而支持这种不安全和不太干净的写作方式。

0

使用占位符,Zend会清理您的数据。

$select = new Zend_Db_Select($DB); 
$sql = $select->where("id = ? ", $id); 
+0

是的,我知道这会保护,但原作者声称他的意愿,我相信是错误的。只是想验证。 – Will 2011-12-14 22:29:45

+0

我对Zend及其卫生技术并不熟悉,但是如果它在where方法中创建字符串,可能会对其进行消毒。即它清理任何输入到$ db_obj-> method() – Brendan 2011-12-14 22:38:14

1

我这样做:

$id = 3; 
$where = $this->getAdapter()->quoteInto("id =?', $ id); 

结果:

id = '3' 

这种方法会自动添加单引号正确生成SQL。我认为这非常有效。