Diamo una breve recensione del perché è necessaria fuga in diversi contesti:
Se vi trovate in una stringa delimitata preventivo, è necessario essere in grado di sfuggire le virgolette. Se siete in xml, allora avete bisogno di separare "contenuto" da "markup" Se siete in SQL, è necessario separare "comandi", da "dati" Se siete sulla riga di comando, è necessario separare "comandi", da "dati"
Questo è un aspetto veramente di base dell'informatica in generale. Poiché la sintassi che delimita i dati può verificarsi nei DATI, deve esserci un modo per differenziare i DATI da SYNTAX, quindi evadendo.
In programmazione web, i casi in fuga comuni sono: 1. Emissione testo in HTML 2. dati output in HTML attributi 3. Emissione HTML in HTML 4. Inserimento dati in JavaScript 5. dati Inserimento in SQL 6. Inserimento di dati in un comando shell
Ognuno ha implicazioni di sicurezza diverse se gestito in modo errato. QUESTO È DAVVERO IMPORTANTE! Rivediamo questo nel contesto di PHP:
testo in HTML: htmlspecialchars (...)
dati in HTML attributi htmlspecialchars (..., ENT_QUOTES)
HTML in HTML utilizzare una libreria come HTMLPurifier per garantire che solo i tag validi sono presenti.
Dati in Javascript Preferisco json_encode
. Se lo si inserisce in un attributo, è comunque necessario utilizzare # 2, ad esempio
Inserimento di dati in SQL Ogni driver ha una funzione escape() di qualche tipo. È meglio Se stai utilizzando un normale set di caratteri Latin1, addslashes (...) è adatto. Da non dimenticare le virgolette intorno al addslashes() chiamata:
"INSERT INTO Table1 SET field1 = '". addslashes ($ data)."'"
dati sulla linea di comando escapeshellarg() e escapeshellcmd() - leggere il manuale
- prendere questi a cuore, e si eliminerà il 95% * dei comuni rischi per la sicurezza web! (* a indovinare)
Perché utilizzare "ENT_QUOTES" (piuttosto che "ENT_NOQUOTES" come suggerito da me)? –
Io uso ENT_QUOTES per i campi di input con i dati dal database. Quindi se i dati non hanno "o" non chiuderanno la variabile di valore all'interno del tag di input –
Ólafur: sì, nei campi di input (o più in generale gli attributi) ha un certo senso. ;-) –