尝试向URL添加哈希以防止URL篡改,但因此包含“+”现在会出现404错误

时间:2014-06-06 10:27:59

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我正在使用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

请参阅:

Hex Code Convertion

2 个答案:

答案 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

希望它可以帮到你