Security 在将值添加到db之前转义值是否是一种好的做法?

Security 在将值添加到db之前转义值是否是一种好的做法?,security,zend-framework,escaping,Security,Zend Framework,Escaping,我有一个Zend项目,经过一段时间的研究,我发现了这个想法。当然,这是与安全相关的,目的是避免xss攻击 其他的解决方案是在展示它们之前逃离它们,但这将包括很多特殊情况,还有一段时间,因为Zend没有实现类似的东西 这些是在phtml中回显它们之前进行转义的解决方案 及 这些都有点太旧了,也许有人已经遇到了这个问题,并提出了更好的解决方案,具有Zend提供的我还没有发现的新功能 所以,在将值添加到db之前进行转义是一种好的做法吗?当我确实希望值中包含javascript代码时,为罕见的特殊情况创

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

其他的解决方案是在展示它们之前逃离它们,但这将包括很多特殊情况,还有一段时间,因为Zend没有实现类似的东西

这些是在phtml中回显它们之前进行转义的解决方案 及

这些都有点太旧了,也许有人已经遇到了这个问题,并提出了更好的解决方案,具有Zend提供的我还没有发现的新功能

所以,在将值添加到db之前进行转义是一种好的做法吗?当我确实希望值中包含javascript代码时,为罕见的特殊情况创建一个排除数组


如果您有更好的解决方案,链接和示例将不胜感激。

如果您拥有所有转义的HTML,然后需要在JSON API中使用它,会发生什么?人们会想知道为什么他们的信用卡账单显示为
Smith&;员工

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

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

比如:


用户名:不,不会,因为数据库用于存储数据,而不是“数据已转义以在特定媒体上显示”


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

验证输入,转义输出。


这是你无法战胜的。如果您希望用户提供非HTML的内容,则首先要验证他所提供的内容(并过滤掉任何其他内容)。接下来,将其保存在DB中(您需要将其转义以供DB使用(Zend_DB_Adapter::quote()或mysql_real_escape_string)。最后,从DB中加载并输出它(使用正确的转义-Zend_View->escape())。如果您将其回显到JavaScript代码中,情况会有所不同。您需要使用JavaScript转义函数对其进行转义(对于任何其他格式也一样).

这将需要很多时间。这是我最后的解决方案。我正在试图找出是否值得寻找更好的方法。@AndreiCristianProdan我不确定这将需要多少时间?我的项目中有很多回音,如果我只是错过了一个,会发生什么?@AndreiCristianProdan很可能需要更多的时间来消除回音当时间到来时,所有的数据都会被忽略。对于这一点,要么要非常小心,要么对html转义字符串和非转义字符串采用命名约定。比如
$hUsername=htmlentities($username)
@AndreiCristianProdan我必须承认,我刚才从一个Joel的软件博客上偷了这个想法:我不能在我想做这类事情的时候,在特殊情况下使用一些unescape函数吗?@AndreiCristianProdan和搜索呢?以及那些想知道为什么要使用16个字符字符串的用户呢“必须少于或等于16个字符"?你能举一个例子,让用户使用一个搜索表单,并在其中查找带有特殊字符的字符串吗?另外,在比较这两个字符串之前,我不能用unescape处理这种情况吗?@AndreiCristianProdan想象你有一个表单,用户可以按名称搜索公司。图中有一个名为
Smith&;Sons
的公司。这可能会使搜索变得复杂。正如其他人告诉你的,这通常是个坏主意。当然,在你的特定情况下,它可能会起作用。但你应该问问自己:你的项目是否如此特殊,以至于应该以非标准的方式完成,并且你是否意识到后果?如果你正在向数据库中写入数据,你应该使用参数化查询,n尽可能引用ot报价。
Username: <?php echo $this->escape($this->username)); ?>