ASP MVC Url编码双转义序列

时间:2017-08-07 06:46:01

标签: c# asp.net-mvc encode

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

  

NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8 = | h1bCRiN5zxexiIhHp + qNEQ0jVh / 8fMGiIkeTf30LVdU =

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

http://localhost:9432/Product/Edit/NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8=|h1bCRiN5zxexiIhHp+qNEQ0jVh/8fMGiIkeTf30LVdU=

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

  

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

现在我的网址是:

http://localhost:9432/Product/Edit/NxVhIhrfbZNzyxqtudUZdiv4DdQA9nF1Zn7CueGUiT8%3d%7ch1bCRiN5zxexiIhHp%2bqNEQ0jVh%2f8fMGiIkeTf30LVdU%3d

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

  

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

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

<system.webServer>
   <security>
      <requestFiltering allowDoubleEscaping="true" />
   </security>
</system.webServer>

现在我有两个问题:

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

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

1 个答案:

答案 0 :(得分:1)

HttpUtility.UrlEncode()的结果不包含错误,它只是编码+符号,将在IIS级别检测到。默认情况下,IIS拒绝URL中的“+”。你的工作将起作用:

<requestFiltering allowDoubleEscaping="true" />

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

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