2012-01-12 73 views
0

我開發與Asp.net項目,並有一個加密方法。當我使用它來加密字符串,它返回一個包含像一些字符的字符串「+」因爲我在我的查詢字符串使用其返回值,我需要刪除這些字符如何從返回的值刪除非法字符FO加密方法查詢字符串使用瓦爾

例如:

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

只是一個小注:歐洲央行是不是一個安全的塊加密模式。這是一個非常明顯的例子應該立即清楚,爲什麼:[圖片來源:Wikipedia(https://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29)。我建議使用CBC模式。 – Darhuuk 2012-01-12 09:45:32

+0

@Darhuuk,謝謝,我會檢查一下,你認爲它會解決我的問題嗎? – 2012-01-12 09:48:39

+0

不,分塊密碼模式與您的問題無關。這是由於將加密的字符串轉換爲base64編碼,如下面的答案中所述。 – Darhuuk 2012-01-12 09:51:07

回答

0

當您準備查詢字符串值,請執行:

Server.UrlEncode(Variable) 

,然後通過它來查詢字符串。

在閱讀查詢字符串使用方法的時候喜歡解碼:

Server.UrlDecode("QuerySting"); 

讓我知道的任何問題。

+0

AA任何問題,讓我來測試它。我會評論你 – 2012-01-12 09:36:10

+0

我已經改變了我的q和把加密方法,檢查它現在請 – 2012-01-12 09:39:23

+0

依然是面臨同樣的錯誤,如果是,發佈你的代碼以傳遞querystring到另一個頁面。 – 2012-01-12 09:41:09

1

看來你的「加密」是一個base64編碼。 Base64只使用字母數字字符,+字符和equal =字符。等號不會引起任何問題,只有「+」(它被解釋爲URI中的空格)。你可以簡單地string.Replace()與_,反之亦然,這是在你的主控制器中工作。

另一種方法(這需要更改代碼)是允許雙在你的web.config逃脫:

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"/> 
    </security> 
</system.webServer> 

這隻會在IIS下工作,不與ASP.NET開發服務器。但是,這帶來了一些安全問題。有關詳細信息,這裏是覆蓋這個非常難得的文章:http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

+0

我已經改變了我的q和把加密方法,檢查它現在請 – 2012-01-12 09:39:33