我需要在URL中使用查询字符串,但需要确保它们没有被篡改。I found a solution which almost works,但是编码的字符串被我的应用程序需要使用的服务弄乱了。有人能想出不同的解决方案吗?
编辑:我提到的解决方案对我不起作用,因为它生成的Base64编码查询字符串包含"+“。我传递此查询字符串的服务不能正确处理"+",我甚至不能将其URL编码为"%2B“。我想我可以用"_“来代替它。然而,我想知道是否有完全不同的解决方案。
编辑2:更清楚地说,我引用的解决方案是有效的,但我想知道替代解决方案。
发布于 2009-12-03 14:53:52
您可以加密您的querystring值,然后传递它,在您想要使用的地方,只需解密它。也可以查看这些文章...how-to-encrypt-query-string-parameters-in-asp-net
http://www.codeproject.com/KB/web-security/QueryStringEncryptionNET.aspx
发布于 2009-12-03 14:53:14
基本上是Security with QueryString values in Asp.net MVC的复制品
底线-永远不要相信用户的输入,特别是在web上,总是假设用户可以并将篡改输入。
发布于 2014-11-06 13:22:30
您可以计算参数的散列并将其与查询字符串一起传递。在登录页面上,再次计算散列,并将其与查询字符串散列进行比较,如果两者不相同,则意味着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!";
}
}
}https://stackoverflow.com/questions/1838138
复制相似问题