2010-03-01 7 views
1

J'essaie d'empêcher l'injection de xss. Alors avant de soumettre un formulaire, une fonction javascript est appeléeChaîne javascript remplacer l'équivalent sur PHP?

function validatefield(id) { 
    var description = document.getElementById(id).value; 
    description = description.replace(/[\"\'][\s]*javascript:(.*)[\"\']/gi, ""); 
    description = description.replace(/script(.*)/gi, "");  
    description = description.replace(/eval\((.*)\)/gi, ""); 
    document.getElementById(id).value=description; 
} 

Je suis wonderng s'il y a un moyen de faire la même chose en php avant de l'insérer dans le mysql? s'ils se déplacent de la fonction validatefield.

Merci

+1

Portage de ce code javascript en php n'est pas une bonne stratégie pour empêcher XSS. Il existe des moyens d'injecter du javascript en html qui ne sont pas couverts par votre logique, par exemple. l'attribut 'onclick'. Le bon moyen (et beaucoup plus simple!) D'aller est d'envelopper vos données soumises par l'utilisateur dans 'htmlspecialchars()' juste avant de sortir dans n'importe quel contexte html. – Asaph

+0

Mais htmlspecialchars n'est pas suffisant si vous voulez autoriser du HTML. –

+0

@Matthew Flaschen: Certainement vrai. Bien que je n'ai pas eu l'impression que l'affiche collectait du HTML spécifiquement à travers son formulaire. Cela ne figure nulle part dans la question. Dans le cas de la collecte de données HTML, j'adopterais une approche de liste blanche et je supprimerais tous les attributs et balises non approuvés. – Asaph

Répondre

4

Vous recherchez preg_replace.

$description = preg_replace('regex pattern', 'regex replacement', $description); 
+0

Les expressions régulières sont mal adaptées à la syntaxe html (non régulière). Vous devrez également exécuter cela jusqu'à ce qu'il ne trouve plus de correspondances à remplacer afin de prendre soin de sitauations comme << scriptscript ... – jasonbar

+0

J'ai essayé de simplement copier et coller la version js mais cela ne semble pas fonctionner $ text = preg_replace ('/ [\ "\'] [\ s] * javascript: (* *) [\" \ ']/gi', '', $ text); $ text = preg_replace ('/ script (. *)/Gi', '', $ text); $ text = preg_replace ('/ eval \ ((. *) \)/Gi', '', $ text); – hao

+1

Le dialecte d'expression régulière est différent. Cette fonction accepte uniquement les expressions régulières compatibles avec Perl. Voici une feuille de triche: http://www.phpguru.org/downloads/PCRE%20Cheat%20Sheet/PHP%20PCRE%20Cheat%20Sheet.pdf Vous devrez réécrire vos expressions régulières pour qu'elles fonctionnent dans PHP. –

3

D'une manière générale, vous pouvez utiliser preg_replace pour le remplacement regex en PHP. Mais il y a quelques problèmes avec votre conception

  1. Vous ne devriez même pas faire cela sur le client. Cela ralentira les choses sans assurer la sécurité.
  2. Vous supprimez des éléments parfaitement sûrs (par exemple, "j'ai écrit un script pour le faire"), sans tenir compte de nombreux dangers tels que les attributs onclick (voir également XSS Cheat Sheet).

De manière générale, si vous souhaitez autoriser une certaine forme de HTML, une liste blanche est une meilleure approche. HTML Purifier est un outil populaire pour l'implémentation en PHP.

+0

+1 pour purificateur html et listes blanches. Huer! pour les expressions régulières et html. – jasonbar