2008-11-14 12 views
3

Quand appelez-vous Microsoft.Security.Application.AntiXss.HtmlEncode? Le faites-vous lorsque l'utilisateur soumet l'information ou le faites-vous lorsque vous affichez l'information?Avez-vous HtmlEncode pendant l'entrée ou la sortie?

Que diriez-vous pour des choses de base comme le prénom, le nom, la ville, l'état, le zip?

Répondre

4

Vous ne devriez encoder ou échapper vos données au dernier moment possible, que ce soit directement avant de le mettre dans la base de données, ou l'afficher à l'écran. Si vous codez trop tôt, vous courez le risque d'un double encodage accidentel (vous verrez souvent & sur les sites Internet de newbies - moi inclus).

Si vous voulez encoder plus tôt que cela, prenez des mesures pour éviter le double codage. Joel a écrit un article sur les bonnes utilisations de la notation hongroise, où il préconisait l'utilisation de préfixes pour déterminer ce qui est stocké dans la variable. par exemple: "us" pour une chaîne non sûre, "ss" pour une chaîne sûre.

usFirstName = getUserInput('firstName') 

ssFirstName = cleanString(usFirstName); 

Notez également que peu importe ce que le type d'information est (ville, code postal, etc.) - en laissant l'un de ces décochée demande des ennuis.

+1

«us» signifie «dangereux» et «ss» signifie «supersafe»? :RÉ – LiraNuna

12

Vous le faites lorsque vous affichez les informations. Conservez l'original tel qu'il a été entré, convertissez-le pour l'afficher sur une page Web. Supposons que vous l'affichiez d'une autre manière, par exemple en l'exportant dans Excel. Dans ce cas, vous souhaiterez exporter l'original conservé.

Encoder chaque chaîne unique.

2

Cela dépend de votre situation. Là où je travaille, pendant des années, la société n'a fait aucun encodage HTML, alors quand nous avons commencé à le faire, il aurait été presque impossible de trouver chaque emplacement dans le système que l'entrée de l'utilisateur pouvait afficher sur la page. Au lieu de cela, nous avons choisi d'assainir l'entrée à son entrée dans le système car il y avait moins de points d'entrée que de points de sortie. Nous désinfectons immédiatement avant d'entrer des données dans la base de données, bien que nous n'utilisions pas la bibliothèque AntiXss de Microsoft, nous utilisons un ensemble de méthodes homebrew qui liste des plages de balises et de caractères HTML en fonction du type d'entrée.

Si vous concevez le système à partir de rien, ou si vous avez un système assez petit (ou bien géré) pour encoder la sortie, suivez la suggestion de Corey. C'est certainement la meilleure façon de le faire.

1

L'encodage n'est pas une propriété des données, c'est une propriété du mécanisme de transport. Par conséquent, vous devez désencoder les données lorsque vous les recevez et les encoder de manière appropriée avant la transmission. Le mécanisme de transport détermine quel type de codage est nécessaire. Ce principe est vrai si votre mécanisme de transport est HTML, HTTP, signaux de fumée, etc. L'astuce consiste à savoir comment faire les types d'encodage manuellement, et quand les différents frameworks font les étapes pour vous automagiquement. Par exemple, ASP.NET codera les données affectées à un texte System.Web.UI.WebControls.Button, mais pas au texte affecté à un texte System.Web.UI.WebControls.Literal. jQuery codera le contenu que vous définissez avec .innerText(), mais pas le contenu que vous définissez avec .innerHtml().