2013-04-17 3 views
0

Я реализую приложение, используя asp.net.Как сделать QueryString неизменным?

Я хочу сделать querysting неизменным. если я делаю изменения вручную, необходимо вызвать какое-то исключение.

Как мне реализовать?

+1

Возможно, вы пытаетесь решить неправильную проблему. Вы должны проверить серверную сторону, если пользователь имеет фактическое разрешение делать то, что он запрашивает. Никогда не доверяйте данным, которые вы получаете от клиента. – ZippyV

+0

@ ZippyV В то время как хорошее настроение иметь, когда вы имеете дело с - например, поставщиками платежей, которым требуются POST взад и вперед, вы хотите сохранить хэш для определенных объектов данных, чтобы убедиться, что данные не были вмешался в нападение «человек в середине». –

+0

@ J.Steen Вот где SSL входит. – ZippyV

ответ

1

«Попробуйте зашифровать строку запроса и приложите результирующую строку к строке запроса. При чтении вашего запроса сначала заново зашифруйте обычные параметры и сравните их со строкой. Затем, когда какие-либо параметры будут изменены, хэш не будет соответствовать больше и вы можете бросить исключение.

что-то вроде этого. Найти хороший класс читатель QueryString/записи, чтобы сделать жизнь проще.

private string GetSecureQsToken(string querystring) 
{ 
    Byte[] buffer = Encoding.UTF8.GetBytes(querystring); 
    SHA1CryptoServiceProvider cryptoTransformSha1 = 
    new SHA1CryptoServiceProvider(); 
    string hash = BitConverter.ToString(
     cryptoTransformSha1.ComputeHash(buffer)).Replace("-", ""); 

    return hash; 
} 

private void GoToSecureQsPage() 
{ 
    string qsvalues = "id=1&page=4"; 
    Response.Redirect(string.Format("Default.aspx?{0}&hash={1}", qsvalues, GetSecureQsToken(qsvalues))); 
} 

private void ReadSecureQs() 
{ 
    //here check the normal querystring parameters again against the hash parameter 
    if (GetSecureQsToken("id=1&page=4") != Request.QueryString["hash"]) 
    { 
     throw new Exception("Error here"); 
    } 
} 

Я просто пошел по версии Hash, как это было предложено в комментариях , но да, тогда он снова становится измененным клиентом. Поэтому вам потребуется некоторое шифрование как это:

public class SecureQuerystring 
{ 
    public SecureQuerystring() 
    { 
     m_passPhrase = "#oqT6%hKg"; 
     m_saltValue = "7651273512"; 
     m_initVector = "@1B2c3D4e5F6g7H8"; 
     m_hashAlgorithm = "SHA1"; 
     m_passwordIterations = 5; 
     m_keySize = 128; 
    } 


    private string m_plaintext; 
    private string m_ciphertext; 
    private byte[] m_plaintextbytes; 
    private byte[] m_ciphertextbytes; 
    private string m_passPhrase; 
    private string m_saltValue; 
    private string m_hashAlgorithm; 
    private Int32 m_passwordIterations; 
    private string m_initVector; 
    private Int32 m_keySize; 


    public string plaintext 
    { 
     get { return m_plaintext; } 
     set { m_plaintext = value; } 
    } 


    public string ciphertext 
    { 
     get { return m_ciphertext; } 
     set { m_ciphertext = value; } 
    } 


    public byte[] plaintextbytes 
    { 
     get { return m_plaintextbytes; } 
     set { m_plaintextbytes = value; } 
    } 


    public byte[] ciphertextbytes 
    { 
     get { return m_ciphertextbytes; } 
     set { m_ciphertextbytes = value; } 
    } 


    public string passPhrase 
    { 
     get { return m_passPhrase; } 
     set { m_passPhrase = value; } 
    } 


    public string saltValue 
    { 
     get { return m_saltValue; } 
     set { m_saltValue = value; } 
    } 


    public string hashAlgorithm 
    { 
     get { return m_hashAlgorithm; } 
     set { m_hashAlgorithm = value; } 
    } 


    public Int32 passwordIterations 
    { 
     get { return m_passwordIterations; } 
     set { m_passwordIterations = value; } 
    } 


    public string initVector 
    { 
     get { return m_initVector; } 
     set { m_initVector = value; } 
    } 


    public Int32 keySize 
    { 
     get { return m_keySize; } 
     set { m_keySize = value; } 
    } 

    public string ASCIIEncrypt(string plaintext2) 
    { 
     try 
     { 
      byte[] initVectorBytes = Encoding.ASCII.GetBytes(m_initVector); 
      byte[] saltValueBytes = Encoding.ASCII.GetBytes(m_saltValue); 
      byte[] plainTextBytes = Encoding.ASCII.GetBytes(plaintext2); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(m_passPhrase, saltValueBytes, m_hashAlgorithm, m_passwordIterations); 
      byte[] keyBytes = password.GetBytes(m_keySize/8); 
      RijndaelManaged symmetricKey = new RijndaelManaged(); 
      symmetricKey.Mode = CipherMode.CBC; 
      ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 
      MemoryStream memoryStream = new MemoryStream(); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 
      cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
      cryptoStream.FlushFinalBlock(); 
      byte[] cipherTextBytes = memoryStream.ToArray(); 
      memoryStream.Close(); 
      cryptoStream.Close(); 
      m_ciphertext = Convert.ToBase64String(cipherTextBytes); 
      return "SUCCESS"; 
     } 
     catch (Exception ex) 
     { 
      return ex.Message.ToString(); 
     } 


    } 

    public string ASCIIDecrypt(string ciphertext2) 
    { 
     try 
     { 
      byte[] initVectorBytes = Encoding.ASCII.GetBytes(m_initVector); 
      byte[] saltValueBytes = Encoding.ASCII.GetBytes(m_saltValue); 
      byte[] cipherTextBytes = Convert.FromBase64String(ciphertext2); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(m_passPhrase, saltValueBytes, m_hashAlgorithm, m_passwordIterations); 
      byte[] keyBytes = password.GetBytes(keySize/8); 
      RijndaelManaged symmetricKey = new RijndaelManaged(); 
      symmetricKey.Mode = CipherMode.CBC; 
      ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes); 
      MemoryStream memoryStream = new MemoryStream(cipherTextBytes); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 
      byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 
      int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 
      memoryStream.Close(); 
      cryptoStream.Close(); 
      m_plaintext = Encoding.ASCII.GetString(plainTextBytes); 
      return "SUCCESS"; 


     } 
     catch (Exception ex) 
     { 
      return ex.Message.ToString(); 
     } 


    } 


} 

Так добавить к qyerstring в ASCIIEncrypt («yourquerstring без шифрования строки») и при чтении читать нормальные QS снова и Счетчик сравнение хэша в СМО к результату.

+0

Не шифровать - хэш. http://stackoverflow.com/questions/326699/difference-between-hashing-a-password-and-encrypting-it –

+0

Я пробовал технологию шифрования, но это привело к сложностям. Можете ли вы дать мне другое предложение? – Siddharth

+0

Ничто не мешает клиенту самостоятельно вычислять хеш. – ZippyV

Смежные вопросы