2010-01-12 3 views
8

L'URL sarebbeChe cosa è "abbastanza sanificazione" per un URL

  1. salvati in un database MySQL
  2. Utilizzato per visualizzare una foto sul profilo dell'utente

farebbe strip_tags() e mysql_real_escape_string() essere abbastanza?

+1

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

risposta

16

"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.
  • Qualsiasi altro tipo di dati dannosi, come i tag HTML all'interno della stringa, deve essere assolutamente ignorato. Cercando di manipolarlo qui ti porterai a mal di testa mentre proverai a "non-manipolarlo" più tardi dopo averlo estratto dal database. Cattivi "dati web" non possono danneggiare il tuo database.

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.
  • usare il modificatore 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

+1 per solo sanificando quando è necessario. Naturalmente, la disinfezione per SQL è * malvagia *, basta usare le query parametrizzate ... – sleske

+0

@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

+0

Cosa intendi per "query parametrizzate"? – aslum

1

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.

0

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?

+0

Tuttavia, l'URL dell'immagine non dovrebbe avere una e commerciale o qualcosa di simile? – aslum

+0

Perché no? Una sceneggiatura è una fonte di immagini perfettamente valida. –

+2

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. –