提问人:Ryan Rodemoyer 提问时间:10/7/2008 最后编辑:Michael HarenRyan Rodemoyer 更新时间:10/8/2008 访问量:853
是否验证了 URL 变量?
Do you validate your URL variables?
问:
当您使用 GET 请求在站点中传递变量时,是否在使用它们之前对其进行验证(正则表达式、过滤器等)?
假设您有 URL http://www.example.com/i=45&p=custform。您知道“i”永远是整数,而“p”永远只包含字母和/或数字。是否值得花时间确保没有人试图操纵这些值,然后重新提交页面?
答:
是的。毫无疑问。永远不要相信用户输入。
为了改善用户体验,输入字段可以(恕我直言)在客户端上进行验证。这可以抢占到服务器的往返行程,这只会导致相同的窗体和错误消息。
但是,输入必须始终在服务器端进行验证,因为用户只需在 GET url 中手动更改输入数据或发送构建的 POST 数据即可。
在最坏的情况下,您最终可能会遇到 SQL 注入,甚至更糟的是,XSS 漏洞。
大多数框架已经有一些内置的方法来清理输入,但即使没有这种方式,通常也可以非常轻松地使用常规异常和查找表的组合来清理输入。
- 假设你知道它是一个整数,请使用 int。将其解析或与正则表达式“^\d+$”匹配。
- 如果它是一个字符串并且选择有限,请制作一个字典并通过它运行字符串。如果未匹配,请将字符串更改为默认值。
- 如果是用户指定的字符串,请将其与严格的正则表达式(如“^\w+$”)进行匹配
评论
与任何用户输入一样,检查以确保它是您期望的非常重要。所以是的!
是的,是的,还有三次是的。
当然,许多 Web 框架会为您做到这一点,例如 Struts 2。
一个重要原因是检查 sql 注入。 所以,是的,始终清理用户输入。
评论
是的,请尽可能彻底地检查它们。在PHP中,我总是检查类型()。IsInt(i), IsString(p)
而不仅仅是其他人在说什么。想象一下一个名为 nc 的查询字符串变量,当用户每页分别选择 10、50 和 100 个结果时,可以看到它的值为 10、50 和 100。现在想象一下有人将其更改为 50000。如果您只是将其检查为整数,则每页将显示 50000 个结果,从而影响您的网页浏览量、服务器负载、脚本时间等。另外,这可能是您的整个数据库。当您有这样的规则(每页 10、50 或 100 个结果)时,您应该另外检查 nr 的值是否仅为 10、50 或 100,如果不是,请将其设置为默认值。这可以只是一个 min(nc, 100),因此如果将 nc 更改为 25、75 等,它将起作用,但如果它看到高于 100 的任何内容,它将默认为 100。
我想强调这一点是多么重要。我知道第一个答案讨论了 SQL 注入和 XSS 漏洞。SQL 注入的最新狂欢是在查询字符串中传递二进制编码的 SQL 语句,如果它发现 SQL 注入漏洞,它将向数据库中的每个文本字段添加一个 http://reallybadsite.com'/>。
作为 Web 开发人员,我们必须验证所有输入,并清理所有输出。
请记住,黑客不会使用IE来破坏您的网站,因此您不能依赖网络上的任何验证。
评论