奇怪URL 绕过路由,括号大写字母括号任意两个右括号
Weird URL bypassing routing, parenthesis capital letter parenthesis anything two closing parentheses
我今天在工作的网站上偶然发现了一些奇怪的行为。我们的 SEO 顾问想要从 Google 索引中删除一些看起来很奇怪的链接,这是一项看似简单的任务。但事实证明这非常困难。
该网站是 .net MVC 5.2.3 应用程序。我们查看了路由、我们自己的库等。没有什么奇怪的。一段时间后,我们放弃并尝试通过在 web.config 中设置规则将请求重定向到这些 url。原来这些URL:s是无与伦比的!在适当的条件下,URL 的关键部分似乎避免了匹配规则以及稍后在 MVC 应用程序中的路由。
我们将神秘的 URL:s 缩小为 (T(anything))
格式,其中 T 可以是任何大写字母,任何东西都可以是呃,任何东西。它被放置在 URL 的开头,就像它是一个目录一样。在正则表达式中:\([A-Z]\([a-zA-Z0-9]*\)\)
我已经测试并发现了相同的行为:
- .net MVC5 站点
- .net MVC3 站点
- .net Web 表单站点
- http://asp.net
- http://whosebug.com
来自 whosebug.com 的一些示例:
- 绕过路由:https://whosebug.com/(K(jonas))/questions
路由正常 (404):https://whosebug.com/jonas/questions
绕过路由:https://whosebug.com/(G(hello))/users/1049710/jonas-%C3%84ppelgran
- 正常路由 (404):https://whosebug.com/gandhello/users/1049710/jonas-Äppelgran
它似乎没有影响整个网络,所以它应该不是浏览器或 HTTP 问题。一些例子:
- 路由正常 (404):http://php.net/(T(testing))/downloads
- 正常路由 (404):https://www.iana.org/(T(testing))/domains/reserved
谁能解释一下这是怎么回事?
我可以做些什么来禁止这些 URL:s 绕过路由?
显然这是 ASP.NET 中称为 "cookieless session" 的功能。请参阅 MSDN 文档中的 "Cookieless SessionIDs" 部分 here。
基本思想是不再将会话 ID(如果启用会话状态)存储在 cookie 中,而是嵌入到 URL。
我们 (Stack Overflow) 完全禁用会话状态(通过将 sessionState
模式设置为 off
)。据我所知,最终结果是任何时候使用与会话 ID 格式匹配的 URL 之一,该信息就会被简单地丢弃。
None 在 Google 中指向我们的链接中也包含它,这让我认为您的网站可能被配置为在 URL 中实际生成会话 ID?除了禁用该功能,您在这里可能无能为力。虽然,请参阅我上面链接的 MSDN 页面上的 "Regenerating Expired Session Identifiers",了解如何至少防止意外会话共享(如果尚未完成)。
我今天在工作的网站上偶然发现了一些奇怪的行为。我们的 SEO 顾问想要从 Google 索引中删除一些看起来很奇怪的链接,这是一项看似简单的任务。但事实证明这非常困难。
该网站是 .net MVC 5.2.3 应用程序。我们查看了路由、我们自己的库等。没有什么奇怪的。一段时间后,我们放弃并尝试通过在 web.config 中设置规则将请求重定向到这些 url。原来这些URL:s是无与伦比的!在适当的条件下,URL 的关键部分似乎避免了匹配规则以及稍后在 MVC 应用程序中的路由。
我们将神秘的 URL:s 缩小为 (T(anything))
格式,其中 T 可以是任何大写字母,任何东西都可以是呃,任何东西。它被放置在 URL 的开头,就像它是一个目录一样。在正则表达式中:\([A-Z]\([a-zA-Z0-9]*\)\)
我已经测试并发现了相同的行为:
- .net MVC5 站点
- .net MVC3 站点
- .net Web 表单站点
- http://asp.net
- http://whosebug.com
来自 whosebug.com 的一些示例:
- 绕过路由:https://whosebug.com/(K(jonas))/questions
路由正常 (404):https://whosebug.com/jonas/questions
绕过路由:https://whosebug.com/(G(hello))/users/1049710/jonas-%C3%84ppelgran
- 正常路由 (404):https://whosebug.com/gandhello/users/1049710/jonas-Äppelgran
它似乎没有影响整个网络,所以它应该不是浏览器或 HTTP 问题。一些例子:
- 路由正常 (404):http://php.net/(T(testing))/downloads
- 正常路由 (404):https://www.iana.org/(T(testing))/domains/reserved
谁能解释一下这是怎么回事?
我可以做些什么来禁止这些 URL:s 绕过路由?
显然这是 ASP.NET 中称为 "cookieless session" 的功能。请参阅 MSDN 文档中的 "Cookieless SessionIDs" 部分 here。
基本思想是不再将会话 ID(如果启用会话状态)存储在 cookie 中,而是嵌入到 URL。
我们 (Stack Overflow) 完全禁用会话状态(通过将 sessionState
模式设置为 off
)。据我所知,最终结果是任何时候使用与会话 ID 格式匹配的 URL 之一,该信息就会被简单地丢弃。
None 在 Google 中指向我们的链接中也包含它,这让我认为您的网站可能被配置为在 URL 中实际生成会话 ID?除了禁用该功能,您在这里可能无能为力。虽然,请参阅我上面链接的 MSDN 页面上的 "Regenerating Expired Session Identifiers",了解如何至少防止意外会话共享(如果尚未完成)。