在将值添加到db之前将值转义是否是一个好习惯?

时间:2012-08-07 08:37:08

标签: security zend-framework escaping

我有一个Zend项目,经过一段时间的研究,我发现了这个想法。当然这与安全相关,目的是避免xss攻击。

其他解决方案是在显示它们之前逃避它们,但这将包括许多特殊情况,并且有一些时间因为Zend没有实现这样的任何东西。

这些是在phtml中回显它们之前进行转义的解决方案 http://codeutopia.net/blog/2007/11/10/how-to-automatically-escape-template-variables-in-zend_view/https://github.com/chikaram/gnix-view

那些有点太老了,也许有人已经遇到了这个问题,并且提供了更好的解决方案,Zend提供的新功能我还没有找到。

那么,在将值添加到数据库之前转义值并在罕见的特殊情况下制作排除数组时,如果我想在我的值中使用javascript代码,这是一个好习惯吗?

如果您有更好的解决方案,我们非常感谢链接和示例。

3 个答案:

答案 0 :(得分:5)

不,它不会,因为数据库用于存储数据,而不是“数据已经转发以便在特定介质上显示”。

考虑例如。您将来需要将其导出为PDF,而不是以HTML格式显示。通过使用您的方法,这将非常困难,因为数据库中的数据已经被破坏。

答案 1 :(得分:2)

当您拥有所有转义的HTML然后需要在JSON API中使用它时会发生什么?人们会想知道为什么他们的信用卡对帐单显示为Smith & associates

有一个原因在最后一分钟完成了逃避。转义是上下文敏感的。您只在HTML内部转义HTML,就像以不同方式转义SQL的字符串一样。通过逃避最后一分钟,您可以保持实际数据以便以不同的方式进行理智的搜索和转义。

此外,如果您在ZF中使用MVC内容,您应该只能在视图中使用$this->escape()

像:

Username: <?php echo $this->escape($this->username)); ?>

答案 2 :(得分:1)

验证输入,转义输出。

你不能打败这个。如果您希望用户提供非HTML的内容,则首先验证他会这样做(并过滤掉其他任何内容)。接下来,您将其保存在DB 中(您需要将其转义为DB 用法(Zend_Db_Adapter :: quote()或mysql_real_escape_string)。最后您从DB加载它输出正确转义 - Zend_View-&gt; escape())。如果您将其回显到JavaScript代码中,情况会有所不同。比您需要逃脱它使用javascript转义函数(任何其他格式都一样)。