为什么所有ASP.NET MVC网站都允许并忽略任何URL前面的字符串“/(F())/”?

时间:2017-04-24 17:03:53

标签: asp.net asp.net-mvc iis

我注意到,即使我在网址前加/(F())/这是无稽之谈,对我的ASP.NET网络应用程序的请求也会成功。通常的行动方法很受欢迎。 Request.Url 显示网址​​前缀。因此,如果我请求/(F())/x,则操作会看到Request.Url == "/x"

然后我尝试了其他ASP.NET MVC站点,例如Stack Overflow:

https://stackoverflow.com/(F())/questions/43593952/why-do-all-asp-net-mvc-websites-allow-and-ignore-the-string-f-in-front-o

根据Fiddler的说法,请求按预期进行:

enter image description here

正如您所看到的,请求URL是正确的,并且服务器在没有重定向的情况下回复完整内容。浏览器窗口也显示该URL。

此网址 有效。因此,我得出结论,框架中的 something 会导致重写此请求并删除前缀。看起来Stack Overflow应用程序不知道前缀。

在Windows 7上的.NET 4.6.2上的Visual Studio 2017中创建的新MVC应用程序中也会出现相同的结果。

另一个有趣的受害者:https://www.microsoft.com/(F(blah))/en-us/default.aspx(微软主页)。

字符串(F())并不特别。查看有效的其他字符串的注释,例如/(F(pV0))

由于我的ASP.NET代码对原始URL无效(Request.Url不包含前缀),我似乎甚至无法检测到这种情况并使请求失败。

我还没有确认这是一个MVC问题。似乎很难找到ASP.NET + IIS附带的巨大功能海洋中的罪魁祸首。谁知道默认打开哪些功能?!我认为没有人真正知道:)

至少这是一个搜索引擎优化问题,但我发现不知道发生了什么也令人不安。这就是我正在调查的原因。 这是什么行为以及如何摆脱它?

1 个答案:

答案 0 :(得分:6)

这是由ASP.NET cookieless feature set引起的。现在,URL可能如下所示:

http://example.com/MyWebApplication/(A(XXXX)S(XXXX)F(XXXX))/home.aspx

打破它:

  • A(XXXX):这是Anonymous-ID。它用于标识访问您的应用程序的(匿名)用户。字符串可能会也可能不会被加密,具体取决于部分中的配置设置。
  • S(XXXX):这是会话ID(与V1.1相同)。
  • F(XXXX):这是表单身份验证票证。

由于无cookie模式完全过时,导致SEO问题和混乱,我强烈建议立即禁用所有ASP.NET网站上所有可能的无cookie功能。

  

对于上述每个功能(表单身份验证,匿名身份验证和会话状态),您可以控制是否以及何时使用无Cookie功能,以及何时使用无Cookie功能。控制它的配置设置是:   cookieless =" UseCookies | UseUri | UseDeviceProfile |自动检测"

在我的情况下,我设置:

<anonymousIdentification enabled="false" />
<sessionState ... cookieless="UseCookies" />

您需要根据自己的需要进行调整。

这有希望解决这些URL的生成,但似乎并不妨碍框架(默默地)接受这样的URL。 The documentation claims that a header AspFilterSessionId will be present但我发现事实并非如此。

目前我没有阻止请求到这些不需要的网址的解决方案。