如何以zend形式阻止脚本标记

时间:2012-09-30 05:57:23

标签: php zend-framework validation zend-form

您好,我只是测试自己开发的应用程序并遇到问题。我进入了

<script>window.location = "http://www.google.com";</script>
Zend_Form_Element_Text元素中的

。我按了提交,保存了值。保存值后,我将用户重定向到列表,当它重定向到列表时,脚本标记会执行并转到google.com

我的表单元素看起来像

 $first_name = new Zend_Form_Element_Text('first_name');
 $first_name->setRequired(true)
            ->addFilter('StringTrim')
            ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH']))
            ->setDecorators(array('ViewHelper', 'errors'));

我想知道如何阻止用户输入此类值?是否有内置验证或任何其他方式?

2 个答案:

答案 0 :(得分:1)

为测试你的应用做得好,很多人都不打扰。不要担心在数据库中存储该字符串它不会造成任何伤害,更改它可能会给您带来其他有效条目的问题。如vstm says,请在使用时将其转义。

但是,由于您特别谈到“名字”字段,您可以进行更多验证,例如拒绝其中包含/的任何名称。我不知道任何语言作为名称的一部分。如果有,我很想知道它是如何发音的。你可以将. = \和其他一些人添加到该列表中,但不要太过分。

您应该仔细考虑表单中的每个字段,了解您合理期望接收的输入并相应地验证输入。任何未通过验证的内容都将被拒绝。类似'<script>window.location = "http://www.google.com";</script>'的字符串肯定不会通过对期望某个人姓名的字段的验证。

就个人而言,我从不过滤输入。它要么通过验证并被接受,要么它没有被拒绝。我不能通过过滤它来输出错误的输入,因此它被拒绝并要求用户重新输入他们的数据。例如,在

上使用StripTags过滤器
<script>window.location = "http://www.google.com";</script>

将离开你

  

window.location =“http://www.google.com”;

仍然不是有效名称,应该被拒绝。

您的验证将永远无法在100%的时间内完成,这就是为什么您应该始终从用户输入中收到的值,然后再将它们回显到浏览器。

Zend Framework有一大堆validators你可以使用,不要忘记PHP已经为你提供的validators and filters。正确使用它们可以大大降低恶意输入对您的应用程序或更重要的用户造成伤害的风险。

那些验证器和过滤器可供您使用,但PHP和Zend Framework都不知道您期望的数据类型,因此阅读文档并确切了解它们的工作原理以及如何使用它们非常重要。何时使用它们。

The Web Application Security Project有一个很好的资源,每个网络开发者都应该被迫阅读死亡之痛。

<强> TL;博士
验证输入和转义输出。

答案 1 :(得分:1)

您可以使用过滤器来限制用户的输入。 Read about the filters

Zend Framework中有一个名为Zend_Filter_StripTags的过滤器,它提供了剥离所有或所选标签的选项。以下是网站本身的一个示例。

$filter = new Zend_Filter_StripTags();     
print $filter->filter('<B>My content</B>'); 
     

结果您将获得已剥离的内容“我的内容”。

在您的情况下,以下

$first_name->setRequired(true)
            ->addFilter('StringTrim')
            ->addFilter('StripTags') //Here a add a filter to strip tags
            ->addValidator('StringLength', false, array(2, $metaData['first_name']['LENGTH']))
            ->setDecorators(array('ViewHelper', 'errors'));