斐伊川,
我有一个类似“http://project/page1.aspx?userID=5”的查询字符串。如果手动更改'userID'参数,则不会执行该操作。怎么可能?
答案 0 :(得分:3)
这听起来像是一个奇怪的要求。您是否尝试实施某种本土安全措施?如果是这样,你真的不应该。
无论如何,您可以采取的一种方法是获取整个网址http://project/page1.aspx?userID=5
并计算其md5 sum。然后将md5总和追加到最终的URL,例如http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM
。然后在page1.aspx中,您必须验证校验和参数是否正确。
然而,这种方法非常天真,任何人都不需要花很长时间才能找出你使用过的算法。如果他们这样做,他们可以“轻松”更改用户ID并自己计算md5总和。一种更强大的方法是校验和由只有您访问的密钥加密。但我再次质疑你想要这样做的动机,因为其他安全解决方案存在得更好。
答案 1 :(得分:3)
你不能。
HTTP请求中的任何内容(包括URL,查询字符串,cookie,...)都在客户端的控制之下,很容易伪造。
这就是为什么将有效内容列入白名单很重要的原因,因为除了您提示接收的内容之外,客户还可以随意添加任何喜欢的内容。
答案 2 :(得分:3)
<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'>
Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode-->
private string TamperProofStringEncode(string value, string key)
{
System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value)));
}
在'Page1'的页面加载中,调用解码算法来解码查询字符串
try
{
string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj");
Response.Write(DataString);
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
private string TamperProofStringDecode(string value, string key)
{
string dataValue = "";
string calcHash = "";
string storedHash = "";
System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
try
{
dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0]));
storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1]));
calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue)));
if (storedHash != calcHash)
{
//'Data was corrupted
throw new ArgumentException("Hash value does not match");
// 'This error is immediately caught below
}
}
catch (Exception ex)
{
throw new ArgumentException("Invalid TamperProofString");
}
return dataValue;
}
答案 3 :(得分:3)
这是另一个我发现对我的要求非常有用的选项:
4 Guys From Rolla - Passing Tamper-Proof QueryString Parameters
答案 4 :(得分:2)
我最喜欢的是以下内容。它使用HTTP模块透明地编码和解码Querystring,其中显式旨在防止对查询字符串进行篡改。
http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml
当Session不是一个选项时,这是完美的!
答案 5 :(得分:1)
您无法判断是否已手动更改。如果您使用查询字符串,那么您应该确保它是否更改无关紧要。例如如果您使用它来向用户显示其帐户详细信息,则需要检查所选用户,当前用户是否显示错误消息而不是用户数据(如果不是)。
答案 6 :(得分:1)
如果允许用户更改记录5,但不允许更改记录7,则必须在服务器端强制执行此操作。要做到这一点,您需要能够识别用户,方法是要求登录,并为他们提供存储在浏览器cookie中的唯一会话密钥,或者作为url查询字符串中的另一个参数。
人工语言中有丰富的包/模块/库,用于以合理的方式处理身份验证和会话 - 让您自己承担风险:)
答案 7 :(得分:0)
嗯 - 这取决于:)
一种可能性是将userID
放入会话变量中。因此用户无法查看或编辑该值。
如果您有其他方法可以检测该值无效(即不存在或不能用于该用户(您可以通过其他方式识别)或类似用户)您可能会得到在你背后的代码中自己验证输入。
但是您可能知道无法阻止用户更改查询字符串。