Http Web应用程序:是否应该忽略无关/不需要的查询字符串参数?

Http Web应用程序:是否应该忽略无关/不需要的查询字符串参数?,http,web-applications,rest,query-string,Http,Web Applications,Rest,Query String,我对web应用程序开发还是相当陌生的,所以这可能是一个n00b问题 似乎大多数网站都会默默地忽略他们不需要也不理解的查询字符串参数。例如,github URI通常如下所示: https://github.com/airbnb 现在,如果我只是添加一个伪查询字符串,如: https://github.com/airbnb?foo=bar 页面加载很好,不会抱怨查询字符串 这似乎是一个完全合理的行为,我对其他一些站点进行了现场测试,它们也忽略了无关和/或不必要的查询字符串参数 我的问题是: 1)

我对web应用程序开发还是相当陌生的,所以这可能是一个n00b问题

似乎大多数网站都会默默地忽略他们不需要也不理解的查询字符串参数。例如,github URI通常如下所示:

https://github.com/airbnb
现在,如果我只是添加一个伪查询字符串,如:

https://github.com/airbnb?foo=bar
页面加载很好,不会抱怨查询字符串

这似乎是一个完全合理的行为,我对其他一些站点进行了现场测试,它们也忽略了无关和/或不必要的查询字符串参数

我的问题是:

1) 这是大多数web应用程序的正确行为还是事实行为?(答案大概是肯定的)

2) 如果(1)是肯定的,那么原因仅仅是常识、惯例、简单性等吗?或者像HTTP或REST这样的标准在决定如何处理这一问题上是否有任何指导或兴趣

替代办法是:

  • 显式地防止未知的查询字符串参数,这可能有点笨手笨脚
  • 重定向到URL的“干净”版本,不带假字符串。再说一次,也许这是不必要的

在开发web应用程序时,我一直遵循的做法是只执行预期参数的验证。IMHO,您甚至不应该读取/解析您不期望的任何参数,因为可能性实际上是无限的。假设可以执行如下查询:

而且:

而且:

因此,如果要拒绝每一个不被接受的参数,这肯定会有点势不可挡。仅仅忽略甚至不阅读它们应该是足够安全的

拒绝包含意外参数的请求也会带来额外的挑战,例如:Google Analytics(以及其他跟踪解决方案)可能会使用额外的参数到达您的站点


旁注:如果您的应用程序支持重定向,我建议您阅读以下提示,以防万一:

额外参数的处理,包括post请求上的查询字符串等,完全取决于应用程序。不同的框架表现不同,依赖任何特定的行为都是不明智的

如果您正在实现,我建议您对参数验证绝对严格。这样,您就不必依赖上面提到的任何行为,并且作为额外的好处,它使您可以轻松地为诸如mod_security之类的webapp防火墙编写规则


“在你所接受的内容上保持自由”是造成安全漏洞和互操作性问题的秘诀。

请记住,你不必明确检查无限多个密钥名称中的每一个。你可以看看是否有你不期望的名字,哪一个更容易理解。@Peter当然,你说得对。我突然想到了拒绝意外参数的另一个缺点:Google Analytics(以及其他跟踪解决方案)可能会使用其他参数到达您的网站。作为参考,您能否列出任何可以轻松设置为拒绝带有无关或不需要的查询字符串参数的URL的特定web框架?Aka,要拒绝我在原始问题中给出的github示例,CherryPy将拒绝带有意外查询字符串参数的URL,除非您明确地将
**kwargs
添加到其参数列表中。请注意,querystring参数是URL的一部分;从技术上讲,
?foo=bar
标识不同的资源。如果可以,请按照Steve的建议,拒绝此类URL以获得更好的安全性和互操作性。严格控制何时接受wrt查询参数会导致互操作性问题-URL通常会传递给多个http处理器(缓存、代理、应用程序等),并且查询字符串中的所有参数可能都不适合您。