2012-05-18 10 views
52

Stavo leggendo Does $_SESSION['username'] need to be escaped before getting into an SQL query? e diceva "È necessario sfuggire a ogni stringa che si passa 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. Stackoverflow 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.Cosa significa sfuggire a una stringa?

Ho guardato: Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, remove escape sequences from string in php Potrei andare avanti, ma sono sicuro che si ottiene il punto. Questa non è pigrizia.

+4

PS ho potuto avere appena chiesto un amico e non mi sono reso ridicolo ma ho pensato che ci sarebbe stato un sacco di gente, proprio come me, a chiedermi di che cosa stiano parlando tutti quelli che stanno parlando. – Brett

risposta

95

Scappare una stringa significa ridurre l'ambiguità tra virgolette (e altri caratteri) utilizzati in quella stringa. Per esempio, quando si sta definendo una stringa, in genere lo circondano sia in virgolette doppie o singole:

"Hello World." 

Ma cosa succede se la mia stringa aveva virgolette doppie all'interno di esso?

"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 intorno al mio stringa:

'Hello "World."' 

O posso scappare mie citazioni:

"Hello \"World.\"" 

Qualsiasi citazione che è preceduta da una barra è sfuggito, e inteso a far parte della valore della stringa.

Quando si tratta di query, 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 è stato chiamato "Select", e abbiamo voluto selezionare che:

SELECT select FROM myTable 

Ora abbiamo introdotto una certa ambiguità nella nostra query. All'interno della nostra interrogazione, possiamo ridurre l'ambiguità che utilizzando back-tick:

SELECT `select` FROM myTable 

questo elimina la confusione abbiamo introdotto utilizzando scarsa capacità di giudizio nella scelta di nomi di campo.

Molto di questo può essere gestito per voi semplicemente passando i valori attraverso mysql_real_escape_string(). Nell'esempio riportato di seguito si può vedere che stiamo passando i dati inviati dall'utente attraverso questa funzione per assicurarsi che non causerà alcun problema per la nostra query: esistono

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

Altri metodi per le stringhe in fuga, come ad esempio add_slashes, addcslashes, quotemeta, e di più, anche se ci si accorge che, quando l'obiettivo è quello di eseguire una query di sicurezza, da e grandi sviluppatori preferiscono mysql_real_escape_string o pg_escape_string (nel contesto di PostgreSQL.

+0

hai detto che molto di questo può essere gestito per te semplicemente passando i tuoi valori attraverso 'mysql_real_escape_string()' puoi espandere la tua risposta per dirci cosa non può o è un grande chiedere? – Brett

+0

@Brett Non è un problema, ho aggiunto solo un po 'di più alla fine della risposta. – Sampson

+0

Grazie a @ Jonathan molto apprezzato. – Brett

15

Alcuni caratteri hanno un significato speciale per il database SQL che si sta 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() sfugge \x00, \n, \r, \, ', " e \x1a come questi, quando non sfuggito, può causare problemi precedentemente menzionati che comprende iniezioni SQL con un database MySQL.

+0

@ grazie John questa è stata una buona risposta iniziale. Sono davvero contento che qualcuno abbia fatto altrettanto, perché era anche una risposta valida. – Brett