我想加密给定网址的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>
现在我有两个问题:
为什么HttpUtility.UrlEncode()
的结果会导致任何类型的错误。我注意到,结果不包含任何网址的非法字符?
据我所知,将<requestFiltering allowDoubleEscaping="true" />
放在一个不是一个好的解决方案,因为它会在应用程序中创建一个安全漏洞,那么在这种情况下最好的解决方案是什么?
答案 0 :(得分:1)
HttpUtility.UrlEncode()的结果不包含错误,它只是编码+符号,将在IIS级别检测到。默认情况下,IIS拒绝URL中的“+”。你的工作将起作用:
<requestFiltering allowDoubleEscaping="true" />
但正如您所说,它会产生一些安全问题,因为这会使您的网站更容易受到恶意网址的攻击。</ p>
我建议您使用另一种不会生成这些“IIS”感知字符的加密算法,或者如果您想使用上述解决方法,则需要实施正确的URL /用户输入验证以确保你抓住并阻止所有可疑的条目。