我正在使用MVC3,.NET4.5,C#,Razor。
我在Albin的Codeproject之外重用了一些非常有用的代码,通过添加哈希来防止URL篡改。在主要方面运作良好。
然而....
我现在发现我收到404错误:
The request filtering module is configured to deny a request that contains a double escape sequence.
我理解这是因为在网址中包含了“+”,在我的情况下是在哈希中,即:
http://myServer/Controller/Action/Ivz7P+b2ZPmatG6kZaY_IR0az1s=?mode=xxx
生成哈希的代码是:
//Converting the salt in to a byte array
byte[] saltValueBytes = System.Text.Encoding.ASCII.GetBytes(salt);
//Encrypt the salt bytes with the password
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password, saltValueBytes,2);
//get the key bytes from the above process
byte[] secretKey = key.GetBytes(16);
//generate the hash
HMACSHA1 tokenHash = new HMACSHA1(secretKey);
tokenHash.ComputeHash(System.Text.Encoding.ASCII.GetBytes(stringToToken));
//convert the hash to a base64string
token = Convert.ToBase64String(tokenHash.Hash).Replace("/", "_");
似乎我需要一种不使用“+”生成哈希值或替换“+”的方法,但这会使哈希值无效。
最好的方法是生成没有“+”的哈希值。
思考。
EDIT1
似乎我将UrlToken从路由中取出并因此将其附加在URL的末尾,即:
http://myServer/Controller/Action?mode=xxx&urltoken=Ivz7P+b2ZPmatG6kZaY_IR0az1s=
它现在有效。不知道为什么。那么404消失了,但URL篡改机制现在一直都在失败!可能没有关系。
EDIT2
我现在已经通过改变URL篡改代码来从非路由位提取哈希,即在“?”之后。这一切都运行正常,据我所知,我没有打开任何新的漏洞,因为我保留了默认的ASP.NET设置。
EDIT3
请参阅:
答案 0 :(得分:2)
IIS7请求筛选器拒绝包含+字符的URL。您可以通过将其添加到web.config来禁用它:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true" />
</security>
</system.webServer>
或者你可以编码&#39; +&#39;至&#39;%20&#39;通过:
System.Web.HttpUtility.UrlPathEncode(string str)
答案 1 :(得分:1)
我希望我不会在这里获得任何投票,但在向某些POS终端(Verifone,Hypercom和Ingenico)发送此类特殊数据时遇到了问题。
修复它的方法是使用&#34; HttpServerUtility.UrlEncode&#34;来转义URL(或你的哈希/反篡改内容)。并阅读它,&#34; .URLDecode&#34;。这种编码的特殊字符使它们易于携带。
因此,您可能需要使用此功能生成链接。
http://msdn.microsoft.com/en-us/library/zttxte6w(v=vs.110).aspx
希望它可以帮到你