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?
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?
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;
}
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
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 –
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 è.
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
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
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.
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
@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. –
... 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. –
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.
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.
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
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 :)
Il mio preferito è t lui seguente. Utilizza un modulo HTTP per codificare e decodificare in modo trasparente Querystring con lo scopo esplicito di impedire la manomissione della querystring.
http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml
è perfetto quando sessione non è un'opzione!
Ecco un'altra opzione che ho trovato incredibilmente utile per le mie esigenze:
4 Guys From Rolla - Passing Tamper-Proof QueryString Parameters
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