我们公司为我们的客户建立了一个网站。在产品发布之前,客户聘请了一家网络安全公司来测试页面的安全性。
我们删除了大部分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&lt;关于XSS的问题。我的html字符集或编码有什么问题吗?
我现在可能需要编写一个自定义过滤器,但对于每个网站和部署来说,这将是一个巨大的痛苦。请帮忙,这真是令人沮丧。
编辑:
如果它是关于逃避表单的输出,我该怎么做?表单提交到同一页面 - 如果我只在我的视图中<?= $this->form ?>
如何让Zend Form逃脱它的输出?
答案 0 :(得分:14)
%3Cscript%3Ealert%28123%29%3C%2Fscript%3E
是<script>alert(123);</script>
的网址编码形式。只要您在表单值中包含<
,就会以%3C
的形式将其提交给服务器。在您的应用程序中的任何内容查看之前,PHP将读取并解码回<
。
也就是说,没有必须处理的特殊编码;您实际上在输入中看不到%3C
,您会看到<
。如果您没有对页面显示进行编码,那么您甚至没有针对XSS的最基本防御。
我们删除了大部分XSS问题。我们用zend开发了这个网站。我们将StripTags,StringTrim和HtmlEntities过滤器添加到订单表单元素中。
我担心你根本没有解决你的XSS问题。你可能只是混淆了它们。
输入过滤是阻止XSS的一种令人沮丧的常见但非常错误的策略。
这不是输入问题。正如你的老板所说,没有理由你不能输入O'Brien
。甚至是<script>
,就像我刚才在这个评论框中一样。您不应该尝试在输入中删除标记,甚至不对它们进行HTML编码,因为谁在输入时知道数据最终会在HTML页面中结束?您不希望您的数据库充满像'Fish&Chips'
这样的废话,然后会在电子邮件或其他非HTML上下文中出现奇怪的HTML转义。
HTML编码是输出阶段问题。保留传入的字符串,将它们保存为数据库中的原始字符串(当然,如果您将字符串中的查询混合在一起以将数据放入数据库而不是参数化查询中,则需要SQL-escape以完全相同的内容点)。然后只有在HTML 中插入值时才编码:
Name: <?php echo htmlspecialchars($row['name']); ?>
如果您有大量像echo "Name: $name";
这样狡猾的代码,那么我担心您需要做很多改写才能确保安全。
提示:考虑定义一个名称为h
的短名称函数,这样您就不必那么多键入htmlspecialchars
。不要使用htmlentities
,这通常会不必要地编码非ASCII字符,除非你提供正确的$charset
参数,否则它们也会搞乱它们。
(或者,如果您使用的是Zend_View,$this->escape()
。)
输入验证在特定于应用程序的级别上很有用,例如确保电话号码字段包含数字而不是字母。它是 not 可以全局应用的东西,以避免在将字符串放入另一个字符串的上下文时出现的问题 - 无论是在HTML,SQL,JavaScript字符串文字内部还是其中一个许多其他需要逃避的环境。
答案 1 :(得分:2)
如果每次将字符串写入HTML页面时都正确转义字符串,则不会出现任何问题。
%3C
是由网址编码的<
;它由服务器解码。