7
votes

S'échapper uniquement ce qui est nécessaire, est-ce possible?

Je travaille avec une équipe de développeurs sur un site Web. Le site Web utilisera des cours. Je suis chargé de créer la couche d'accès aux données pour les classes. Il y a une compréhension que toute entrée utilisateur sera échappée à la récupération (du poteau ou de l'obtention). Avoir peu de contrôle sur le niveau d'entrée (sauf si j'examine personnellement le code de tout le monde), je pensais qu'il serait cool de jeter de la fin à ma fin (juste avant qu'il ne frappe la base de données). Le problème est que je ne sais pas comment utiliser mysql_real_escape_string sans ajouter encore plus de barres obliques.

Puisque l'entrée de l'utilisateur peut très bien contenir une barre oblique, je ne peux pas vérifier pour vous assurer qu'il y a des barres obliques. Je pourrais peut-être vérifier toutes les choses qui ont besoin de s'échapper et de s'assurer qu'ils ont une barre oblique devant eux, mais cela ne semble pas comme la meilleure façon de le faire.

Toute suggestion?


0 commentaires

3 Réponses :


7
votes

Il n'y a aucun moyen que vous puissiez ajouter une décision automatique de vous échapper ou non si vous ne savez pas si l'entrée a été échappée. Vous pouvez tenter de l'analyser, mais ce ne sera jamais bon et vous rencontrerez des paires de barres anti-backslash etc.

Prenez la décision une fois que les données envoyées à votre couche d'accès doivent être propres et gérer l'échappement au même endroit. Si vous le faites, les autres développeurs n'auront pas à s'inquiéter à ce sujet (ils ne veulent probablement pas de toute façon) et il sera beaucoup plus facile de passer à une autre base de données à l'avenir. Cela vous donnera également la liberté de passer aux déclarations préparées à tout moment.

edit: oublié ceci:

avoir peu de contrôle sur l'entrée niveau (sauf si j'examine personnellement code de chacun)

Je pense que cela vaut la peine de les faire la sorte de le découvrir eux-mêmes si vous définissez simplement qu'il est très clair que l'échappement est quelque chose qui appartient à la couche de base de données et ne doit pas être fait ailleurs.


1 commentaires

+1 pour 'gérer l'échappement dans un endroit'. J'aimerais pouvoir vous donner +5 pour cela ;-)



0
votes

Si j'étais dans votre position, je ne serais pas assez paresseux pour ne pas revoir le code de tout le monde. Même si vous n'ayez pas révisé pour l'évacuation de l'entrée de l'utilisateur, vous pouvez toujours voir si leur code est effectué efficacement. Ou peut-être que ce n'est pas que vous faites l'examen, mais quelqu'un doit le faire.

J'ai connu une configuration presque similaire, il n'y a pas si longtemps, où nous avons divisé les tâches par des couches. On a travaillé sur le modèle, j'ai travaillé sur le contrôleur et l'autre a travaillé sur les points de vue. Parce que nous faisions confiance à tout le monde que le code de tout le monde fonctionnera comme nous nous attendions à ce que cela fonctionne, nous n'avions pas la peine de passer en revue le code de l'autre tant que nous devions les fusionner. Ce qui s'est passé a été découvert du code inefficace dans le modèle tard dans le développement. Et ce n'était pas seulement inefficace, ça n'a pas fonctionné! À cause de cela, nous avons dû réexaminer d'énormes morceaux de code qui nous a coûté plus de temps.

Je vous suggère de créer un document de spécification des exigences techniques où il est spécifié dans les entrées acceptables des utilisateurs. Ce document doit être suivi par ceux qui coderont la pièce qui acceptera la saisie de l'utilisateur. Mieux encore, créez des tests d'unités pour voir si ces exigences sont suivies de manière stricte afin de ne pas avoir à vous inquiéter si les données qu'ils vont vous passer sont invalides.

Autre chose ... Puisque vous utilisez php, pourquoi ne pas utiliser un bon cadre? La plupart des cadres disponibles sont accompagnés de leur propre dal où vous n'avez plus besoin de vous inquiéter de l'évacuation de la base de données (eh bien, pas beaucoup). Les cadres devraient le faire pour vous.

En outre, vous voudrez peut-être examiner les "déclarations préparées".


0 commentaires

7
votes

Avez-vous envisagé pas échapper aux données jusqu'à ce qu'il frappe la couche d'accès aux données? Je demande, parce que leur quelques avertissements relatifs à l'approche de votre équipe prend:

  • Si vous avez besoin de données de formulaire d'affichage à l'utilisateur (par exemple, pour réafficher le formulaire avec un message d'erreur, car une validation a échoué), vous devez de-échapper aux données (parce que est pas spécial HTML), puis à nouveau échapper les données (parce que << / code> est spécial). Si vous avez besoin d'afficher les données de formulaire à l'utilisateur tiré de la base de données , vous ne devez pas faire cette étape de-évasion (parce qu'il a été fait par la base de données, lorsque les données ont été enregistrées), mais toujours doit faire l'étape d'échappement HTML. Si vous faites une erreur et faire la mauvaise procédure, vous données corrompues ou pire présenter des problèmes de sécurité.
  • Vous pouvez traiter les différents formats de différentes sources problème en a décidé toutes les données transmises autour de votre application seront échappés. Ainsi, votre couche d'accès aux données re-échapper aux données lors de l'obtenir à partir de la base de données. Mais, comme les différentes parties de la nécessité de l'application légèrement (ou totalement) différentes évasions, ce qui conduit rapidement à de beaucoup de de-évasion / non-sens re-évasion. Prenez les données de la base de données, y échapper, de-y échapper, échapper pour HTML, sortie il.
  • Votre forme frontal code de gestion doit avoir une connaissance intime de votre base de données. Par exemple, qu'est-ce que \ ' mean à votre base de données? Comment un ou \ tentative d'évasion - le cas échéant? Si vous changez votre moteur de base de données, ou même modifier ses paramètres, ceux-ci peuvent changer. Et puis vous avez un tas d'échapper / de-code pour échapper à trouver. Manquer une seule évasion / de-fuite peut conduire à l'injection SQL.
  • Vous pouvez prendre cette connaissance de la base de données sur le code-end avant en ayant la couche de base de données ne cycle de-évasion / évasion à convertir à partir de votre séquence d'échappement application standard à votre base de données de. Mais cela semble un peu idiot!

    Il y a une autre façon: Soit selon couche a besoin des données se sont échappés échapper à lui-même. Les données sont toujours passé entre les couches sous forme brute, non échappés. Ainsi, votre couche d'accès aux données n'échappant à toute base de données. Votre code de sortie HTML fait tout Escaping HTML. Lorsque vous décidez que vous voulez générer des fichiers PDF, votre code PDF PDF fait tout échapper.

    • Maintenant, quand vous faites la sortie forme, son clair ce qu'il faut faire: toujours échapper les données HTML. Peu importe d'où il vient. Ne faites jamais fonctionner un de-évasion.
    • Il n'y a maintenant dé-évasion / non-sens d'évasion, car tout est passé autour brut. Il est seulement échappé si nécessaire.
    • Votre code frontal ne se soucie pas de la mise en œuvre de la couche d'accès aux données. Les magasins de la couche d'accès aux données et retourne une chaîne arbitraire.
    • Vous avez seulement un endroit à regarder dans votre application pour vous assurer que vous avez pas de problèmes d'injection SQL.
    • Vous pouvez facilement utiliser la base de données pilote caractéristiques telles que des espaces réservés. Alors même pas votre couche d'accès aux données doit être au courant des exigences qui s'échappent de chaque base de données; les poignées de pilote de base de données il.

0 commentaires