我对ZF安全没有任何概念。在数据库上操作时是否必须使用Filter?也许绑定就足够了?怎么样:
$users->update($data, 'id=1');
应该以某种方式过滤$ data数组吗?随意写下你对此问题的任何了解。
你能否提供一些关于ZF安全性的文章链接(主要是关于SQL注入和XSS)?
答案 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
同样在表单元素中。我将跳过这个,因为这个例子可以被发现。