如何使用%Zend Form防止XSS攻击

Tjo*_*rie 3 php xss zend-framework zend-form

我们公司为我们的客户建立了一个网站.在产品发布之前,客户聘请了一家网络安全公司来测试页面的安全性.

我们删除了大部分XSS问题.我们用zend开发了这个网站.我们将StripTags,StringTrim和HtmlEntities过滤器添加到订单表单元素中.

他们跑了另一个测试,它仍然失败:(

他们使用以下内容作为http标头数据中的一个输入字段:name=%3Cscript%3Ealert%28123%29%3C%2Fscript%3E基本上转换为name=<script>alert(123);</script>

我已经在一些字段中添加了alpha和alnum,它通过删除%修复了XSS漏洞(触摸木材),然而,现在老板不喜欢它,因为O'Brien和双桶姓氏...... .

我没有遇到%3C作为<读取XSS的问题.我的html字符集或编码有什么问题吗?

我现在可能需要编写一个自定义过滤器,但对于每个网站和部署来说,这将是一个巨大的痛苦.请帮忙,这真是令人沮丧.

编辑:如果它是关于转义表单的输出,我该怎么做?表单提交到同一页面 - 如果我只在我的视图中,我该如何逃避<?= $this->form ?>

我怎样才能让Zend Form逃脱它的输出?

bob*_*nce 14

%3Cscript%3Ealert%28123%29%3C%2Fscript%3E是URL编码的形式<script>alert(123);</script>.只要您包含<在表单值中,它就会以提交方式提交给服务器%3C.PHP将<在您的应用程序中的任何内容之前对其进行读取和解码.

也就是说,没有必须处理的特殊编码; 你看%3C,你实际上不会在你的输入中看到<.如果您没有对页面显示进行编码,那么您甚至没有针对XSS的最基本防御.

我们删除了大部分XSS问题.我们用zend开发了这个网站.我们将StripTags,StringTrim和HtmlEntities过滤器添加到订单表单元素中.

我担心你根本没有解决你的XSS问题.你可能只是混淆了它们.

输入过滤是阻止XSS的一种令人沮丧的常见但非常错误的策略.

这不是输入问题.正如你的老板所说,没有理由你不能输入O'Brien.或者甚至<script>,就像我刚才在这个评论框中一样.您不应该尝试在输入中删除标记,甚至不对它们进行HTML编码,因为谁在输入时知道数据最终会在HTML页面中结束?您不希望您的数据库充满废话'Fish&amp;Chips',然后最终会出现在电子邮件或其他非HTML上下文中,其中包含奇怪的HTML转义.

HTML编码是输出阶段的问题.保留传入的字符串,将它们保存为数据库中的原始字符串(当然,如果您将字符串中的查询混合在一起以将数据放入数据库而不是参数化查询中,则需要SQL-escape以完全相同的内容点).然后,只有在HTML中插入值时,才对它们进行编码:

Name: <?php echo htmlspecialchars($row['name']); ?>
Run Code Online (Sandbox Code Playgroud)

如果你有一堆狡猾的代码,echo "Name: $name";那么我担心你有很多重写要做到安全.

提示:考虑使用短名称定义一个函数,h这样就不必输入htmlspecialchars那么多.不要使用htmlentities通常不必要地编码非ASCII字符的字符,除非你提供正确的$charset参数,否则它们也会搞乱它们.

(或者,如果您使用的是Zend_View,.$this->escape())

输入验证在特定于应用程序的级别上很有用,例如确保电话号码字段包含数字而不是字母.这不是你可以全局应用的东西,以避免在将字符串放入另一个字符串的上下文中时出现的问题 - 无论是在HTML,SQL,JavaScript字符串文字内还是需要转义的许多其他上下文之一.