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)
现在我有两个问题:
为什么结果HttpUtility.UrlEncode()
会导致任何类型的错误.正如我注意到的那样,结果不包含任何网址的非法字符?
据我所知,put <requestFiltering allowDoubleEscaping="true" />
不是一个好的解决方案,因为它会在应用程序中创建一个安全漏洞,那么在这种情况下最好的解决方案是什么?
HttpUtility.UrlEncode() 的结果不包含错误,它只是对 + 号进行编码,将在 IIS 级别上检测到。默认情况下,IIS 拒绝 URL 中的“+”。您的解决方法将会起作用:
<requestFiltering allowDoubleEscaping="true" />
Run Code Online (Sandbox Code Playgroud)
但正如您所说,它会产生一些安全问题,因为这会使您的网站更容易受到恶意 URL 的攻击。
我建议,要么使用另一种不会生成这些“IIS”敏感字符的加密算法,要么如果您想使用上述解决方法,则需要实施正确的 URL/用户输入验证,以确保您捕获并阻止所有可疑条目。
归档时间: |
|
查看次数: |
2054 次 |
最近记录: |