2016-11-11 2 views
4

Ich habe viele andere Fragen darüber gelesen, wie man eine Zeichenkette zu "Alpha-numerisch" filtert, aber alle schlagen die Methode preg_replace() vor.Sicherer Weg, alphanumerische Zeichenfolge von Benutzereingabe zu erhalten? (ohne preg_replace)

Nach OWASP:

Funktion preg_replace() sollte nicht mit Eingang unsanitised Benutzer verwendet werden, da die Nutzlast eval sein wird()‘ED13.

preg_replace ("/.*/ e", "System ('echo/etc/passwd')");

Reflexion könnte auch Codeinjektionsfehler haben. Sehen Sie sich die entsprechende Dokumentation an, da es sich um ein erweitertes Thema handelt.

Also wie erreiche ich das ohne preg_replace?

$result = preg_replace("/[^a-zA-Z0-9]+/", "", $_POST['data']); 
// Notice the $_POST['data'] 
+3

Wenn die Daten nicht gültig ist, dann, warum es sich plagen Filterung? Einfach ablehnen: '$ result = ctype_alnum ($ _ POST ['data'])? $ _POST ['data']: null; ' –

+0

' filter_input() 'oder' filter_var() ' – cmorrissey

+0

@cmorrissey probierte filter_ function, ich habe es mit vielen flags/filters versucht, aber die Ausgabe war nie die gleiche wie oben. z. B .: 'filter_var ($ string, FILTER_SANITIZE_STRING, FILTER_FLAG_ENCODE_HIGH)' – Vladimir

Antwort

5

Es gibt kein Problem preg_replace() mit Benutzereingaben zu filtern. Der von Ihnen genannte OWASP-Hinweis bezieht sich auf das Muster, das nicht selbst vom Benutzer eingegeben wird.

Allerdings würde ich sagen, dass die Verwendung gefilterter Eingaben ein Problem für sich ist - Sie sollten stattdessen validieren. Wie in, akzeptieren Sie keine ungültigen Eingaben.

+0

Danke, dass du das für mich geklärt hast. Ich war schockiert, als ich dieses Zitat auf OWASP gelesen habe, da ich preg_place sehr oft benutzt habe. – Vladimir

1

Sie könnten für etwas so gehen:

<?php 
$unsafe_input = 'some"""\'t&%^[email protected]!`hing~~ unsafe \':[]435^%$^%*$^#'; // input from user 

$safe_input = ''; // final sanitized string 

// we want to allow 0-9 A-Z and a-z 
// merge and flip so that we can use isset() later 
$allowed_chars = array_flip(array_merge(range(0, 9), range('A', 'Z'), range('a', 'z'))); 

// loop each byte of the string 
for($i = 0; $i < strlen($unsafe_input); ++$i) 
{ 
    // isset() is lightyears faster than in_array() 
    if(isset($allowed_chars[$unsafe_input[$i]])) 
    { 
     // good, sanitized, data 
     $safe_input.= $unsafe_input[$i]; 
    } 
} 

echo $safe_input; 
1

Nun hatten wir ähnliche Situation und wir verwenden die folgenden:

if (! preg_match('/^[a-z0-9:_\/|-]+$/i', $str)) 
{ 

//do your stuff 
} 
2
  1. Wie andere haben darauf hingewiesen, die OWASP Verwundbarkeit Sie verknüpft haben gilt, wenn Sie den Ausdruck sind die Bewertung, die shouldn Sie Mach es trotzdem nicht.
  2. Meiner Erfahrung nach sind reguläre Ausdrücke für so einfache Operationen, bei denen die in PHP integrierten String-Funktionen ausreichen, äußerst verpönt. Die String-Funktionen sind auch schneller.
  3. Wenn die Daten nicht gültig sind, sollten Sie sie nicht filtern, Sie sollten sie ablehnen.

Beispiel:

$result = ctype_alnum($_POST['data']) ? $_POST['data'] : null; 
+0

Vielen Dank, dass Sie mir die Methode ctype zur Validierung beigebracht haben. – Vladimir

Verwandte Themen