【发布时间】:2010-09-15 18:04:00
【问题描述】:
当您使用 GET 请求通过您的站点传递变量时,您是否在使用它们之前对其进行验证(正则表达式、过滤器等)?
假设您有 URL http://www.example.com/i=45&p=custform。你知道“i”总是一个整数,而“p”总是只包含字母和/或数字。是否值得花时间确保没有人试图操纵这些值然后重新提交页面?
【问题讨论】:
标签: validation url server-side
当您使用 GET 请求通过您的站点传递变量时,您是否在使用它们之前对其进行验证(正则表达式、过滤器等)?
假设您有 URL http://www.example.com/i=45&p=custform。你知道“i”总是一个整数,而“p”总是只包含字母和/或数字。是否值得花时间确保没有人试图操纵这些值然后重新提交页面?
【问题讨论】:
标签: validation url server-side
是的。毫无疑问。永远不要相信用户输入。
为了改善用户体验,可以(恕我直言,应该)在客户端验证输入字段。这可以抢占到只导致相同表单和错误消息的服务器的往返行程。
但是,输入必须始终在服务器端进行验证,因为用户只能在 GET url 中手动更改输入数据或发送精心设计的 POST 数据。
在最坏的情况下,您最终可能会遇到SQL injection,甚至更糟的是XSS 漏洞。
大多数框架已经有一些内置的方法来清理输入,但即使没有这个,使用常规异常和查找表的组合来清理输入通常也很容易。
【讨论】:
与任何用户输入一样,非常检查以确保它符合您的预期是非常重要的。所以是的!
【讨论】:
是的,是的,三次是的。
当然,许多 Web 框架都会为您执行此操作,例如 Struts 2。
【讨论】:
一个重要的原因是检查sql injection。 所以是的,始终清理用户输入。
【讨论】:
是的,请尽可能彻底地检查它们。在 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 Injection 的最新进展是在查询字符串中传递二进制编码的 SQL 语句,如果它发现 SQL 注入漏洞,它将在数据库中的每个文本字段中添加一个 http://reallybadsite.com'/>。
作为 Web 开发人员,我们必须验证所有输入并清理所有输出。
请记住,黑客不会使用 IE 来破坏您的网站,因此您不能依赖网络中的任何验证。
【讨论】: