2010-06-30 6 views
3

Je ne suis pas sûr que ce soit le bon chemin mais j'utilise cette fonction pour les entrées. par exemple un formulaire de contact:Empêcher le script intersite en PHP

RemoveXSS(mysql_real_escape_string($_POST['input'])) 

Mais avec la numérisation, il y a ce résultat:

Parameter Name: Query Based 
Parameter Type: FullQueryString 
Attack Pattern: /"ns="alert(0x00058B) 

Je ne peux pas voir quoi que ce soit dans la page ci-dessus en cliquant sur url. Mais pourtant, il y a quelque chose qui ne va pas dans mon code.

///////////

function RemoveXSS($val) 
{ 

$val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val); 

// straight replacements, the user should never need these since they're normal characters 
// this prevents like <IMG SRC=&#X40&#X61&#X76&#X61&#X73&#X63&#X72&#X69&#X70&#X74&#X3A &#X61&#X6C&#X65&#X72&#X74&#X28&#X27&#X58&#X53&#X53&#X27&#X29> 
$search = 'abcdefghijklmnopqrstuvwxyz'; 
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 
$search .= '[email protected]#$%^&*()'; 
$search .= '~`";:?+/={}[]-_|\'\\'; 
for ($i = 0; $i < strlen($search); $i++) { 
    // ;? matches the ;, which is optional 
    // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 

    // &#x0040 @ search for the hex values 
    $val = preg_replace('/(&#[xX]0{0,8}' . dechex(ord($search[$i])) . ';?)/i', $search[$i], 
     $val); // with a ; 
    // &#00064 @ 0{0,7} matches '0' zero to seven times 
    $val = preg_replace('/(&#0{0,8}' . ord($search[$i]) . ';?)/', $search[$i], $val); // with a ; 
} 

// now the only remaining whitespace attacks are \t, \n, and \r 
$ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 
    'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 
    'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
$ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 
    'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 
    'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 
    'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 
    'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 
    'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 
    'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 
    'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 
    'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 
    'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 
    'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 
    'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 
    'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 
    'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 
    'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 
    'onsubmit', 'onunload'); 
$ra = array_merge($ra1, $ra2); 

$found = true; // keep replacing as long as the previous round replaced something 
while ($found == true) { 
    $val_before = $val; 
    for ($i = 0; $i < sizeof($ra); $i++) { 
     $pattern = '/'; 
     for ($j = 0; $j < strlen($ra[$i]); $j++) { 
      if ($j > 0) { 
       $pattern .= '('; 
       $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
       $pattern .= '|'; 
       $pattern .= '|(&#0{0,8}([9|10|13]);)'; 
       $pattern .= ')*'; 
      } 
      $pattern .= $ra[$i][$j]; 
     } 
     $pattern .= '/i'; 
     $replacement = substr($ra[$i], 0, 2) . '<x>' . substr($ra[$i], 2); // add in <> to nerf the tag 
     $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags 
     if ($val_before == $val) { 
      // no replacements were made, so exit the loop 
      $found = false; 
     } 
    } 
} 
return $val; 
} 

Merci à l'avance

+0

Et quelle est votre question? – RageZ

Répondre

8

Cela semble exagéré énorme pour moi. Quel est le problème avec quelque chose comme htmlspecialchars($val) ou

+1

je suis totalement d'accord ... – helle

+0

vous avez raison, j'ai trouvé cette fonction lorsque j'ai cherché des solutions de sécurité. – TheNone

+0

avec plaisir seengee;) – TheNone

3

Vous mélangez la protection de XSS (injection dans le navigateur) et l'injection SQL. Mysql_real_escape_string est utilisé pour échapper la chaîne à utiliser dans une requête SQL, par ex. pour éviter l'injection dans "SELECT * FROM foo WHERE name =". $ name

Un exemple d'une chaîne "mauvaise" serait une commande SQL qui serait exécutée.

Pour la sortie du navigateur, htmlentities() ou htmlspecialchars() peut être utilisé pour échapper une chaîne qui est sortie d'être vulnérable à XSS.

Un exemple d'une chaîne "mauvaise" serait: un utilisateur qui s'enregistre avec un nom qui contient des balises HTML. Si vous publiez le nom de cet utilisateur sans s'échapper, les balises HTML seront injectées.

Il n'y a aucune raison de filtrer manuellement tous les attributs ou balises JavaScript possibles - vous en manquerez certainement de toute façon. htmlentities()/htmlspecialchars() auraient échappé à quelque chose comme

<script language="JavaScript"> 

avec

&lt;script language="JavaScript"&gt; 

si le code serait tout simplement obtenir en toute sécurité affiché par le navigateur au lieu d'être exécuté.

Le résumé est: il existe deux types d'échappement, un pour SQL, un pour HTML. Cela n'a aucun sens de les mélanger.

+0

'" SELECT * FROM foo O WH nom = ". Mysql_real_escape_string ($ name);' est toujours vulnérable à l'injection sql. – rook

2

Le mélange de l'injection sql et des filtres xss est une mauvaise idée. Ce sont des attaques très différentes, et ils utilisent des caractères de contrôle très différents.

Si vous voulez simplement arrêter XSS, utilisez htmlspeiclchars($var,ENT_QUOTES);. Si vous souhaitez uniquement autoriser le html sécurisé, utilisez HTML Purifier.

Si vous souhaitez arrêter l'injection SQL, utilisez des requêtes paramétrées avec PDO.

+0

Rook, j'ai confus! Merci pour votre aide (acceptée un million de fois) – TheNone

Questions connexes