2010-05-11 10 views
8

Hii,Come proteggere dalla manomissione della stringa di query?

Ho una stringa di query come "http://project/page1.aspx?userID=5". L'operazione non verrà eseguita se il parametro 'userID' è stato modificato manualmente. Com'è possibile?

+1

Solo per tipo di chiarire - sto cercando di indovinare nello scenario hai già servito la pagina in b; qualcuno ha cliccato su un pulsante da qualche altra parte e ha ottenuto la pagina "http: //project/page1.aspx? userID = 5". E ora in questa pagina stanno per digitare alcuni valori e non vuoi che si scambino quel 5 nella barra degli indirizzi per un 7, premi "salva" e fai andare il tuo sito web e aggiornando le informazioni dell'utente 7, corretta? – Tom

risposta

3

Hii tutto, grazie per il vostro aiuto ... e ho trovato una sorta di soluzione diversa da altri siti. non so quale sia la soluzione migliore. cioè codificare il valore utilizzando un algoritmo di crittografia e decrittografia ... Il codice di esempio è stato scritto così ...

<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'> 
     Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode--> 


    
private string TamperProofStringEncode(string value, string key) 
{ 
      System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
      System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
      mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 
      return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value))); 
     } 
 

Nel caricamento della pagina di 'Pagina1' chiamare l'algoritmo di decodifica per decodificare la stringa di query

try 
     { 
      string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj"); 
      Response.Write(DataString); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 

private string TamperProofStringDecode(string value, string key) 
    { 
     string dataValue = ""; 
     string calcHash = ""; 
     string storedHash = ""; 

     System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES(); 
     System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); 
     mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key)); 

     try 
     { 
      dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0])); 
      storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1])); 
      calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue))); 

      if (storedHash != calcHash) 
      { 
       //'Data was corrupted 
       throw new ArgumentException("Hash value does not match"); 
       // 'This error is immediately caught below 

      } 
     } 
     catch (Exception ex) 
     { 
      throw new ArgumentException("Invalid TamperProofString"); 
     } 

     return dataValue; 

    } 
+0

Continuo a pensare che potresti farla franca con la sessione. Ma se per qualche ragione rally assolutamente ** ha bisogno ** di fare questo tramite la stringa di query e sono disposti a percorrere quella strada, probabilmente funzionerà in questo modo. Avrei comunque un cattivo odore in bocca. Dipende ancora ... ** Perché ** vuoi questo o ** che cosa esattamente ** vuoi raggiungere? Potresti essere sulla strada sbagliata ... – scherand

+0

Il mio utilizzo è che ho inviato una mail con il contenuto di un link insieme all'ID utente. Quando clicco sul link nella mail navigherai alla pagina, la pagina mostrerà i dettagli di un particolare utente –

1

Non è possibile sapere se è stato modificato manualmente. Se usi stringhe di query, allora tieni hyave per assicurarti che non abbia importanza se viene modificato. per esempio. se lo si utilizza per mostrare all'utente i dettagli dell'account, è necessario verificare se l'utente selezionato, è l'utente corrente e mostrare un messaggio di errore invece di dati utente se non lo è.

+1

Voglio solo aggiungere: ASP.NET ha una sessione, memorizza le informazioni su chi è loggato e controlla il tuo codice se l'utente che ha effettuato l'accesso è autorizzato a vedere i dati – Felix

+0

Certo che puoi. Hash o crittografare la stringa di query utilizzando una chiave segreta condivisa, includere il valore hash o crittografato nella stringa di query, quindi ricalcolarlo e verificarlo prima di utilizzare la stringa di query. – xr280xr

3

Sembra uno strano requisito. Stai cercando di implementare una sorta di sicurezza nazionale? Se è così, davvero non dovrebbe.

In ogni caso, un modo per farlo sarebbe quello di prendere l'intero URL http://project/page1.aspx?userID=5 e calcolare il suo md5 sum. Quindi aggiungi la somma md5 all'URL finale, ad esempio http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM. Quindi in page1.aspx dovrai convalidare che il parametro checksum sia corretto.

Tuttavia, questo approccio è abbastanza ingenuo e non richiederebbe molto tempo a nessuno di capire l'algoritmo che è stato utilizzato. Se lo facessero, potrebbero "facilmente" cambiare l'ID utente e calcolare loro stessi una somma md5. Un approccio più robusto potrebbe essere quello in cui il checksum è stato crittografato da una chiave a cui solo tu hai avuto accesso. Ma ancora una volta devo mettere in discussione il motivo per cui voglio farlo, perché esistono altre soluzioni di sicurezza che sono molto meglio.

+0

Non sarebbe terribilmente vicino a ciò che una sessione (token) fa "gratuitamente" in ASP.NET? Fornisce all'utente un ID più o meno casuale/privo di significato (id di sessione/token) che viene quindi utilizzato per identificare i dati corrispondenti (di sessione). Ho sbagliato? – scherand

+1

@scherand: Sort of ... Nel tuo caso, i dati effettivi verrebbero archiviati lato server, mentre in questo caso i dati (userID = 5) sono memorizzati nell'URL. Può essere aggiunto ai segnalibri, non causerà problemi se si aprono più pagine contemporaneamente, ecc. –

+0

... che fa apparire un buon punto. Se gli utenti ottengono l'accesso a tale URL, non è possibile in seguito rimuovere tale accesso senza implementare un meccanismo di accesso/autorizzazioni o modificare l'algoritmo del checksum. –

0

Bene - Dipende :)

Una possibilità è quella di mettere il userID in una variabile di sessione. Quindi l'utente non può vedere o modificare il valore.

Se si dispone di altri mezzi per rilevare se il valore è valido (cioè non esiste o non può essere per l'utente (che è possibile identificare attraverso qualche altro modo) o simili) si potrebbe ottenere via con la convalida del inserisci te stesso nel codice.

Ma come probabilmente sapete, non è possibile impedire all'utente di modificare la stringa di query.

3

Non è possibile.

Qualsiasi cosa nella richiesta HTTP (incluso URL, stringa di query, cookie, ...) è sotto il controllo del client ed è facile da falsificare.

Questo è il motivo per cui è importante inserire nella lista bianca un contenuto valido, poiché il client può aggiungere arbitrariamente ciò che preferisce in aggiunta a ciò che viene richiesto di ricevere.

+5

Penso che l'OP sia consapevole che (s) non può ** impedire ** all'utente di modificare la stringa di query. Ma - in una certa misura - (s) potrebbe essere in grado di ** proteggere ** l'applicazione da tale stringa di query alterata. E questo è ciò di cui penso sia la domanda. Solo i miei due soldi. – scherand

1

Se l'utente può modificare il record 5, ma non registrare 7, ad esempio, questo deve essere applicato sul lato server. Per fare questo è necessario essere in grado di identificare l'utente, richiedendo un login, e dando loro una chiave di sessione univoca che è memorizzata nel cookie del browser, o come un altro parametro nella stringa di query url.

ci sono pacchetti abbondanti/moduli/librerie in lingue man per trattare con l'autenticazione e le sessioni in modo sensato - rotolo si possiede a vostro rischio e pericolo :)

Problemi correlati