ASP MVC Url编码双转义序列

moh*_*mad 8 c# asp.net-mvc encode

我想加密给定网址的Id部分,我使用SHA-1.此算法将id转换为以下字符串:

NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8 = | h1bCRiN5zxexiIhHp + qNEQ0jVh/8fMGiIkeTf30LVdU =

因此,我的最终网址将是这样的:

http://localhost:9432/Product/Edit/NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8=|h1bCRiN5zxexiIhHp+qNEQ0jVh/8fMGiIkeTf30LVdU=
Run Code Online (Sandbox Code Playgroud)

此URL具有一些导致请求失败的字符.例如,url中不允许使用"+".所以我使用HttpUtility.UrlEncode()了加密的Id并得到了这个字符串:

NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8%3D%7ch1bCRiN5zxexiIhHp%2bqNEQ0jVh%2f8fMGiIkeTf30LVdU%3D

现在我的网址是:

http://localhost:9432/Product/Edit/NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8%3d%7ch1bCRiN5zxexiIhHp%2bqNEQ0jVh%2f8fMGiIkeTf30LVdU%3d
Run Code Online (Sandbox Code Playgroud)

但是,使用上面的url会导致以下错误:

该请求包含双转义序列,并在Web服务器上配置请求筛选以拒绝双转义序列.

我可以通过在web.config中插入以下代码来忽略它:

<system.webServer>
   <security>
      <requestFiltering allowDoubleEscaping="true" />
   </security>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)

现在我有两个问题:

  1. 为什么结果HttpUtility.UrlEncode()会导致任何类型的错误.正如我注意到的那样,结果不包含任何网址的非法字符?

  2. 据我所知,put <requestFiltering allowDoubleEscaping="true" />不是一个好的解决方案,因为它会在应用程序中创建一个安全漏洞,那么在这种情况下最好的解决方案是什么?

ala*_*egh 4

HttpUtility.UrlEncode() 的结果不包含错误,它只是对 + 号进行编码,将在 IIS 级别上检测到。默认情况下,IIS 拒绝 URL 中的“+”。您的解决方法将会起作用:

<requestFiltering allowDoubleEscaping="true" />
Run Code Online (Sandbox Code Playgroud)

但正如您所说,它会产生一些安全问题,因为这会使您的网站更容易受到恶意 URL 的攻击。

我建议,要么使用另一种不会生成这些“IIS”敏感字符的加密算法,要么如果您想使用上述解决方法,则需要实施正确的 URL/用户输入验证,以确保您捕获并阻止所有可疑条目。