2008-09-28 16 views
3

J'ai actuellement un système de validation côté serveur assez robuste, mais je cherche des commentaires pour m'assurer d'avoir couvert tous les angles. Voici un bref aperçu de ce que je fais en ce moment:Validation complète côté serveur

  • Assurez-vous que l'entrée est pas vide, ou est trop long

  • chaînes de requête Escape pour empêcher l'injection SQL

  • Utilisation d'expressions régulières pour rejeter les caractères non valides (cela dépend de ce qui est soumis)

  • Codage de certaines balises html, comme <script> (toutes les balises sont codées) lorsqu'ils sont stockés dans une base de données, certains étant décodé lors d'une interrogation pour rendre dans la page)

Est-ce que je suis absent? Échantillons de code ou expressions régulières bienvenus.

+0

Sur la puce trois, je changerais cela pour dire "en utilisant des expressions régulières pour n'accepter que des caractères valides." C'est-à-dire, spécifiez ce que vous acceptez plutôt que d'essayer de penser à tout ce que vous pourriez rejeter. – bmb

Répondre

8

Vous ne devriez pas avoir besoin de "échapper" des chaînes de requête pour empêcher l'injection SQL - vous devriez plutôt utiliser des instructions préparées.

Idéalement, votre filtrage d'entrée aura lieu avant tout autre traitement, de sorte que vous savez qu'il sera toujours utilisé. Parce que sinon, il suffit de manquer un point pour être vulnérable à un problème. N'oubliez pas d'encoder les entités HTML en sortie - pour éviter les attaques XSS.

2

Vous devez encoder toutes les balises html, et pas seulement celles "invalides". C'est un débat brûlant, mais au fond, il y aura toujours une combinaison HTML invalide que vous oublierez de gérer correctement (balises imbriquées, balises non concordantes que certains navigateurs interprètent correctement, etc.). Donc, l'option la plus sûre à mon avis est de stocker tout en tant que htmlentities et ensuite, en sortie, imprimer une arborescence de sous-ensemble HTML-safe validée (en tant qu'entités) à partir du contenu.

+0

Toutes les étiquettes sont codées lorsqu'elles sont stockées dans une base de données, mais je veux que certaines soient affichées dans la page afin qu'elles soient décodées lorsqu'elles sont interrogées, à l'exception de certaines étiquettes de script. J'ai modifié la question pour refléter cela. – conmulligan

1

Exécutez toute la validation côté serveur dans une bibliothèque dédiée à la tâche afin que les améliorations dans une zone affectent l'ensemble de votre application.

De plus, incluez le travail contre les attaques connues, telles que la traversée de répertoire et les tentatives d'accès au shell.

1

Vous pouvez vérifier le Filter Extension pour le filtrage des données. Cela ne garantit pas que vous êtes complètement hermétique, mais personnellement, je me sens beaucoup mieux de l'utiliser parce que ce code a beaucoup de regards sur lui.

En outre, considérons les instructions préparées en second lieu. L'échappement des données dans vos requêtes SQL appartient au passé.

Questions connexes