Fonction de nettoyage sécurisée XSS (mise à jour régulièrement)

J'ai été à la chasse sur le net maintenant pour quelques jours à essayer de comprendre cela, mais d'obtenir des réponses contradictoires.

Est-il une bibliothèque, une classe ou d'une fonction PHP qui permet de assainit/encode une chaîne de contre XSS? Il doit être mis à jour régulièrement afin de contrer de nouvelles attaques.

J'ai quelques cas d'utilisation:

Cas d'utilisation 1) j'ai un simple champ de texte, par exemple pour un prénom ou Nom de famille

  • Utilisateur saisit du texte dans le champ et soumet le formulaire
  • Avant ce est enregistré dans la base de données je veux a) garniture d'espace sur le devant et
    la fin de la chaîne, et b) bande de toutes les balises HTML à partir de l'entrée. C'est un champ de texte nom, ils ne devraient pas avoir de code HTML.
  • Alors je vais garder cette à la base de données avec PDO préparées.

Je pense que je pourrais juste faire trim() et strip_tags() ensuite utiliser un Désinfecter Filtre ou RegEx avec une liste blanche des personnages. Ont-ils vraiment besoin de personnages comme ! et ? ou < > en leur nom, pas vraiment.

Cas d'utilisation 2) Lors de la sortie du contenu à partir d'une base de données d'enregistrement (ou d'un précédemment soumises par le formulaire) à la Vue/HTML, je veux bien propre pour XSS. NB: Il peut ou peut ne pas avoir passé par l'étape de filtrage en cas d'utilisation 1 comme il pourrait l'être d'un type différent de l'entrée, donc n'assumons aucune désinfection a été fait.

Au départ, j'ai bien HTMLPurifier pour faire le travail, mais il semble qu'il est pas ce dont j'ai besoin quand J'ai posé la question pour leur soutien:

Voici le test décisif: si un utilisateur soumet <b>foo</b> devrait apparaître comme <b>foo</b> ou foo? Si l'ancien, vous n'avez pas besoin de HTML Purificateur.

Donc je préférerais qu'il a montré jusqu'à, comme <b>foo</b> parce que je ne veux pas de code HTML à afficher pour un simple champ de texte ou de code JavaScript en cours d'exécution.

J'ai donc été à la chasse autour d'une fonction qui le fera pour moi. Je suis tombé sur le xss_clean méthode utilisée par Kohana 3.0 qui je suppose fonctionne, mais c'est seulement si vous voulez garder le HTML. Il est déconseillé de Kohana 3.1 comme ils l'ont remplacé par HTMLPurifier. Donc je suppose que vous êtes censé faire HTML::chars() au lieu de cela qui seulement ce code:

public static function chars($value, $double_encode = TRUE)
{
    return htmlspecialchars( (string) $value, ENT_QUOTES, Kohana::$charset, $double_encode);
}

Maintenant, apparemment, vous êtes censé utiliser htmlentities plutôt comme mentionné un peu partout dans le Débordement de Pile parce que c'est plus sécurisé que htmlspecialchars.

  • Alors, comment dois-je utiliser htmlentities
    correctement?
  • Est que tout ce que je besoin?
  • Comment ça se protéger contre hexadécimal, décimal et encodées en base64 valeurs envoyées depuis les attaques répertoriées ici?

Maintenant je vois que le 3e paramètre pour le htmlentities méthode est le jeu de caractères à être utilisé dans la conversion. Maintenant, mon site/db est en UTF-8, mais peut-être que le formulaire de données n'a pas été codé en UTF-8, peut-être qu'ils soumis ASCII ou HEX donc peut-être que j'ai besoin pour le convertir en UTF-8 en premier? Que signifierait un code comme:

$encoding = mb_detect_encoding($input);
$input = mb_convert_encoding($input, 'UTF-8', $encoding);
$input = htmlentities($input, ENT_QUOTES, 'UTF-8');

Oui ou non? Ensuite, je ne suis toujours pas sûr de la façon de se protéger contre l'hexadécimal, décimal et base64 possible XSS entrées...

S'il y a une bibliothèque ou un framework PHP open source qui peut faire de la protection XSS correctement, je serais intéressé de voir comment ils le font dans le code.

Toute aide appréciée, désolé pour le long post!

source d'informationauteur zuallauz