2008-10-01 5 views
2

Dans mon application web php, supposons que je veuille faire un effort supplémentaire et en plus d'être un gangster et d'être anxieux à propos de la désinfection de mes entrées, je veux aussi m'assurer qu'aucun JavaScript n'est produit dans les chaînes que j'insère dans les modèles html.Vérification et non impression de JavaScript dans les données générées?

Existe-t-il un moyen standard de m'assurer que je ne mets pas JavaScript dans le contenu html généré?

Répondre

0

pas exactement un moyen standard; parce que si vous faisiez: <img src="${path}"> et ${path} étendu à http://p0wned.com/jpg.jpg" /><script src="p0wned.com/js.js"/>

Quoi qu'il en soit, j'aime cette expression régulière:

#from http://www.perlmonks.org/?node_id=161281 
sub untag { 
    local $_ = $_[0] || $_; 
# ALGORITHM: 
# find < , 
#  comment <!-- ... -->, 
#  or comment <? ... ?> , 
#  or one of the start tags which require correspond 
#   end tag plus all to end tag 
#  or if \s or =" 
#   then skip to next " 
#   else [^>] 
# > 
    s{ 
    <    # open tag 
    (?:    # open group (A) 
     (!--) |  # comment (1) or 
     (\?) |  # another comment (2) or 
     (?i:   # open group (B) for /i 
     (TITLE | #  one of start tags 
      SCRIPT | #  for which 
      APPLET | #  must be skipped 
      OBJECT | #  all content 
      STYLE  #  to correspond 
     )   #  end tag (3) 
    ) |   # close group (B), or 
     ([!/A-Za-z]) # one of these chars, remember in (4) 
    )    # close group (A) 
    (?(4)   # if previous case is (4) 
     (?:   # open group (C) 
     (?!   #  and next is not : (D) 
      [\s=]  #  \s or "=" 
      ["`']  #  with open quotes 
     )   #  close (D) 
     [^>] |  #  and not close tag or 
     [\s=]  #  \s or "=" with 
     `[^`]*` | #  something in quotes ` or 
     [\s=]  #  \s or "=" with 
     '[^']*' | #  something in quotes ' or 
     [\s=]  #  \s or "=" with 
     "[^"]*"  #  something in quotes " 
    )*   # repeat (C) 0 or more times 
    |    # else (if previous case is not (4)) 
     .*?   # minimum of any chars 
    )    # end if previous char is (4) 
    (?(1)   # if comment (1) 
     (?<=--)  # wait for "--" 
    )    # end if comment (1) 
    (?(2)   # if another comment (2) 
     (?<=\?)  # wait for "?" 
    )    # end if another comment (2) 
    (?(3)   # if one of tags-containers (3) 
     </   # wait for end 
     (?i:\3)  # of this tag 
     (?:\s[^>]*)? # skip junk to ">" 
    )    # end if (3) 
    >    # tag closed 
    }{}gsx;   # STRIP THIS TAG 
    return $_ ? $_ : ""; 
} 
2

Si vous n'êtes pas opposé aux dépendances externes, le HTML Purifier library est un assez bon filtre pour la majorité des attaques XSS.

0

En PHP, je commencerais par strip_tags. Comme si:

$output = strip_tags($input); 

Si je voulais permettre à certains mots-clés dans l'entrée d'utilisateur, je les comprennent, comme ceci:

$output = strip_tags($input, '<code><em><strong>'); 
0

Je ne pense pas qu'il est possible de trouver le code javascript comme ça .

Vous devez transmettre les données via un interpréteur quelconque pour tenter de trouver des instructions js valides. Cela nécessiterait beaucoup de temps processeur et générerait probablement de nombreux faux positifs en fonction de la nature de votre texte.

L'entité qui échappe aux méta-caractères est probablement le meilleur moyen de mieux protéger votre application contre les attaques que votre filtre a pu manquer. Javascript ne peut pas être exécuté s'il est chargé en tant que texte normal.

Questions connexes