我需要在URL中使用查询字符串,但需要确保它们没有被篡改。 I found a solution which almost works,但编码的字符串会被我的应用需要使用的服务破坏。谁能想到不同的解决方案?
编辑:我提到的解决方案对我不起作用,因为它生成的Base64编码查询字符串包含“+”。我传递此查询字符串的服务未正确处理“+”,我甚至无法将其编码为“%2B”。我想,我可以用“_”代替它。但是,我想知道是否完全有不同的解决方案。
编辑2:为了更清楚,我参考的解决方案有效,但我想知道替代解决方案。
答案 0 :(得分:4)
您可以加密查询字符串值,然后将其传递到您想要使用的位置,只需将其解密即可。 还查看这些文章...... how-to-encrypt-query-string-parameters-in-asp-net
http://www.codeproject.com/KB/web-security/QueryStringEncryptionNET.aspx
答案 1 :(得分:2)
基本上是一个副本: Security with QueryString values in Asp.net MVC
底线 - 永远不会信任来自用户的输入,特别是在网络上,总是假设用户可以并且将篡改输入。
答案 2 :(得分:2)
您可以计算并传递参数的哈希值以及查询字符串。在着陆页上,再次计算哈希并将其与查询字符串哈希进行比较,如果两者不相同则表示URL已被篡改。
您可以在实用程序类中创建函数,如
const string secretKey = "%%YoUrSeCrEtKeY##";
public static string CreateTamperProofUrl(string pageUrl)
{
try
{
return HttpUtility.UrlEncode(CreateDigest(pageUrl.Trim()));
}
catch (Exception)
{
throw;
}
}
private static string CreateDigest(string pageUrl)
{
string urlToEncode = secretKey + pageUrl + secretKey;
var hasher = new MD5CryptoServiceProvider();
var encoder = new UTF8Encoding();
byte[] hashedDataBytes = hasher.ComputeHash(encoder.GetBytes(urlToEncode));
string signatureData = Convert.ToBase64String(hashedDataBytes);
return signatureData;
}
public static bool IsValidDigest(string pageUrl, string receivedDigest)
{
if (receivedDigest == null)
{
return false;
}
string expectedDigest = CreateDigest(pageUrl);
if (string.Compare(receivedDigest, expectedDigest) != 0)
{
return false;
}
else
return true;
}
在您的目标网页上,只需像这样检查
if (!Page.IsPostBack)
{
if (Request.QueryString["Digest"] != null)
{
// compare the digest
string id = Request.QueryString["fid"];
string digest = Request.QueryString["Digest"];
if (Utility.IsValidDigest(id, digest))
{
lblStatus.ForeColor = System.Drawing.Color.DarkGreen;
lblStatus.Text = "Valid digest received";
}
else
{
lblStatus.ForeColor = System.Drawing.Color.Red;
lblStatus.Text = "Url is tampered!";
}
}
}