L'utilisateur est égal à indignes de confiance. Ne faites jamais confiance digne de confiance la saisie de l'utilisateur. Je le conçois. Cependant, je me demande quand le meilleur moment pour désinfecter les données d'entrée. Par exemple, avez-vous aveuglément magasin de la saisie de l'utilisateur, puis désinfecter à chaque fois que cela est consulté ou utilisé, ou pensez-vous de désinfecter l'entrée, immédiatement et ensuite le stocker cette "nettoyé" version? Peut-être il ya aussi d'autres approches que je n'ai pas bien en plus de ces. Je me penche de plus en plus vers la première méthode, car toutes les données qui proviennent de la saisie de l'utilisateur doit toujours être abordée avec prudence, où le "nettoyer" les données peuvent toujours inconsciemment ou accidentellement être dangereux. De toute façon, quelle méthode les gens pensent est le meilleur, et pour quelles raisons?
Réponses
Trop de publicités?Malheureusement, presque pas de l'un des participants a jamais clairement comprendre ce qu'ils sont en train de parler. Littéralement. Seul @Kibbee réussi à le faire directement.
Ce thème est tout au sujet de l'assainissement. Mais la vérité est, une telle chose comme la grande-qualifié de "fins générales de l'assainissement" tout le monde a tellement envie de parler, c'est juste n'existe pas.
Il y a un tas de différents médiums, chaque besoin , c'est propre, distinct mise en forme des données. En outre - même seul certains moyen nécessitent une mise en forme différente pour les parties. Dire, la mise en forme HTML est inutile pour du javascript intégré dans une page HTML. Ou, chaîne de formatage est inutile pour le nombre de requête SQL.
Comme une question de fait, un tel "nettoyage dès que possible", comme l'a suggéré dans la plupart des upvoted réponses, c'est juste impossible. Comme on ne peut pas dire dans lequel certains ou médium partie les données seront utilisées. Dire, nous nous préparons pour se défendre de "sql injection", échappant à tout ce qui bouge. Mais oups! - certains champs obligatoires n'ont pas été satisfaites et que nous avons à remplir à partir de données de formulaire au lieu de la base de données... avec toutes les barres obliques ajouté.
D'autre part, nous diligence échappé à toutes les "entrées de l'utilisateur"... mais dans la requête sql que nous n'avons pas de guillemets autour d'elle, comme c'est un numéro ou identifiant. Et pas de "désinfection" jamais nous ont aidés.
Sur le tiers de la main - d'accord, nous avons fait de notre mieux pour assainir le terrible, digne de confiance et méprisée "saisie de l'utilisateur"... mais dans certains processus intérieur, nous avons utilisé ce que très peu de données sans aucune mise en forme (comme nous l'avons fait de notre mieux déjà!) - et oups! ont obtenu un deuxième ordre de l'injection dans toute sa splendeur.
Ainsi, à partir de la vie réelle de l'utilisation de point de vue, la seule façon appropriée serait
- mise en forme, pas que ce soit "assainissement"
- droit avant de l'utiliser
- selon certains moyen de règles
- et même à la suite des sous-règles requises pour ce moyen de différentes parties.
Cela dépend de quel type de désinfection que vous faites.
Pour la protection contre les injections SQL, de ne rien faire pour les données lui-même. Suffit d'utiliser les requêtes préparées, et de cette façon, vous n'avez pas à vous soucier de jouer avec les données que l'utilisateur a entré et avoir une incidence négative sur votre logique. Vous devez nettoyer un peu, pour s'assurer que les nombres sont des nombres, et les dates sont des dates, puisque tout est une chaîne de caractères comme il s'agit de la demande, mais n'essayez pas de faire toute vérification à faire des choses comme bloc de mots-clés ou quoi que ce soit.
Pour la protection contre les attaques XSS, il serait probablement plus facile de corriger les données avant d'être stockées. Cependant, comme d'autres l'ont mentionné, il est parfois agréable d'avoir une copie primitive des exactement ce que l'utilisateur a entré, car une fois que vous changer, c'est perdu à jamais. C'est presque dommage qu'il n'y est pas un imbécile preuve façon de vous assurer de l'application seulement met aseptisé HTML de la façon dont vous pouvez vous assurer que vous ne soyez pas pris par injection SQL en utilisant les requêtes préparées.
J'ai désinfecter mes données d'utilisateur comme Radu...
D'abord côté client à l'aide de deux regex et de prendre le contrôle des caractères autorisés d'entrée dans le même champs de formulaire à l'aide de javascript ou jQuery liée à des événements, tels que onChange ou OnBlur, qui supprime tous les interdits d'entrée avant qu'il puisse même être soumis. Réalisent toutefois, que ce vraiment seulement l'effet de permettre à ceux les utilisateurs du savoir, que les données sont les vérifications côté serveur en tant que bien. C'est plus un avertissement qu'aucune réelle protection.
Deuxièmement, et je vois rarement ce fait ces jours-ci, que le premier contrôle en cours de fait côté serveur est de vérifier l'emplacement de l'endroit où le formulaire est envoyé à partir de. En permettant seulement à la soumission d'un formulaire à partir d'une page que vous avez désigné comme valide emplacement, vous pouvez tuer le script AVANT de l'avoir encore lu dans les données. Accordé, qui à elle seule est insuffisante, comme un bon hacker avec leur propre serveur peut camouflent le domaine et l'adresse IP pour la faire apparaître à votre script qu'il est à venir à partir d'un formulaire valide emplacement.
Ensuite, et je ne devrais même pas avoir à dire cela, mais toujours, et je dis bien TOUJOURS, exécutez vos scripts en mode taint. Cela vous oblige à ne pas devenir paresseux, et de faire preuve de diligence au sujet de numéro de l'étape 4.
-
Désinfecter les données de l'utilisateur dès que possible à l'aide de bien-formé regexes approprié pour les données qui sont attendus à partir d'une case sur le formulaire. Ne prenez pas de raccourcis comme la tristement célèbre"la magie de la corne de la licorne"à coup par l'intermédiaire de votre souillure contrôles... ou vous pouvez tout simplement désactiver taint, en premier lieu, pour toutes les bonnes il va faire pour votre sécurité. C'est comme donner un psychopathe d'un couteau pointu, portant votre gorge, et en disant: "Vous êtes vraiment de ne pas me faire de mal avec qui allez-vous".
Et c'est là où je diffère de la plupart des autres dans cette quatrième étape, comme je ne désinfecter les données de l'utilisateur que je vais effectivement UTILISER dans une voie qui peut présenter une sécurité de risque, tels que des appels système, l'affectation à d'autres variables, ou en écrivant à stocker des données. Si je n'en suis qu'à l'aide de la saisie de données par l'utilisateur à effectuer une comparaison de données Je l'ai stocké sur le système moi-même (donc en sachant que les données de mon propre est sûr), alors je n'ai pas pris la peine de désinfecter les données de l'utilisateur, comme je ne vais jamais pour nous un moyen qui se présente comme un problème de sécurité. Par exemple, prenez un nom d'utilisateur d'entrée comme un exemple. J'utilise le nom d'utilisateur d'entrée par l'utilisateur uniquement à vérifier à l'encontre d'un match ma base de données, et si c'est vrai, après que j'utilise les données de la base de données pour effectuer toutes les autres fonctions que je pourrais appeler dans le script, sachant qu'il est fort, et de ne jamais utiliser les données des utilisateurs à nouveau par la suite.
Dernier, est de filtrer toutes les tentatives d'auto-soumet par des robots ces jours-ci, avec un de l'homme de l'authentification de système, tels que les Captcha. C'est assez important ces jours-ci que j'ai pris le temps d'écrire mon propre "de l'homme d'authentification' schéma qui utilise des photos et d'une entrée pour le "humaine" pour entrer dans ce qu'ils voient dans l'image. J'ai fait cela car J'ai trouvé que le Captcha systèmes de type vraiment gêner les utilisateurs (vous pouvez le dire par leur plissant les yeux-les yeux en essayant de déchiffrer les lettres déformées... habituellement au-dessus et plus encore). Ceci est particulièrement important pour les scripts qui utilisent SendMail ou SMTP pour le courrier électronique, car ces sont les favoris pour votre faim spam-bots.
Pour conclure en un mot, je vais vous expliquer ce que je fais pour ma femme... votre serveur, c'est comme une boîte de nuit populaire, et le plus videurs vous avez, le moins de problèmes que vous êtes susceptibles d'avoir dans la boîte de nuit. J'ai deux videurs à l'extérieur de la porte (validation côté client et de l'homme d'authentification), un videur à l'intérieur de la porte (vérification de la validité du formulaire de soumission de l'emplacement... c'Est que vraiment vous sur cette ID'), et plusieurs autres videurs dans proximité de la porte (exécution de la souillure mode et les regexes pour vérifier la les données de l'utilisateur).
Je sais que c'est un vieux post, mais je l'ai senti assez important pour toute personne qui peut le lire après ma visite ici pour réaliser leur est pas de"formule magique"lorsqu'il s'agit de la sécurité, et il faut un travail en étroite collaboration les uns avec les autres pour faire de votre données fournies par l'utilisateur sécurisé. Simplement en utilisant un ou deux de ces méthodes, seule, est pratiquement sans valeur, que leur pouvoir n'existe que lorsqu'ils ont tous de l'équipe ensemble.
Ou en résumé, comme ma mère le disait souvent... 'Mieux vaut prévenir que guérir".
Mise à JOUR:
Une chose que je suis en train de faire ces jours-ci, est de l'encodage Base64 toutes mes données, puis en cryptant les données Base64 qui se trouvent sur mes Bases de données SQL. Il faut environ un tiers de plus le nombre total d'octets pour stocker de cette façon, mais la sécurité l'emportent sur les extra taille des données à mon avis.
Je tiens à désinfecter le plus tôt possible, ce qui signifie que la désinfection se produit lorsque l'utilisateur tente d'accéder à des données non valides. Si il y a une zone de texte pour leur âge, et ils dans autre chose qu'un nombre, je ne permets pas à la pression de touche de la lettre d'aller à travers.
Ensuite, tout ce qui est de la lecture des données (souvent du serveur) - je faire un test de cohérence quand j'ai lu dans les données, juste pour s'assurer que rien n'échappe à cause d'un plus déterminé de l'utilisateur (tels que la main-d'édition de fichiers ou encore la modification de paquets!)
Edit: dans l'Ensemble, désinfecter début et désinfecter tout le temps que vous avez perdu de vue les données à la même seconde (par exemple, enregistrement de Fichier -> Ouvrir Fichier)
Début est bon, certainement avant d'essayer de l'analyser. Tout ce que vous allez pour une sortie plus tard, ou, surtout, de passer à d'autres composants (par ex., shell, SQL, etc) doivent être désinfectés.
Mais n'exagérez pas, par exemple, les mots de passe sont hachés avant de les stocker (à droite?). Les fonctions de hachage peut accepter des données binaires arbitraires. Et vous n'aurez jamais l'impression de sortir d'un mot de passe (à droite?). Afin de ne pas analyser les mots de passe et ne pas les désinfecter.
Aussi, assurez-vous que vous êtes en train de faire la désinfection d'un processus de confiance - JavaScript/tout ce côté client est pire qu'inutile de sécurité/intégrité-sage. (Il peut fournir une meilleure expérience utilisateur à l'échec tôt, bien que, juste le faire à deux endroits.)