如何在Zend Framework中编写的应用程序中防止SQL注入攻击?

时间:2010-03-03 09:55:26

标签: php sql zend-framework sql-injection

我对ZF安全没有任何概念。在数据库上操作时是否必须使用Filter?也许绑定就足够了?怎么样:

$users->update($data, 'id=1');

应该以某种方式过滤$ data数组吗?随意写下你对此问题的任何了解。

你能否提供一些关于ZF安全性的文章链接(主要是关于SQL注入和XSS)?

4 个答案:

答案 0 :(得分:5)

简短回答
虽然ZF采取并提供了一些措施来保护您的应用,但您仍然应该采用与Zend Framework相同的预防措施。


关于您的代码段,请查看Zend_Db in the Reference Guide上的章节:

  

默认情况下,使用参数插入数据数组中的值。这可以降低某些类型的安全问题的风险。您不需要对数据数组中的值应用转义或引用。

这并不意味着您不必担心安全问题。例如,对于上面的Update method

  

第三个参数是一个包含SQL表达式的字符串,该表达式用作要更改的行的条件。此参数中的值和标识符不会被引用或转义。您有责任确保将任何动态内容安全地插入到此字符串中。有关帮助您执行此操作的方法,请参阅Quoting Values and Identifiers

注意,因为你明显使用Zend_Db_Table,第三个参数是第二个参数。在内部,表实例将委托对db适配器的调用,第一个param是表实例的tablename。


关于Zend_View和XSS攻击向量:

  

Zend_View带有一组初始辅助类,其中大部分与表单元素生成有关,并自动执行适当的输出转义。

再次其中大多数并不意味着全部。 Zend_View确实提供Zend_View::escape()来帮助您清理输出,但这没什么特别的。

答案 1 :(得分:2)

相同的概念对Zend框架和每个其他Web应用程序/库/操纵用户数据的任何内容都有效:

  

始终验证用户输入。信任没有   之一。

如果你期待一个字符串,请确保收到一个字符串。这可以使用框架库(例如,在这种情况下,您使用Zend框架)或通过手动实现验证函数来执行。

必须始终在服务器端执行验证。还应提供客户端验证,以提供更好的用户体验。

如果是Zend,请参阅手册中的Validation page

答案 2 :(得分:1)

绑定应该阻止SQL注入,但它不会阻止XSS。您应该始终根据需要过滤数据,当在视图中回显输出时,您应该逃避任何可能有危险的事情。

echo $this->escape($this->foo);

答案 3 :(得分:1)

我建议使用Zend Filters,无论您需要什么特定的东西。您可以在应用程序的任何位置使用它。

请求参数

$alpha = new Zend_Filter_Alpha();
$name = $alpha -> filter($this -> _request -> getParam('name')); //while processing url parameters

数据库

$int = new Zend_Filter_Int();
$select -> where("id = ?", $int -> filter($id)); //during db processing also

同样在表单元素中。我将跳过这个,因为这个例子可以被发现。