L'URL sarebbeChe cosa è "abbastanza sanificazione" per un URL
- salvati in un database MySQL
- Utilizzato per visualizzare una foto sul profilo dell'utente
farebbe strip_tags() e mysql_real_escape_string() essere abbastanza?
L'URL sarebbeChe cosa è "abbastanza sanificazione" per un URL
farebbe strip_tags() e mysql_real_escape_string() essere abbastanza?
"La pulizia completa" dipende completamente dall'ambiente di cui si sta parlando. La sanitizzazione per MySQL deve essere considerata interamente separata da da sanitizzazione per l'output Web e dovresti gestirli separatamente per evitare un sacco di problemi.
igienizzante per MySQL
mysql_real_escape_string()
sarà sterilizzare un pezzo di dati e renderlo sicuro di mettere all'interno di una query SQL.igienizzante per l'uscita
htmlspecialchars($val)
al momento dell'uscita impedirà qualsiasi tag dannosi da essere reso, perché <
e >
caratteri vengono convertiti nelle loro rappresentazioni di entità e non resi come delimitatori di tag.ENT_QUOTES
se si è l'output di qualcosa che è dentro l'attributo citato di un elemento HTML, come ad esempio <input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />
Questo dovrebbe essere tutto il necessario, a meno che non si hanno esigenze particolari. strip_tags()
non dovrebbe essere utilizzato per la sanitizzazione, in quanto può essere ingannato con HTML mal formato. La sanitizzazione è un obiettivo degno, e se riesci a tenere separati i tuoi contesti, ti imbatterai in meno problemi con la manipolazione dei dati tra di loro.
+1 per solo sanificando quando è necessario. Naturalmente, la disinfezione per SQL è * malvagia *, basta usare le query parametrizzate ... – sleske
@sleske - sì, questa è la saggezza prevalente in questi giorni. Sanitizzare per SQL non è il male però. Molti sistemi utilizzeranno versioni o driver di database meno recenti e potrebbero non avere accesso a MySQLi. L'unica ragione per cui l'igienizzazione si ripresenta è perché le persone * dimenticano di farlo *. Le query preparate non fanno altro che semplificare la disinfezione manuale (tra gli altri vantaggi). – zombat
Cosa intendi per "query parametrizzate"? – aslum
Probabilmente è più sicuro e meglio chiamare htmlentities() sulla stringa anziché contare su strip_tags().
strip_tags() non rimuoverà i caratteri HTML speciali come '"&
ad esempio, se il codice è:
<img src="<?= strip_tags($myVar) ?>">
e
$myVar = '">something goes here<';
poi si finisce con:
<img src="">something goes here<">
Quale è chiaramente la radice di un buco XSS; un vero e proprio exploit è lasciato come esercizio per il lettore.
inizialmente ho upvoted risposta di Frank, ma il pensiero di un problema: htmlentities() si rompono gli URL di legge come questo:
http://www.mywebsite.com/profile?id=jojo&w=60&h=60
Forse strippaggio parentesi angolari + mysql_real_escape sarebbe sufficiente?
Tuttavia, l'URL dell'immagine non dovrebbe avere una e commerciale o qualcosa di simile? – aslum
Perché no? Una sceneggiatura è una fonte di immagini perfettamente valida. –
htmlentities() funzionerà correttamente su quell'URL. In effetti, la codifica e come & nei tuoi attributi è richiesta dagli standard. '' è html valido (e il browser interporrà l'URL come 'example.com/? A & b' come previsto). D'altra parte, '' non è valido, ma i browser probabilmente faranno comunque la cosa di wright. Caso in questione, se si Visualizza origine sull'URL nel tuo post, vedrai che SO utilizza & nell'attributo href. –
Ho ricevuto alcune buone risposte a una domanda simile; controlla http://stackoverflow.com/questions/549987/che-è-il-best-way-to-filter-urls-for-input se desideri. La soluzione migliore è probabilmente per ricostruire completamente l'URL come suggerisce la risposta di Mike Boers. – JAL