我正在使用Asp.net开发一个项目,并且有一个加密方法。当我用它来加密一个字符串时,它返回一个字符串,其中包含一些像'+'的字符,因为我在查询字符串中使用它返回的值我需要删除这些字符
前:
http://localhost/Cpanel/CompanyInfo/Hotels/EditHotel/VKWbk+G9F6E=
错误:HTTP错误404.11 - 未找到 请求过滤模块配置为拒绝包含双转义序列的请求。
http://localhost/Cpanel/CompanyInfo/Hotels/EditHotel/bprrmsZ6atI=
效果很好
这是我的加密方法:
public static string EncryptString(string Message)
{
string Passphrase = System.Configuration.ConfigurationSettings.AppSettings["CryptographyKey"];
byte[] Results;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
//Hash the passphrase using MD5
MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
byte[] DataToEncrypt = UTF8.GetBytes(Message);
try
{
ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
}
finally
{
TDESAlgorithm.Clear();
HashProvider.Clear();
}
return HttpUtility.HtmlEncode(Convert.ToBase64String(Results));
}
我怎么能这样做?
答案 0 :(得分:1)
似乎你的加密"是base64编码。 Base64仅使用字母数字字符,+字符和等号=字符。平等的性格不会引起任何问题,只有" +" (在URI中被解释为空格)。你可以简单地将.Replace()+与_一起使用,反之亦然,这样就可以在你的主控制器中解决这个问题了。
另一种方法(不需要更改代码)是允许在web.config中进行双重转义:
<system.webServer>
<security>
<requestFiltering allowDoubleEscaping="true"/>
</security>
</system.webServer>
这只适用于IIS,而不适用于ASP.NET Development Server。但是,这带来了一些安全问题。有关详细信息,这里有一篇非常神的文章:http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx
答案 1 :(得分:0)
准备查询字符串值时,请执行以下操作:
Server.UrlEncode(Variable)
然后将其传递给查询字符串。
在阅读查询字符串时使用解码方法如:
Server.UrlDecode("QuerySting");
让我知道任何疑虑。