当您使用GET请求在您的网站上传递变量时,您是否在使用它们之前验证它们(正则表达式,过滤器等)?
假设您有网址http://www.example.com/i=45&p=custform。你知道“i”将永远是一个整数,“p”将始终只包含字母和/或数字。是否值得花时间确保没有人试图操纵值然后重新提交页面?
答案 0 :(得分:41)
是。毫无疑问。永远不要相信用户输入。
为了改善用户体验,可以在客户端上验证输入字段(以及恕我直言)。这可以抢先到服务器的往返,只会导致相同的表单和错误消息。
但是,输入必须在服务器端验证始终,因为用户只需在GET URL中手动更改输入数据或发送精心制作的POST数据。
在最糟糕的情况下,您最终可能会遇到SQL injection,甚至更糟的XSS漏洞。
大多数框架已经有一些内置的方法来清理输入,但即使没有这个,通常很容易使用常规异常和查找表的组合来清理输入。
答案 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)
)。