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. p>
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. P>
Toute suggestion? P>
3 Réponses :
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. p>
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. P>
avoir peu de contrôle sur l'entrée
niveau (sauf si j'examine personnellement
code de chacun) p>
blockQuote>
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. P>
+1 pour 'gérer l'échappement dans un endroit'. J'aimerais pouvoir vous donner +5 pour cela ;-)
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. P>
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. P>
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. P>
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. P>
En outre, vous voudrez peut-être examiner les "déclarations préparées". P>
Avez-vous envisagé pas em> é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: p>
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. P>
code> 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 em>, 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é. Li>
\ ' code> mean à votre base de données? Comment un code> ou \ code> 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. Li>