1

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

<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'));

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

4

2 回答 2

1

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

但是,当您专门谈论“名字”字段时,您可能可以进行更多验证,例如拒绝任何带有 a/的名称。我不知道有任何语言将其作为名称的一部分。如果有,我很想知道它是如何发音的。您也可以在该列表中添加. = \和其他一些人,但不要太着迷。

您应该仔细考虑表单中的每个字段,以了解您合理期望接收的输入并相应地验证输入。任何不通过验证的东西都会被拒绝。像这样的字符串'<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 有大量的验证器可供您使用,不要忘记PHP 已经为您提供的验证器和过滤器。正确使用它们,您将大大降低恶意输入伤害您的应用程序或更重要的是您的用户的风险。

这些验证器和过滤器可供您使用,但 PHP 和 Zend 框架都不知道您期望什么样的数据,因此阅读文档并准确了解它们的工作原理、如何使用它们以及何时使用它们是非常重要的使用它们。

The Web Application Security Project有一个极好的资源,每个 Web 开发人员都应该被迫阅读,以致死的痛苦。

tl;dr
验证输入和转义输出。

于 2012-09-30T08:02:12.250 回答
1

您可以使用过滤器来限制来自用户的输入。阅读有关过滤器的信息

Zend 框架中有一个名为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'));
于 2012-09-30T08:27:45.820 回答