Nascondere le stringhe di query logicamente?

2

Mi sento a disagio quando utilizzo parametri della stringa di query come:

http://xyz.com/default.aspx?carId=1129&country=uk&uniqueId=98745DVF4563VVf1259

Preferisco usare qualcosa che non dovrebbe avere senso per chiunque stia cercando di trovare un senso dall'URL:

?a=1129&b=uk&c=98745DVF4563VVf1259

(dopo tutte le informazioni di questa query sono disponibili solo per il mio uso)

In primo luogo, questa è una buona cosa da fare? (Intendo nascondere la logica della stringa di query dell'utente)

Se lo è, c'è un modo, che internamente gli sviluppatori possono usare carId , country e uniqueId nel codice, ma esternamente l'url usa a , b e c rispettivamente?

Quindi se qualcuno va a
?a=1129&b=uk&c=98745DVF4563VVf1259

quando faccio Request.QueryString["carId"]

Dovrei ottenere 1129.

Questo può essere fatto?

    
posta M. Ali Iftikhar 12.09.2013 - 15:09
fonte

9 risposte

5

È positivo che tu stia pensando alla sicurezza del tuo server.

L'offuscamento dei nomi dei parametri bloccherà solo gli aggressori più occasionali.

Potresti prendere in considerazione la crittografia dell'intera stringa di parametri e inviare il risultato al server. Questo è un mezzo di sicurezza più complesso e viene fornito con una serie di pro e contro (programmazione, URL lunghi e confusi). In particolare, poiché la crittografia verrà eseguita sul nodo finale, un determinato utente malintenzionato sarà probabilmente in grado di romperlo localmente. Ma di nuovo - con uno sforzo maggiore.

Alla fine, devi prendere la decisione su quanto ti ritieni dedicato agli aggressori, spesso determinato dal valore del premio, e quanto saranno dirompenti le loro azioni. Sulla base di questo, selezionare un livello di sicurezza adeguatamente elevato.

Nel tuo esempio, quanto è grave se qualcuno invia un URL modificato? Non vedranno nulla? un messaggio di errore? un risultato diverso? un risultato diverso, uno che doveva essere privato di qualcun altro? possono mandare in crash il tuo server? possono prendere il controllo del tuo server? possono hackerare negli account degli altri utenti? La risposta a questa domanda ti aiuterà a guidarti.

    
risposta data 12.09.2013 - 16:51
fonte
3

Chi e cosa stai cercando di evitare?

Se stai cercando di proteggere i valori della stringa di query da un utente malintenzionato che sta tentando di intercettare il traffico tra te e un utente valido, utilizza HTTPS. In questo caso, la messa in sicurezza dello strato di trasporto ti darà la maggior parte del botto e sarà il modo più semplice e diretto per implementarlo. Gli hacker non saranno in grado di dare un senso a qualsiasi cosa tu stia inviando avanti e indietro, tanto meno i singoli parametri passati nella tua stringa di query.

Se stai cercando di proteggere i valori della tua stringa di query da un utente malintenzionato della tua applicazione, allora penso che probabilmente stai andando nel modo sbagliato. Innanzitutto, devi considerare il fatto che, per consentire al client di inviarti una stringa di query crittografata, dovranno prima creare una stringa di query crittografata. Come possono farlo senza sapere in modo specifico quali parametri e valori devono essere crittografati? Nel caso di un'app Web, impedire a un utente di vedere quale logica stai utilizzando per creare e crittografare una stringa di query sarebbe quasi impossibile.

In secondo luogo, devi chiederti perché è così pericoloso per un utente essere in grado di manipolare questa stringa di query come meglio ritengono opportuno? Una ragione potrebbe essere che sono in grado di vedere le informazioni per le quali non sono autorizzati. Ad esempio, potrei modificare carId con un valore arbitrario 123, e quindi ottenere accesso illegale alle informazioni su quell'auto. Anziché evitarmi di inviarti quel numero, controlli la richiesta quando arriva e convalidi se sono effettivamente autorizzato a vedere quei dati. In caso contrario, non inviarlo, è così semplice.

Se un utente è in grado di trasferire valori che potrebbero in qualche modo interrompere l'app, allora la risposta è di convalidare e disinfettare il tuo input. Se mi passa carId=-1 o carId=DROP+TABLE+[Cars] fa esplodere il tuo database, quindi assicurati semplicemente di non accettare quei valori! If carId <=0 throw new ArgumentException("carId") per esempio.

    
risposta data 12.09.2013 - 19:48
fonte
1

firstly is this a good thing to do? (i mean to hide logic of you query string)?

Io non la penso così Un utente malintenzionato può comunque modificare i parametri della stringa di query a proprio piacimento, rendendogli leggermente più difficili per lui, a scapito della complessità aggiunta al tuo sistema.

    
risposta data 12.09.2013 - 15:18
fonte
1

Bene, in realtà puoi nascondere facilmente le stringhe di query in MVC Asp.net senza offuscare.

L'idea generale è di creare almeno due percorsi per l'url con la stringa di query. Nel / i percorso / i in cui si desidera poter accedere alle persone, creare un metodo intermedio che reindirizzi all'azione in cui si desidera restituire la vista. Il 2 ° percorso accederà direttamente a quell'azione che ho menzionato prima. Nel metodo intermedio, dici a un database di aumentare il valore di se questa pagina è stata aperta prima di 1 .

Potresti dover pensare alla prossima parte per un paio d'ore prima di capire perché funziona il 99% delle volte. Alla fine del metodo intermedio, riporta il valore a 0! Nell'azione che restituisce una vista, fallo in modo che la vista che vuoi tornare possa essere restituita solo se il valore è impostato su 0! Tuttavia, prima che venga restituita la vista, impostare il valore su 1!

Mentre, questo metodo non è sicuro al 100%. Penso che sia l'unica implementazione che usa solo basi e molto poco codice. Obsfucating non ha reso inaccessibili gli URL delle stringhe di query. Rende solo più difficile per le persone accedere al sito web.

    
risposta data 13.07.2015 - 12:50
fonte
0

potresti creare una sorta di classe intermedia o semplicemente un metodo che associa i tuoi nomi di stringhe di query semplici a nomi offuscati, come:

string ObfuscateQueryString(string myString)
{
     switch(myString)
     {
         case "CardId":
              return "a";
              break;
         case "Country":
              return "b";
              break;
     }
}

quindi usalo in questo modo

Request.QueryString[Obfuscate("CardId")]

naturalmente questo è un progetto stupido per il metodo, ma ti viene l'idea che puoi progettarne uno più intelligente.

    
risposta data 12.09.2013 - 16:59
fonte
0

Puoi offuscare la stringa di query avendo una semplice mappatura uno a uno. Puoi metterlo in una sezione di configurazione web personalizzata o qualsiasi altra cosa soddisfi le tue esigenze. Puoi esaminare l'uso del modulo di riscrittura degli URL: non sarà bello, ma dovrebbe funzionare. Per esempio. riscrivi carId to foo.

Detto questo, se la stringa di query è solo per uso personale, non usarla. Trova un metodo alternativo. È una questione di tempo prima che qualcuno lo capisca e causi qualche danno.

    
risposta data 12.09.2013 - 17:09
fonte
0

In passato, quando lavoravo su applicazioni web usando id da querystrings per cercare dati potenzialmente sensibili, ho usato due campi combinati per migliorare la sicurezza, ad es. l'ID utente e l'indirizzo email dell'utente, quindi nel codice lato server che controlla che l'ID passato sia corretto per quell'indirizzo email.

userId = Request.Querystring("userId")
userEmail = Request.Querystring("userEmail")

userObj = db.getUser(userId)
if(userObj.email == userEmail)
    //all good
else
   //someone's made a mistake / being naughty with the querystring

Senza dubbio gli hacker dedicati potrebbero aggirare questo (e la maggior parte delle misure di sicurezza), ma al momento sembra appropriato al livello di sicurezza richiesto e impedisce la semplice modifica del ID utente per visualizzare i dati di altre persone.

Spero che questo sia utile / vagamente rilevante per la tua situazione.

    
risposta data 12.09.2013 - 17:43
fonte
0

Molti metodi possono essere usati per stringhe di query .. Preferisco usare la scrambling / descrambling. Devi fare è solo scramble l'intera stringa come ..

string strQS = "id=23&Name=hagsh";
string QueryString1 = ScrambleString(strQS);
Response.Redirect("test.aspx?Query=" + QueryString1 );

all'altra estremità, basta invertire i passaggi ...

Basta google per l'algoritmo Scramble / Descramble..Puoi essere pronto dll ..

    
risposta data 30.07.2015 - 13:56
fonte
-3

potresti anche utilizzare un metodo che ottiene un hash per il nome della stringa di query, quindi usa l'hash come nuovo nome della stringa di query. in questo modo sarà ancora più fastidioso per gli estranei.

Esempio:

string GetMD5Hash (sring myString)
{
     // here goes the MD5 hash generation code.

     return myHash;
}

quindi usalo in questo modo

Request.QueryString[GetMD5Hash("CardId")]

in questo modo sarà simile all'URL

?
25e262bf23ec0aebbcf81c545e1e7460 = 1129
&
e909c2d7067ea37437cf97fe11d91bd0 = uk &
eed6e175b82da657ccbc6c2a1479c31f = 98745DVF4563VVf1259

Ho rotto il link in pezzi per renderlo più chiaro.

    
risposta data 12.09.2013 - 17:05
fonte

Leggi altre domande sui tag