2009-03-18 20 views
34

filter_var è valido per filtrare i dati? Che tipo di dati cattivi filtrerà? Io uso mysql_real_escape_string ma mi chiedo se l'aggiunta di filter_var aiuterà?Filter_var è un buon modo per andare?

+1

Non so perché questo è stato downvoted – Ross

+2

Si dovrebbe cercare di capire meglio quali iniezioni XSS e SQL sono e perché sono possibili invece di chiedere una funzione miracolo per prevenirli. – Gumbo

+2

Aiuterà cosa? Cosa stai cercando di fare che speri che filter_var possa raggiungere? – jmucchiello

risposta

23

Per difendersi dall'iniezione SQL, utilizzare le istruzioni preparate se possibile. In caso contrario, usa mysql_real_escape_string per stringhe, (int) casting o intval() per interi, (float) o floatval() per float e addcslashes ($ input, '% _') per le stringhe da utilizzare all'interno delle istruzioni LIKE. Le cose diventano ancora più complicate quando si tenta di sfuggire alle stringhe da utilizzare all'interno delle istruzioni RLIKE.

per il filtro contenuti HTML, la cosa migliore sarebbe strip_tags (senza passare $ allowable_tags), ma ... voi potrebbero non piacere/lo vogliono, nel qual caso la soluzione più conveniente è:

$escaped = htmlspecialchars($input, ENT_QUOTES, $your_charset); 

A soluzione più affidabile sarebbe utilizzare una libreria come HTML Purifier

Le funzioni di filtro sono OK, ma alcune di esse sono più valide dei filtri. A seconda delle tue esigenze potresti trovarne alcuni utili.

+4

htmlspecialchars() è la cosa giusta da fare per l'output di testo in HTML. strip_tags() perderebbe il contenuto se si volesse utilizzare il carattere "<" legittimo nel testo e non visualizzerebbe "&" correttamente. – bobince

1

Dipende molto da quello che stai cercando di fare, non posso davvero rispondere senza conoscere le specifiche. I possibili filtri e i loro effetti sono elencati qui: Types of filters

+0

Fondamentalmente per filtrare e validare qualsiasi exploit xss o mysql provenienti dall'input dell'utente. – mikelbring

+0

Ci sono troppi modi (http://ha.ckers.org/xss.html) di iniezioni XSS e SQL. Dipende tutto dalla tua applicazione come ha elaborato i dati dell'utente. – Gumbo

17

È possibile regolare filter_var utilizzando lo FILTER_* constants. Sembra che tu stia cercando sanitisation di dati (aggiustando i dati per renderlo sicuro *) piuttosto che validation (controllare che i dati siano sicuri).

Diversi filtri possono aiutare con diversi compiti. Mentre mysql_real_escape_string è ok per sanitizzare i dati per prevenire l'iniezione SQL, non va bene per l'output di dati che possono contenere HTML. Ecco un paio di filtri di userei per le attività quotidiane:

  • FILTER_SANITIZE_SPECIAL_CHARS - utile per la visualizzazione (non rimuovere) il codice HTML, prevenire attacchi XSS e la conversione di simboli per entità HTML.
  • FILTER_SANITIZE_STRING con i flag STRIP_LOW/HIGH - rimuove effettivamente l'HTML (vedere strip_tags).
  • FILTER_SANITIZE_URL - rende sicuri gli URL *.
  • FILTER_SANITIZE_EMAIL - rende sicuri gli indirizzi di posta elettronica, anche se preferirei usare il cugino di convalida prima di memorizzare l'indirizzo.

* Io uso sicuro vagamente, io sono del parere che non si può mai essere troppo sicuri.

-5

Sulla base di alcuni test minori, sono giunto alla conclusione che le costanti di filter_var non sono attendibili.

Ad esempio:

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); // valid 
filter_var('http://.', FILTER_VALIDATE_URL); // valid 
filter_var('[email protected]', FILTER_SANITIZE_EMAIL); // [email protected] 
filter_var('http://.', FILTER_SANITIZE_URL); // http://. 

Questi sono chiaramente valori non validi, ma passano filter_var s' costanti. Non fidarti di filter_var.

+4

L'igienizzazione non è la stessa cosa della convalida. –

+0

@Mathew, sei corretto ma non sono sicuro di cosa abbia a che fare con i problemi con 'filter_var'. Non filtrerà né disinfetterà correttamente correttamente gli input che ho fornito. – eyelidlessness

+13

Per quanto posso vedere in http://tools.ietf.org/html/rfc822 l'indirizzo email è stato formulato correttamente. In particolare, 'c' potrebbe essere registrato come nuovo TLD, e' b-'un dominio al suo interno (' -' è un carattere valido). Non vedo problemi lì. '' Def! Xyz% abc + tag @ [127.0.0.1] 'un indirizzo valido? (Ti risparmio, mi chiedo - lo è.) Non ho trovato rapidamente alcun esempio del nome del dominio, anche se posso dirti che 'dig .' dà una risposta ragionevole e' stackoverflow.com'. restituisce lo stesso IP di 'stackoverflow.com' (sì, punto finale sul primo URL). Sono d'accordo con 'filter_var' e PHP in questo. – Iiridayn

2

Tutto dipende da cosa intendi con un url valido o con un'e-mail valida.

Ad esempio [email protected] - beh, è ​​possibile filtrare i domini di primo livello per escludere .c ma l'elenco dei domini di primo livello non è costante. Inoltre tutti i personaggi sono validi. Anche se questo sembra strano e quasi certamente non è valido, molti filtri regex lo convalidano anche.

Con l'e-mail [email protected] o url http://. se visualizzati o utilizzati nei collegamenti non faranno danno, anche se non vanno da nessuna parte.

Penso che parte del problema sia la questione di quanto si preferiscono i filtri. Se il problema principale è XSS o SQL injection o altrimenti impedire l'input pericoloso, indipendentemente dal fatto che il valore sia utilizzabile può essere irrilevante, quindi questo tipo di filtro può fare il trucco.

Se si desidera assicurarsi che il valore non sia solo sicuro ma anche utilizzabile, è una bestia più ingannevole.

Problemi correlati