S'échapper de sortie en toute sécurité pour le html et les champs de saisie

Dans mon application web, les utilisateurs peuvent entrer des données de texte. Ces données peuvent être communiquées aux autres utilisateurs, et l'auteur de l'original peut également revenir en arrière et modifier leurs données. Je suis à la recherche de la bonne façon de sortir en toute sécurité de ces données.

Je ne suis sql de désinfection sur le chemin, donc, tout est stocké comme il lit. Disons que j'ai "déjà-vu" dans la base de données. Ou, pour être plus extrême, un <script> tag. Il est possible que cela soit valable, et même pas destiné à des fins malveillantes, d'entrée.

Je suis en utilisant htmlentities() sur le moyen de sortir pour s'assurer que tout est échappé. Le problème, c'est que le html et les champs de saisie de traiter les choses différemment. Je veux faire en sorte qu'il est sûr en HTML, mais que l'auteur lors de l'édition du texte, voit exactement ce qu'ils ont saisies dans les champs de saisie. Je suis aussi à l'aide de jQuery pour remplir les champs du formulaire avec les données de façon dynamique.

Si je fais ceci:

 <p><?=htmlentities("déjà vu");?></p>
 <input type=text value="<?=htmlentities("déjà vu");?>">

La source de la page met d&eacute;j&agrave; vu dans les deux endroits (j'ai dû backtick ou que vous souhaitez voir "déjà-vu"!) Le problème est que la sortie dans les <p> est correcte, mais l'entrée est juste échappé de texte. Si l'utilisateur soumet de nouveau à leur forme, ils échappement double et de la ruine de leur entrée.

Je sais que j'ai encore à désinfecter texte qui va dans le champ, sinon vous pouvez mettre fin à la valeur de devis et de faire de mauvaises choses. La seule solution que j'ai trouvé est celle-ci. Encore une fois, je suis en utilisant jQuery.

var temp = $("<div></div>").html("<?=htmlentities("déjà vu");?>");
$("input").val(temp.html());

Cela fonctionne, car il provoque la div pour lire l'échappé du texte en tant que caractères codés, et alors le jquery copies de ces caractères codés à la balise input, conservé correctement.

Donc ma question: est-ce toujours à l'abri, ou il y a un trou de sécurité quelque part? Et, plus important encore, est-ce la seule manière correcte de le faire? Ai-je raté quelque chose au sujet de comment html codage de caractères et les œuvres qui en font une question triviale à résoudre?

MODIFIER

C'est effectivement faux, j'ai simplifié mon exemple au point que cela ne fonctionne pas. Le problème est en fait parce que je suis à l'aide de jQuery val() pour insérer le texte dans le champ.

<input>
<script>$("input").val("<?=htmlentities("déjà vu");?>");</script>

La raison pour cela est que la forme est dynamique: l'utilisateur peut ajouter ou supprimer des champs, et donc ils sont générés après le chargement de la page.

Il semble donc que jQuery est de s'échapper de la données pour aller dans l'entrée, mais ce n'est pas tout à fait assez bon - si je ne fais rien de moi-même, un utilisateur peut toujours le mettre dans un </script> tag, tuant mon code et de l'insertion de code malveillant. Mais il y a un autre argument à faire ici. Depuis que l'auteur original peut voir le texte dans une zone de saisie de toute façon, devrais-je même pas la peine? Fondamentalement, les seules personnes à qui ils pourraient exécuter une attaque XSS est contre eux-mêmes.

OriginalL'auteur Tesserex | 2010-06-30