0

我正在维护一个使用 Umbraco CMS 7.15.7 的旧版 .NET 4.7.2 MVC 应用程序。我们开始收到在 Azure Application Insights 中注册的失败请求,并显示以下消息

A potentially dangerous Request.Path value was detected from the client (:).

我已经看到它与诸如此类的请求有关(以下是通常出现在 Application Insights 日志中的示例请求,我刚刚更改了真实的网站域):

timestamp [UTC]
2021-09-28T21:50:31.1808953Z

name
GET /companies/ https:/www.sample-site.com/companies/sample-company

url
https://www.sample-site.com/companies/ https:/www.sample-site.com/companies/sample-company

success
False

resultCode
400

duration
0.1136

performanceBucket
<250ms

itemType
request
customDimensions
{"_MS.ProcessedByMetricExtractors":"(Name:'Requests', Ver:'1.1')"}

operation_Name
GET /companies/ https:/www.sample-site.com/companies/sample-company

client_Type
PC

client_IP
0.0.0.0

sdkVersion
web:2.9.0-23612

我意识到问题(:) 是因为url最终name以某种方式“加倍”(https://www.sample-site.com/companies/ https:/www.sample-site.com/companies/sample-company)。我的目标不是允许这样的请求,而是找到它们的原因。

以下是我对可能导致此问题的原因的结论:

  • 失败的请求似乎定期发生,并且批量发生 - 每 5-10 小时。一个产品页面永远不会在批量中被调用两次。这让我相信它们可能是由机器人引起的,但是这种模式并不总是很清楚——两个请求之间会有几分钟的间隔。
  • 这些请求似乎主要发生在 Umbraco 中某个节点(在本例中为companies节点)下的产品页面。但是,在 Umbraco 中该节点下的某些产品页面没有出现。
  • 失败的请求包含只有一个“/”的 https:/,这很奇怪,似乎这部分在某些时候被连接起来
  • 节点下的少数成功请求 companies 始终具有 301 状态代码,这使我相信该问题可能与某处的重定向规则损坏有关
  • canonicalUrl在我们为某些产品页面(主要是产品页面节点的属性)更改 Umbraco 中的一些内容后,错误开始发生。但是话又说回来,有些产品页面确实填写了属性,但没有遇到问题。
  • 我永远无法将这些请求与 Application Insights 中的用户或会话相关联

我知道这可能过于具体而无法调试,并且这可能是由几乎任何事情引起的 - 但我确实有一种感觉,它与 Umbraco 有某种关系,所以有人在 Umbraco 方面有经验并且知道该name属性最终如何成为生成的GET /companies/ https:/www.sample-site.com/companies/sample-company可能会导致我找到一些线索?

作为附加信息,以下是对 Umbraco 中同一节点下的产品页面的成功执行请求:

timestamp [UTC]
2021-09-29T07:27:54.2739984Z

name
GET /companies/second-company

url
https://www.sample-site.com/companies/second-company

success
True

resultCode
301

duration
6.4651000000000005

performanceBucket
<250ms

itemType
request
customDimensions
{"_MS.ProcessedByMetricExtractors":"(Name:'Requests', Ver:'1.1')"}

operation_Name
GET /companies/second-company

client_Type
PC

client_IP
0.0.0.0

sdkVersion
web:2.9.0-23612
4

1 回答 1

0

你可以ValidateRequest=false在页面顶部添加。

此外,当您使用 .Net 4.7.2 时,您需要在 web.config 文件中允许以下网址。

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,*,&gt;,%,&amp;,\,?" />
</system.web>

我删除了 (:),原来的默认字符串是

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

检查这些SO1SO2并进行相关讨论。

于 2021-09-30T04:08:09.560 回答