你验证了你的URL变量吗?

时间:2008-10-07 13:01:14

标签: validation url server-side

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

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

7 个答案:

答案 0 :(得分:41)

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

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

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

在最糟糕的情况下,您最终可能会遇到SQL injection,甚至更糟的XSS漏洞。

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

  • 假设你知道它是一个整数,使用int.Parse或者匹配正则表达式“^ \ d + $”。
  • 如果它是一个字符串并且选项有限,请创建一个字典并通过它运行字符串。如果没有匹配,请将字符串更改为默认值。
  • 如果是用户指定的字符串,请将其与严格的正则表达式匹配,例如“^ \ w + $”

答案 1 :(得分:4)

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

答案 2 :(得分:4)

是的,是的,三次是的。

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

答案 3 :(得分:3)

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

答案 4 :(得分: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。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

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