php escape - Cosa significa sfuggire a una stringa?




for mysql (3)

Scappare una stringa significa ridurre l'ambiguità tra virgolette (e altri caratteri) usati in quella stringa. Ad esempio, quando definisci una stringa, generalmente la circondi tra virgolette doppie o virgolette singole:

"Hello World."

Ma cosa succede se la mia stringa aveva doppie virgolette al suo interno?

"Hello "World.""

Ora ho ambiguità - l'interprete non sa dove finisce la mia stringa. Se voglio mantenere le mie doppie virgolette, ho un paio di opzioni. Potrei usare le virgolette singole attorno alla mia stringa:

'Hello "World."'

Oppure posso sfuggire alle mie citazioni:

"Hello \"World.\""

Ogni citazione preceduta da una barra viene sfuggita e viene considerata parte del valore della stringa.

Quando si tratta di domande, MySQL ha determinate parole chiave che non possiamo usare nelle nostre query senza causare confusione. Supponiamo di avere una tabella di valori in cui una colonna è stata nominata "Seleziona" e volevamo selezionarla:

SELECT select FROM myTable

Abbiamo introdotto alcune ambiguità nella nostra query. All'interno della nostra query, possiamo ridurre tale ambiguità usando back-ticks:

SELECT `select` FROM myTable

Ciò rimuove la confusione che abbiamo introdotto usando un giudizio insoddisfacente nella selezione dei nomi dei campi.

Molto di questo può essere gestito per te semplicemente passando i tuoi valori attraverso mysql_real_escape_string() . Nell'esempio qui sotto puoi vedere che stiamo passando i dati inviati dall'utente attraverso questa funzione per assicurarci che non causerà alcun problema alla nostra query:

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

Esistono altri metodi per l'escaping di stringhe, come add_slashes , addcslashes , quotemeta e altro, anche se scoprirete che quando l'obiettivo è eseguire una query sicura, gli sviluppatori di grandi dimensioni preferiscono mysql_real_escape_string o pg_escape_string (nel contesto di PostgreSQL.

Stavo leggendo È necessario che $ _SESSION ['username'] sia preceduto da escape prima di entrare in una query SQL? e diceva "Devi sfuggire a ogni stringa che passi alla query sql, indipendentemente dalla sua origine". Ora so che qualcosa del genere è davvero di base. Una ricerca su Google ha ottenuto oltre 20.000 risultati. da solo ha avuto 20 pagine di risultati, ma nessuno in realtà spiega cosa sia l'escape di una stringa o come farlo. È appena assunto. Mi potete aiutare? Voglio imparare perché come sempre sto facendo un'app web in PHP.

Ho visto: Inserimento di caratteri di escape , quali sono tutti i caratteri di escape in Java? , Impossibile uscire da una stringa con addcslashes () , carattere Escape , cosa fa veramente mysql_real_escape_string ()? Come posso sfuggire le doppie virgolette da una stringa in php? , MySQL_real_escape_string non aggiunge le barre? , rimuovi le sequenze di escape dalla stringa in php potrei continuare ma sono sicuro che ottieni il punto. Questa non è pigrizia.


Alcuni personaggi hanno un significato speciale per il database SQL che stai utilizzando. Quando questi caratteri vengono utilizzati in una query, possono causare comportamenti imprevisti e / o non intenzionali, incluso consentire a un utente malintenzionato di compromettere il database. Per impedire a questi caratteri di influenzare una query in questo modo, è necessario che siano sfuggiti, o per dirla in un modo diverso, al database deve essere detto di non considerarli come caratteri speciali in questa query.

Nel caso di mysql_real_escape_string() viene \x1a l' \x1a \x00 , \n , \r , \ , ' , " e \x1a quanto questi, quando non sono sfuggiti, possono causare i problemi menzionati in precedenza che includono iniezioni SQL con un database MySQL.


Previene la divulgazione della risposta tramite il dirottamento JSON.

In teoria, il contenuto delle risposte HTTP è protetto dalla stessa politica di origine: le pagine di un dominio non possono ottenere parti di informazioni dalle pagine dell'altro dominio (se non esplicitamente consentito).

Un utente malintenzionato può richiedere pagine su altri domini per suo conto, ad esempio utilizzando un <script src=...> o <img> , ma non può ottenere alcuna informazione sul risultato (intestazioni, contenuto).

Pertanto, se visiti la pagina di un utente malintenzionato, non è possibile leggere la tua email da gmail.com.

Tranne che quando si utilizza un tag script per richiedere il contenuto JSON, il JSON viene eseguito come Javascript nell'ambiente controllato di un utente malintenzionato. Se l'utente malintenzionato può sostituire il costruttore Array o Object o qualche altro metodo utilizzato durante la costruzione di un oggetto, qualsiasi cosa nel JSON dovrebbe passare attraverso il codice dell'aggressore e essere divulgata.

Nota che ciò accade nel momento in cui il JSON viene eseguito come Javascript, non nel momento in cui viene analizzato.

Ci sono più contromisure:

Assicurarsi che il JSON non venga mai eseguito

Posizionando un while(1); dichiarazione prima dei dati JSON, Google si assicura che i dati JSON non vengano mai eseguiti come Javascript.

Solo una pagina legittima può effettivamente ottenere l'intero contenuto, spogliatosi while(1); e analizza il resto come JSON.

Cose come for(;;); sono stati visti su Facebook, ad esempio, con gli stessi risultati.

Assicurarsi che il JSON non sia Javascript valido

Allo stesso modo, aggiungere token non validi prima del JSON, come &&&START&&& , fa in modo che non venga mai eseguito.

Restituisci sempre JSON con un oggetto all'esterno

Questo è il modo consigliato da OWASP per proteggere dal dirottamento JSON ed è quello meno intrusivo.

Analogamente alle contromisure precedenti, si assicura che il JSON non venga mai eseguito come Javascript.

Un oggetto JSON valido, quando non è racchiuso da nulla, non è valido in Javascript:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Questo è comunque valido JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Quindi, assicurandoti di restituire sempre un oggetto al livello più alto della risposta, assicurati che JSON non sia Javascript valido, mentre è ancora valido JSON.

Come notato da @hvd nei commenti, l'oggetto vuoto {} è Javascript valido e sapere che l'oggetto è vuoto può essere di per sé informazioni preziose.

Confronto dei metodi di cui sopra

Il modo OWASP è meno invadente, in quanto non richiede modifiche alla libreria client e trasferisce JSON valido. Non è sicuro se i bug del browser passati o futuri possano sconfiggere ciò, comunque. Come notato da @oriadam, non è chiaro se i dati potrebbero essere trapelati in un errore di analisi attraverso una gestione degli errori o meno (ad esempio window.onerror).

Il modo in cui Google richiede la libreria client per supportare la de-serializzazione automatica e può essere considerato più sicuro in relazione ai bug del browser.

Entrambi i metodi richiedono modifiche laterali del server per evitare che gli sviluppatori inviino involontariamente JSON vulnerabili.





php mysql security escaping