9
votes

Quelle est la bonne façon de faire une entrée de formulaire Web sans danger pour une variété de contextes?

Que pensez-vous que vous pensez tous la solution correcte (lecture: la plus flexible, la plus robuste, la plus robuste, etc.), de rendre l'entrée de l'utilisateur à partir de la sécurité Web pour une utilisation dans diverses parties d'une application Web? De toute évidence, nous pouvons simplement utiliser les fonctions d'assainissement respectives pour chaque contexte (base de données, affichage à l'écran, enregistrer sur le disque, etc.), mais existe-t-il un "motif" général pour la manipulation de données dangereuses et la rendre en sécurité? Y a-t-il un moyen établi d'appliquer le traitement comme dangereux à moins qu'il ne soit bien fait de sécurité?


5 commentaires

Je suis spécifiquement intéressée par la sécurité des données pour une utilisation dans l'application après avoir déjà passé une couche de validation simple qui vérifie le format général de la réponse, mais ne cherche pas à dire, à l'injection SQL ou à d'autres menaces. Fondamentalement des moyens de gérer les données qui n'entraîneront pas un comportement significativement destructeur par le programme.


J'avais à l'esprit quelque chose dans le sens de: l'entrée de l'utilisateur peut être enveloppée dans une sorte d'emballage qui empêche le code de l'utiliser de manière dangereuse. Cette contribution pourrait alors alors être débordée d'une manière particulière qui rend difficile la personne de faire quelque chose de manière inconscient quelque chose de dangereux avec elle. Le code utilisant celui-ci devrait s'assurer qu'il a été fait de sécurité pour une utilisation dans le contexte de ce code avant de l'utiliser. Y a-t-il quelque chose comme celui-ci qui a été établi?


Vous mentionnez à un moment donné que vous voulez quelque chose de large et flexible et à un autre point que vous imaginiez un cadre de tri. Donc, vous ne voulez pas une solution simple dans le sens de "faire cette seule chose va frotter l'entrée" tellement "que cette seule chose va déclencher 10 autres choses automatiquement qui vont faire l'apport", est-ce correct? Je n'essaie pas d'être effronté, je ne sais que si vous recherchez une méthode ou un outil. Plus à venir...


L'autre chose me déroutant est ce que vous avez à l'esprit en sécurité. Toutes les conférences, votre commentaire ci-dessus est un peu flou. Vous voulez que quelque chose enveloppe l'entrée (ce qui a du sens et est un bon moyen de la mettre) mais qui essayez-vous en définitive de protéger en emballant et en déballant les données? Voulez-vous éviter l'injection SQL? Requêtes inattendues? XSS? ou sortie du navigateur malveillant?


Anthony Oui, vous êtes correct que je ne veux pas "une chose pour frotter l'entrée" mais plutôt "faire une chose déclenchera 10 autres choses pour frotter automatiquement l'entrée". Ce qui dépendrait de la manière dont l'information est utilisée et ainsi de suite. En ce qui concerne ce que j'essaie de rester en sécurité, tout ce qui précède et tout ce qui est d'autre . Je pensais qu'il pourrait y avoir une manière établie pour empêcher que les données ne soient utilisées de manière incorrecte, mais fournissant des installations pour la laisser être utilisées correctement. Sinon, alors c'est une réponse à ma question.


3 Réponses :


0
votes

Vous ne pouvez pas utiliser une seule méthode pour assainir les données pour toutes les utilisations, mais un bon départ est le suivant:

  • Utilisez filtre_var pour valider / désinfecter

    Filtre Var prend un certain nombre de types de données et des supports sur des caractères mauvais (tels que les non-chiffres pour les choses que vous attendez d'être des chiffres) et veille à ce qu'elle est de format valide (adresses IP).

    Remarque: les adresses e-mail sont beaucoup plus compliquées que la mise en œuvre du filtre_var, par Google autour de la fonction appropriée.

    • Utilisez MYSQL_REAL_ESESCAPE_STRING avant de saisir quoi que ce soit dans une base de données MySQL

      Je ne suggérerais pas de l'utiliser jusqu'à ce que vous soyez sur le point de saisir des choses dans une base de données, et il est probablement préférable d'utiliser des déclarations MySQLI préparées de toute façon.


2 commentaires

Je sais qu'il n'y a pas une seule fonction pour assainir pour tous les contextes. Comme je disais, "évidemment, nous pouvons simplement utiliser les fonctions de désinfection respectives pour chaque contexte ...". Filtre_var semble potentiellement utile. Je suppose que je cherche une solution plus large. Quelque chose de très flexible. Peut-être une sorte de cadre de manutention de données.


Peut-être que vous devriez regarder dans une doctrine comme une doctrine? doctrine-project.org



1
votes

Je suis plus qu'un peu sceptique qu'un cadre aussi général à usage général pourrait tous deux exister et être moins complexe qu'un langage de programmation.

La définition de "sûr" est si différente entre différentes couches

  • Validation, chiffres, dates, listes, codes postaux, enregistrements de véhicules
  • Validation de champ croisée
  • Validation du domaine - est-ce une lecture de compteur valide? Mlle Jones a utilisé 300 000 000 £ électricty ce mois-ci?
  • Validation inter-requile - Réservez-vous vraiment deux vols transatlantiques pour vous le même jour?
  • cohérence de la base de données, validation de la clé étrangère
  • Injection SQL

    considère également les actions lorsque des violations sont découvertes.

    • à la couche d'interface utilisateur, nous ne dissions certainement pas simplement aux châssis sans chiffres des champs numériques, nous élevons une erreur d'interface utilisateur
    • Dans l'interface utilisateur, nous voulons probablement valider tous les champs et signaler chaque erreur individuelle
    • Dans d'autres couches, nous pourrions lancer une exception ou une incidence un processus d'entreprise

      Peut-être que vous manque votre vision? Avez-vous vu quelque chose qui se rapproche de ce que vous avez à l'esprit?


0 commentaires

4
votes

Comme il a déjà été dit, il existe plusieurs éléments à prendre en compte lorsque vous êtes préoccupé par la sécurité Web. Voici quelques principes de base à prendre en compte:

  • Évitez les saisies directes des utilisateurs en cours d'introduction dans les requêtes et les variables.

    Cela signifie donc avoir quelque chose comme $ variable = $ _post ['user_input'] . Pour toute situation comme celle-ci, vous remettez trop de contrôle à l'utilisateur. Si l'entrée affecte une requête de base de données, faites toujours valider les entrées de l'utilisateur contre. Si la requête est pour un nom d'utilisateur, validez-vous sur une liste de bons noms d'utilisateur. Ne faites pas simplement une requête avec la saisie de l'utilisateur déposée directement dans.

    Une exception (possible) est pour une chaîne de recherche. Dans ce cas, vous devez assainir, simple comme ça.

    • Évitez de stocker la saisie de l'utilisateur sans assainissement.

      Si l'utilisateur crée un profil ou une info de téléchargement pour d'autres utilisateurs, vous devez avoir une liste blanche de quel type de données est acceptable ou de sortir tout ce qui pourrait être malveillant. Ceci non seulement pour la sécurité de votre système, mais pour vos autres utilisateurs (voir point suivant.)

      • ne jamais produire rien d'un utilisateur au navigateur sans le décaper.

        C'est probablement la chose la plus importante que les consultants en matière de sécurité m'ont souligné. Vous ne pouvez pas simplement compter sur l'apport d'assainissement lorsqu'il est reçu par l'utilisateur. Si vous n'avez pas écrit la sortie vous-même, assurez-vous toujours que la sortie est inoffensive en codant pour tout caractères HTML ou en l'enveloppant dans un

        </ code> &eacute;tiquette. Il est simple de n&eacute;gligence de la part du d&eacute;veloppeur si l'utilisateur a t&eacute;l&eacute;charg&eacute; un peu de JavaScript qui nuit &agrave; tout autre utilisateur qui affiche cette page. Vous dormirez mieux la nuit, sachant que toute sortie utilisateur ne peut faire que d'appara&icirc;tre comme texte sur tous les navigateurs. </ P> <ul> <li> Ne laissez jamais personne, mais l'utilisateur contr&ocirc;le le formulaire. </ li> </ ul> <p> XSS est plus facile qu'il ne devrait &ecirc;tre et une vraie douleur &agrave; couvrir en un paragraphe. Il suffit de mettre, chaque fois que vous cr&eacute;ez un formulaire, vous donnez aux utilisateurs l'acc&egrave;s &agrave; un script qui g&eacute;rera les donn&eacute;es de formulaire. Si je volais la session de quelqu'un ou le cookie de quelqu'un, je peux maintenant parler au script comme si j'&eacute;tais sur la page de formulaire. Je connais le type de donn&eacute;es qu'il attend et les noms de variables qu'il recherchera. Je peux simplement transmettre ces variables comme si j'&eacute;tais l'utilisateur et que le script ne peut pas dire la diff&eacute;rence. </ P> <p> Ce qui pr&eacute;c&egrave;de n'est pas une question d'assainissement mais de validation de l'utilisateur. Mon dernier point est directement li&eacute; &agrave; cette id&eacute;e. </ P> <ul> <li> &Eacute;vitez d'utiliser des cookies pour la validation de l'utilisateur ou la validation de r&ocirc;le. </ LI> </ ul> <p> Si je peux voler le cookie d'un utilisateur, je pourrais peut-&ecirc;tre faire plus que faire que l'utilisateur ait une mauvaise journ&eacute;e. Si je remarque que le cookie a une valeur appel&eacute;e "membre", je peux tr&egrave;s facilement modifier cette valeur &agrave; "admin". Peut-&ecirc;tre que cela ne fonctionnera pas, mais pour de nombreux scripts, j'aurais un acc&egrave;s instantan&eacute; &agrave; toutes les informations de niveau administrateur. </ P> <p> Mettez simplement, il n'y a pas un moyen facile de s&eacute;curiser un formulaire Web, mais il existe des directeurs de base qui simplifient ce que vous devriez faire et facilitent ainsi le stress de la s&eacute;curisation de vos scripts. </ P> <p> Une fois de plus pour une bonne mesure: </ P> <ul> <li> assainir toutes les entr&eacute;es </ li> <li> encoder toutes les sorties </ li> <li> validez toute entr&eacute;e utilis&eacute;e pour l'ex&eacute;cution contre un strict whitelist </ li> <li> Assurez-vous que l'entr&eacute;e provient de l'utilisateur r&eacute;el </ li> <LI> Ne faites jamais de navigation de validation de l'utilisateur ou de la validation bas&eacute;e sur un r&ocirc;le / utilisateur modifiable </ li> </ ul> <p> et ne supposez jamais que la liste d'une personne est exhaustive ou parfaite. </ P> </div> <hr> <!-- comments --> <div class="pl-5"> <small class="text-muted">0 commentaires</small> <div class="comments mt-3"> </div> </div> </div> </div> <hr> </div> <div class="col-lg-3 col-md-12 col-12 col-sm-12" > <div class="related"> <iframe src="https://rcm-eu.amazon-adsystem.com/e/cm?o=8&p=12&l=ez&f=ifr&linkID=b777da379e25dfc65f34887292b82918&t=birdy0c-21&tracking_id=birdy0c-21" width="300" height="250" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"></iframe> <p class="font-weight-bold">Articles qui pourrait vous intéresser :</p> <a href="/question/pourquoi-est-ce-que-j-39-obtiens-une-erreur-laravel-lors-de-la-cr-eacute-ation-d-39-un-nouveau-projet" class=""> Pourquoi est-ce que j&#39;obtiens une erreur laravel lors de la cr&eacute;ation d&#39;un nouveau projet? </a> <hr> <a href="/question/select2-ne-s-39-affiche-pas-correctement-dans-le-mode-bootstrap" class=""> Select2 ne s&#39;affiche pas correctement dans le mode bootstrap </a> <hr> <a href="/question/laravel-echo-n-39-eacute-coute-pas" class=""> Laravel Echo n&#39;&eacute;coute pas </a> <hr> <a href="/question/la-validation-de-la-demande-de-formulaire-ne-fonctionne-pas-il-charge-juste-la-page-d-39-accueil-dans-postman" class=""> La validation de la demande de formulaire ne fonctionne pas. Il charge juste la page d&#39;accueil dans Postman </a> <hr> </div> <div class=""> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5975820494937925" data-ad-slot="4267220326" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> </div> </div> <script type="text/javascript" src="/js/purecookie.js"></script> </div> <div class="container col-lg-8 col-md-12 ads-footer"> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-5975820494937925" data-ad-slot="5580301997" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </body> <footer> <div class="row col-lg-12 col-md-12 text-muted"> ©&nbsp;2020&nbsp;www.devfaq.fr&nbsp;-&nbsp;Licensed under <a href="https://creativecommons.org/licenses/by-sa/3.0/" rel="license">&nbsp;cc by-sa 3.0 </a> &nbsp;with&nbsp;<a href="https://stackoverflow.blog/2009/06/25/attribution-required/" rel="license">&nbsp;attribution required</a>. </div> </footer> </html>