2010-08-25 8 views
5

Ich erhole mich gerade von einem fiesen XSS-Angriff, und erkannte, dass ich Eingaben auf mehreren der Formen auf nicht sterilisiert habe meine Seite. Ich habe Notepad ++ 's In Dateien suchen Funktion verwendet, um in allen meinen PHP-Dateien nach $_POST zu suchen, und bekam fast 5.000 Ergebnisse. Nun, ich möchte wirklich nicht gehen und manuell strip_tags zu jedem dieser Ergebnisse hinzufügen, aber ein Replacement-All würde nicht den Trick tun ... und ich bin ein totaler Noob, wenn es um Dinge wie reguläre Ausdrücke kommt .

Gibt es eine Möglichkeit, dies ein wenig weniger langweilig zu machen?

Antwort

2

können Sie diese in einer Datei speichern, (zB safe.php)

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

setzen Dann require_once("safe.php"); in jeder jeden Ihrer PHP-Dateien (oder eine Datei, die alle Ihre PHP-Datei bereits enthalten)
Es ist ein hässlicher hack .. aber es kann Ihre Zeit sparen.

+0

Ehrfürchtig.Genau das habe ich gesucht. –

+0

Dies kann nicht vor XSS geschützt werden, wenn es Formularfelder mit Namen wie 'foo [bar]' oder 'foo []' gibt, die PHP automatisch in Arrays konvertiert. – Tgr

+0

@Tgr: Ja, das wird absolut fehlschlagen, wie du gesagt hast, aber ich denke, er hat die Idee, entsprechend anzupassen, was er braucht – w00d

6

Hmm, ich denke array_walk_recursive den Trick tun würde:

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

Sehr einfach. Setzen Sie diese auf Ihrer jede Datei oder in einer gemeinsamen Header-Datei, die in dem Anfang jedes Mal aufgerufen wird:

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

array_walk($_POST, mystriptag); 
+0

Das wird nicht vor XSS schützen, wenn es Formularfelder mit Namen wie 'foo [bar]' gibt oder 'foo []', die PHP automatisch in Arrays konvertiert. – Tgr

18

Nur array_map() verwenden.

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

Oder wenn Sie es an den $_POST Variable zurück zu gehen:

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

Es ist wahrscheinlich eine bessere Idee, wenn eine andere Variable zu verwenden und alle Vorkommen von $_POST zu $Clean in Ihren Dateien ändern.

0

Sie könnten nur array_mapstrip_tags-$_POST, aber es ist viel schöner, eine benutzerdefinierte Funktion zu schreiben Daten von ihm zu erhalten:

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; 
} 

Dadurch wird Ihr Code besser lesbar machen (andere in sie sucht, wird im Allgemeinen davon ausgehen, Das $_POST['foo'] ist die Daten im Formularfeld foo, nicht etwas, das Sie bereits vorverarbeitet haben), wird nicht Probleme mit Plugins oder Bibliotheken verursachen, die versuchen, $ _POST direkt zuzugreifen, macht es einfach, mehr Logik zu $_POST Vorverarbeitung hinzufügen (Unescape, wenn magic quotes aktiviert sind, ist eine gemeinsame), ohne den ganzen Ort zu jagen s in Ihrem Code, wo Sie POST-Daten verwendet haben, und Sie vor großen Kopfschmerzen bewahrt, wenn Sie feststellen, dass es einige POST-Felder gibt, in denen Sie HTML-Tags benötigen. Im Allgemeinen ist es eine wirklich schlechte Idee, einen der Superglobals direkt zu ändern.

Außerdem ist es besser, Daten auf Ausgabe, nicht auf Eingabe zu desinfizieren. Verschiedene Anwendungen werden verschiedene Methoden erfordern, zum Beispiel, wenn Sie

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

verwenden dann $user_name ist ein XSS-Angriff Vektor und strip_tags hilft nicht gegen sie überhaupt; Sie würden benötigen. Wenn Benutzerdaten als URL verwendet werden, benötigen Sie eine weitere Methode, um sich gegen javascript: URLs und so weiter zu verteidigen.