【发布时间】:2010-03-03 09:55:25
【问题描述】:
我对采埃孚安全没有任何概念。对数据库进行操作时是否必须使用过滤器?也许绑定就足够了?这个怎么样:
$users->update($data, 'id=1');
是否应该以某种方式过滤 $data 数组?随意写下你对这个问题的了解。
您能否提供一些关于 ZF 安全性的好文章的链接(主要是关于 SQL 注入和 XSS)?
【问题讨论】:
标签: php sql zend-framework sql-injection
我对采埃孚安全没有任何概念。对数据库进行操作时是否必须使用过滤器?也许绑定就足够了?这个怎么样:
$users->update($data, 'id=1');
是否应该以某种方式过滤 $data 数组?随意写下你对这个问题的了解。
您能否提供一些关于 ZF 安全性的好文章的链接(主要是关于 SQL 注入和 XSS)?
【问题讨论】:
标签: php sql zend-framework sql-injection
简答
虽然 ZF 采取并提供了一些 措施来保护您的应用程序,但您仍应采取与未使用 Zend Framework 时相同的预防措施。
关于您的代码 sn-p,请查看 Zend_Db in the Reference Guide 上的章节:
默认情况下,数据数组中的值是使用参数插入的。这降低了某些类型的安全问题的风险。您不需要对数据数组中的值应用转义或引用。
这并不意味着您不必担心安全问题。比如上面的Update method
第三个参数是一个包含 SQL 表达式的字符串,该表达式用作要更改的行的条件。此参数中的值和标识符没有被引用或转义。您有责任确保将任何动态内容安全地插入到此字符串中。请参阅Quoting Values and Identifiers 了解帮助您执行此操作的方法。
注意由于您显然使用的是Zend_Db_Table,因此第三个参数是第二个参数。在内部,表实例会将调用委托给 db 适配器,第一个参数是表实例的表名。
关于Zend_View和XSS攻击向量:
Zend_View 带有一组初始的帮助类,其中大部分与表单元素生成相关,并自动执行适当的输出转义。
再次大部分并不代表全部。 Zend_View 确实提供了 Zend_View::escape() 来帮助您清理输出,但这没什么特别的。
【讨论】:
同样的概念适用于 Zend 框架和所有其他网络应用程序/库/任何操纵用户数据的东西:
始终验证用户输入。不信任 一个。
如果您期待一个字符串,请确保您收到一个字符串。这可以使用框架库(例如,在这种情况下您使用 Zend 框架)或通过手动实现验证函数来执行。
验证必须始终在服务器端执行。客户端验证也应该存在,以提供更好的用户体验。
如果是 Zend,请参考手册中的Validation page。
【讨论】:
绑定应该防止 SQL 注入,但它不能防止 XSS。您应该始终根据需要过滤数据,并且在视图中回显输出时,您应该避开任何可能有危险的内容。
echo $this->escape($this->foo);
【讨论】:
我会建议使用 Zend 过滤器,无论您需要什么特定的东西。您可以在应用程序中的任何位置使用它。
请求参数
$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
也在表单元素中。我会跳过这个,因为可以找到很多这样的例子。
【讨论】: