2009-10-05 6 views
1

J'essaie de détecter JavaScript dans ma valeur de chaîne de requête.Regex pour détecter Javascript Dans une chaîne

J'ai le code C# suivant

private bool checkForXSS(string value) 
    { 
     Regex regex = new Regex(@"/((\%3C)|<)[^\n]+((\%3E)|>)/I"); 

     if (regex.Match(value).Success) return true; 

     return false; 
    } 

Cela fonctionne pour détecter <script></script> balises, mais malheureusement, s'il n'y avait pas de balises d'un match n'est pas atteint.

Est-il possible qu'une expression rationnelle corresponde aux mots-clés JavaScript et aux points-virgules etc.?

Ceci n'est pas destiné à couvrir toutes les bases d'attaque XSS. Juste un moyen de détecter les attaques JS simples qui peuvent être dans une valeur de chaîne.

Merci

+1

Ok, et puis vous devez détecter la présence de la sous-chaîne "onmouseover", etc ... Lire mon post http: // stackoverflow.com/questions/1520973/regex-pour-détecter-javascript-dans-une-chaîne/1521042 # 1521042 – Rodrigo

Répondre

9

Nº 1 Règle: Utilisez une liste blanche et non une liste noire.

Vous empêchez une façon de faire un XSS, pas n'importe lequel. Pour ce faire, vous devez valider l'entrée contre ce que vous devez accepter comme une entrée utilisateur, à savoir

  • Si vous attendez un numéro, valider l'entrée contre /^\d{1, n}$/
  • Si vous attendez une chaîne, valider contre /^[\s\w\.\,]+$/ , etc ...

Pour plus d'information, commencer à lire le Wikipedia entry, le entry at OWASP, webappsec articles et certains blog entries written by unknown people au hasard

+0

Triste personne n'attrape la blague des "inconnus" – Rodrigo

3

C'est une façon assez boiteux d'empêcher les attaques de cross-site scripting. Vous devez utiliser une approche complètement différente: assurez-vous que votre entrée est fournie par l'utilisateur:

  1. Validé telle qu'elle correspond à la sémantique des données recueillies;

  2. De manière appropriée chaque fois qu'il est utilisé pour construire des expressions à interpréter par un interpréteur de langage (SQL, HTML, Javascript - même en allant dans un fichier journal en texte brut). La citation appropriée dépend complètement du contexte de sortie, et il n'y a pas de moyen unique de le faire.

+0

Je prends une application existante où les chaînes de requête sont mises à la page. Je dois vérifier les valeurs pour javascript, par exemple alerte, fonction, événements etc et HTML. Mon regex ci-dessus vérifie les tags, mais pas les mots-clés JS, etc. Je veux supprimer le JS avant de le mettre sur la page. – w4ymo

+0

Désolé, mais je ne comprends vraiment pas ce que cela signifie. – Pointy

-5

Il devrait suffire de vérifier si l'étiquette <script est présente.

private bool checkForXSS(string value) 
{ 
    return value.IndexOf("<script") != -1; 
} 
+5

Faux. 'onclick',' onmouseover', etc. peuvent exister sans balises de script. – ceejayoz

+0

Je peux penser à une poignée d'autres façons de contourner cela; c'est une mauvaise approche. –

+0

Ok, je n'ai pas pensé à ça ... – pauloya

1

Il existe plusieurs façons d'intégrer javascript. Par exemple.

%3Cp+style="expression(alert('hi'))" 

passera à travers votre filtre.

Vous ne pouvez probablement pas trouver une expression rationnelle magique qui trouvera tous les JS et qui ne rejettera pas beaucoup de chaînes de requête valides.

Ce type de vérification peut être utile, mais il ne devrait s'agir que d'une partie d'une défense en profondeur.