2010-08-25 22 views
5

Attualmente mi sto riprendendo da un attacco XSS e mi sono reso conto che non ho mai disinfettato input su molti dei moduli su il mio sito. Ho usato la funzione Trova nei file di Notepad ++ per cercare $_POST in tutti i miei file PHP e ho ottenuto quasi 5.000 risultati. Ora, davvero non voglio andare e aggiungere manualmente strip_tags a ognuno di questi risultati, ma un rimpiazzo non farebbe il trucco ... e sono un noob totale quando si tratta di cose come le espressioni regolari .

C'è un modo per rendere questo un po 'meno noioso?

risposta

2

si può mettere questo in un file (ad esempio safe.php)

foreach ($_POST as $key => $value) { 
    $_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]); 
} 

Poi messo require_once("safe.php"); in ogni ciascuno dei vostri file php (o un file che tutti i tuoi file PHP già incluso)
E ' un brutto trucco ... ma potrebbe farti risparmiare tempo.

+0

Impressionante.Questo e 'esattamente quello che stavo cercando. –

+0

Questo non riuscirà a proteggere da XSS quando ci sono campi modulo con nomi come 'foo [bar]' o 'foo []' che PHP converte automaticamente in array. – Tgr

+0

@Tgr: sì, questo fallirà assolutamente come hai detto tu, ma penso che abbia avuto l'idea di personalizzare secondo ciò di cui ha bisogno – w00d

6

Hmm, penso array_walk_recursive sarebbe fare il trucco:

function custom_strip(&$val, $index) { 
    $val = strip_tags($val); 
} 
array_walk_recursive($_POST, 'custom_strip'); 
0

Molto semplice. Mettete questo in cima ad ogni file o in un file di intestazione comune che viene chiamato in fin dall'inizio ogni volta:

function mystriptag(&$item) 
{ 
    $item = strip_tags($item); 
} 

array_walk($_POST, mystriptag); 
+0

Questo non riuscirà a proteggere da XSS quando ci sono campi modulo con nomi come 'foo [bar]' o 'foo []' che PHP converte automaticamente in matrici. – Tgr

18

Basta usare array_map().

$Clean = array_map('strip_tags', $_POST); 

Oppure, se si vuole tornare alla variabile $_POST:

$_POST = array_map('strip_tags', $_POST); 

E 'probabilmente una migliore idea anche se per utilizzare una variabile diversa e cambiare tutte le occorrenze di $_POST per $Clean nei file.

0

Si può solo array_mapstrip_tags-$_POST, ma è molto più bello di scrivere una funzione personalizzata per ottenere dati da esso:

function post_data($name) { 
    global $post_cache; 
    if (in_array($name, $post_cache)) { 
     return $post_cache[$name]; 
    } 
    $val = $_POST[$name]; 
    if (is_string($val)) { 
     $val = strip_tags($val); 
    } else if (is_array($val)) { 
     $val = array_map('strip_tags', $val); 
    } 
    $post_cache[$name] = $val; 
    return $val; 
} 

Questo renderà il vostro codice più leggibile (altri che cercano in essa si assume, di norma che $_POST['foo'] è il dato nel campo modulo foo, non qualcosa che è già stato preelaborato, non causerà problemi con plug-in o librerie che tentano di accedere direttamente a $ _POST, rende più facile aggiungere ulteriore logica alla pre-elaborazione $_POST (unescape quando magic quotes sono abilitati è uno comune) senza cacciare tutto il posto s nel tuo codice in cui hai usato i dati POST e ti eviti da enormi mal di testa quando ti accorgi che ci sono alcuni campi POST in cui hai bisogno di tag HTML. In generale, è una pessima idea cambiare direttamente qualsiasi superglobale.

Inoltre, è meglio disinfettare i dati in uscita, non in ingresso. usi differenti richiedono metodi diversi, per esempio, se si utilizza

<div class="user_photo"> 
    <img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" /> 
</div> 

poi $user_name è un vettore di attacco XSS, e strip_tags non aiuta contro di essa a tutti; avresti bisogno di htmlspecialchars. Se i dati dell'utente vengono utilizzati come URL, è necessario un altro metodo per difendersi dagli URL javascript: e così via.