是否验证了 URL 变量?

Do you validate your URL variables?

提问人:Ryan Rodemoyer 提问时间:10/7/2008 最后编辑:Michael HarenRyan Rodemoyer 更新时间:10/8/2008 访问量:853

问:

当您使用 GET 请求在站点中传递变量时,是否在使用它们之前对其进行验证(正则表达式、过滤器等)?

假设您有 URL http://www.example.com/i=45&p=custform。您知道“i”永远是整数,而“p”永远只包含字母和/或数字。是否值得花时间确保没有人试图操纵这些值,然后重新提交页面?

验证 URL 服务器端

评论


答:

41赞 Alf 10/7/2008 #1

是的。毫无疑问。永远不要相信用户输入。

为了改善用户体验,输入字段可以(恕我直言)在客户端上进行验证。这可以抢占到服务器的往返行程,这只会导致相同的窗体和错误消息。

但是,输入必须始终在服务器端进行验证,因为用户只需在 GET url 中手动更改输入数据或发送构建的 POST 数据即可。

在最坏的情况下,您最终可能会遇到 SQL 注入,甚至更糟的是,XSS 漏洞。

大多数框架已经有一些内置的方法来清理输入,但即使没有这种方式,通常也可以非常轻松地使用常规异常和查找表的组合来清理输入。

  • 假设你知道它是一个整数,请使用 int。将其解析或与正则表达式“^\d+$”匹配。
  • 如果它是一个字符串并且选择有限,请制作一个字典并通过它运行字符串。如果未匹配,请将字符串更改为默认值。
  • 如果是用户指定的字符串,请将其与严格的正则表达式(如“^\w+$”)进行匹配

评论

0赞 jochil 10/7/2008
绝对。。。如果你不这样做,那就太粗心了
0赞 John Rudy 10/7/2008
+1 SQL 注入、跨站点脚本和无效数据操作。验证所有输入的理由聚宝盆!请看 thedailywtf.com/Articles/...,这是有史以来最可怕的例子。
4赞 Dan 10/7/2008 #2

与任何用户输入一样,检查以确保它是您期望的非常重要。所以是的!

4赞 JeeBee 10/7/2008 #3

是的,是的,还有三次是的。

当然,许多 Web 框架会为您做到这一点,例如 Struts 2。

3赞 Alonso 10/7/2008 #4

一个重要原因是检查 sql 注入。 所以,是的,始终清理用户输入。

评论

0赞 Erik 10/7/2008
SQL 注入只能在靠近 SQL 的地方处理(例如参数、准备好的语句),而不是在输入附近。你会拒绝名叫 O'Reilly 的人吗?
0赞 Dave Sherohman 10/8/2008
正确使用 SQL 占位符(假设支持它们的语言/数据库 - 如果您的语言/数据库不支持,请获取现代语言/数据库)无论验证如何,都会使 SQL 注入无效。不过,还有很多其他很好的理由可以验证。
0赞 Treb 10/7/2008 #5

是的,请尽可能彻底地检查它们。在PHP中,我总是检查类型()。IsInt(i), IsString(p)

2赞 Kinjal Dixit 10/7/2008 #6

而不仅仅是其他人在说什么。想象一下一个名为 nc 的查询字符串变量,当用户每页分别选择 10、50 和 100 个结果时,可以看到它的值为 10、50 和 100。现在想象一下有人将其更改为 50000。如果您只是将其检查为整数,则每页将显示 50000 个结果,从而影响您的网页浏览量、服务器负载、脚本时间等。另外,这可能是您的整个数据库。当您有这样的规则(每页 10、50 或 100 个结果)时,您应该另外检查 nr 的值是否仅为 10、50 或 100,如果不是,请将其设置为默认值。这可以只是一个 min(nc, 100),因此如果将 nc 更改为 25、75 等,它将起作用,但如果它看到高于 100 的任何内容,它将默认为 100。

1赞 JoshBerke 10/8/2008 #7

我想强调这一点是多么重要。我知道第一个答案讨论了 SQL 注入和 XSS 漏洞。SQL 注入的最新狂欢是在查询字符串中传递二进制编码的 SQL 语句,如果它发现 SQL 注入漏洞,它将向数据库中的每个文本字段添加一个 http://reallybadsite.com'/>。

作为 Web 开发人员,我们必须验证所有输入,并清理所有输出。

请记住,黑客不会使用IE来破坏您的网站,因此您不能依赖网络上的任何验证。