80 votes

Quelle est la meilleure façon d’éviter les attaques par injection SQL ?

J’ai apporté une solution pour Python... s’il vous plaît la chair ceci dehors avec des exemples pour les autres langues.

79voto

Wedge Points 11910

Ne faites jamais confiance à la saisie de l'utilisateur, ne faites jamais confiance du client en entrée, côté client, de l'assainissement efforts ne servent à rien, il ne prend pas beaucoup de sophistication à votre web app directement. Toujours effectuer l'assainissement côté serveur, ne pensez même pas à côté client de l'assainissement, c'est un gaspillage d'efforts. Il ya un couple de techniques qui sont utiles pour éviter les attaques par injection SQL, je vais y aller de moins favorable pour les plus favorisés.

  • 3: Mesure De La Valeur De L'Assainissement. Éviter d'écrire vos propres routines d'assainissement, autant que possible, sauf quand c'est absolument la seule option restante (ce qui est très rare dans aucune langue moderne). Entrée à l'assainissement est un problème difficile, et les coûts de se tromper sont énormes. Il est préférable de laisser cette tâche à quelqu'un d'autre. Lorsque vous êtes forcé de s'appuyer sur cette méthode d'utilisation de liste blanche plutôt que de black-listage de vérifier les entrées.

  • 2: Cadre / Bibliothèque En Fonction De La Valeur De L'Assainissement. Quitter l'assainissement des routines pour les experts du domaine. L'assainissement des routines en 1ère partie des cadres et des bibliothèques sont généralement créés par les mêmes gens qui ont écrit la bd ou de l'API SQL. Ils ont beaucoup plus de chances de connaître, et correctement la manipulation, tous les cas de bord que vous. Un exemple de cette technique serait à l'aide de php mysql_escape_string() pour désinfecter les valeurs à insérer dans les chaînes qui servent les instructions SQL dynamiques.

  • 1: La Liaison Des Paramètres. (aka déclarations préparées à l'avance) au Lieu de la construction d'une instruction SQL comme une chaîne brute qui comprend les données de l'utilisateur en place des valeurs littérales, créer une instruction SQL avec des jetons où les données de l'utilisateur serait. Puis lier les données fournies par les utilisateurs pour les paramètres appropriés. La clé ici est que cette lie les données fournies à un type spécifique et une utilisation spécifique et élimine toute possibilité de changer la logique de l'instruction SQL. Cela peut être utilisé en conjonction avec les bibliothèques d'entrée de l'assainissement.

Voici un exemple en C# (Java et Python ont des fonctionnalités similaires, voir les autres réponses):

SqlCommand userInfoQuery = new SqlCommand(
    "SELECT id, name, email FROM users WHERE id = @UserName", 
    someSqlConnection);

SqlParameter userNameParam = userInfoQuery.Parameters.Add("@UserName",
    SqlDbType.VarChar, 25 /* max length of field */ );

// userName is some string valued user input variable
userNameParam.Value = userName;

19voto

Mario Marinato -br- Points 2933

Oracle a obtenu un tutoriel complet sur le sujet:

La défense Contre les Attaques par Injection SQL

Sans mesures de protection, les applications sont vulnérables à diverses formes d'atteinte à la sécurité. Il est particulièrement envahissant la méthode d'attaque est appelé par injection SQL. En utilisant cette méthode, un pirate peut passer chaîne d'entrée d'une application avec l'espoir de gagner l'accès non autorisé à une base de données.

En prenant cette auto-étude tutoriel, vous pouvez vous armer avec des techniques et des outils pour renforcer votre code et les applications contre ces attaques.

17voto

Mark Harrison Points 77152

À l’aide de l’API de Python DB, ne procédez comme suit :

au lieu de cela, procédez comme suit :

17voto

Jon Galloway Points 28243

Si vous êtes en utilisant .NET, il y a un joli article complet sur la prévention de l'Injection SQL sur MSDN: http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx

Mais, tout comme les jeux de guerre, la meilleure façon de gagner de l'Injection SQL jeu est de ne pas jouer.

N'utilisez pas de chaînes SQL - utiliser un OU/M outil comme LINQ to SQL, Subsonique, NHibernate, etc.

Tout populaire OU/M (comme ceux que j'ai mentionné) utilise des requêtes paramétrées et d'autres mesures destinées à prévenir l'Injection SQL.

6voto

realcals Points 597

Si votre DB leur permet, les procédures stockées peuvent aider à réduire les risques d’injection sql.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X