9

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

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

4

7 回答 7

41

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

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

但是,必须始终在服务器端验证输入,因为用户只能在 GET url 中手动更改输入数据或发送精心设计的 POST 数据。

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

大多数框架已经有一些内置的方法来清理输入,但即使没有这个,使用常规异常和查找表的组合来清理输入通常也很容易。

  • 假设您知道它是一个整数,使用 int.Parse 或将其与正则表达式“^\d+$”匹配。
  • 如果它是一个字符串并且选择有限,请制作一个字典并通过它运行字符串。如果您没有得到匹配,请将字符串更改为默认值。
  • 如果它是用户指定的字符串,请将其与严格的正则表达式匹配,例如 "^\w+$"
于 2008-10-07T13:02:41.040 回答
4

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

于 2008-10-07T13:03:03.907 回答
4

是的,是的,三次是的。

当然,许多 Web 框架都会为您执行此操作,例如 Struts 2。

于 2008-10-07T13:03:05.983 回答
3

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

于 2008-10-07T13:05:54.293 回答
2

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

于 2008-10-07T13:30:18.813 回答
1

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

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

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

于 2008-10-08T14:45:43.980 回答
0

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

于 2008-10-07T13:13:51.360 回答