Maison >développement back-end >Tutoriel Python >Comment éviter l'injection SQL dans Django

Comment éviter l'injection SQL dans Django

(*-*)浩
(*-*)浩original
2019-05-09 09:54:435679parcourir

Méthodes pour éviter l'injection SQL dans Django : 1. Vérifiez les entrées de l'utilisateur ; 2. Ne pas utiliser l'assemblage dynamique de SQL ; 3. Ne pas stocker directement les informations confidentielles 4. Les informations sur les exceptions d'application doivent être fournies. invites autant que possible ; 5. Utilisez l'ORM de Dajngo pour éviter efficacement l'injection SQL.

Comment éviter l'injection SQL dans Django

Qu'est-ce que l'injection SQL ?

Ce qu'on appelle l'injection SQL consiste à insérer des commandes SQL dans les soumissions de formulaires Web ou à saisir des chaînes de requête pour des noms de domaine ou des demandes de pages, incitant finalement le serveur à exécuter des commandes SQL malveillantes. Plus précisément, il s'agit de la possibilité d'utiliser des applications existantes pour injecter des commandes SQL (malveillantes) dans le moteur de base de données principal en vue de leur exécution. Il peut obtenir des informations sur un site Web présentant des vulnérabilités de sécurité en saisissant des instructions SQL (malveillantes) dans un formulaire Web. que d'exécuter des instructions SQL comme prévu par le concepteur. Par exemple, de nombreux sites Web de cinéma et de télévision ont divulgué les mots de passe des membres VIP, principalement en soumettant des caractères de requête via des formulaires WEB. Ces formulaires sont particulièrement vulnérables aux attaques par injection SQL.

Par exemple, il y a maintenant une table front_user dans la base de données. La structure de la table est la suivante :

class User(models.Model): telephone = models.CharField(max_length=11) username = models.CharField(max_length=100)
 password = models.CharField(max_length=100)

Ensuite, nous utilisons des instructions SQL natives pour répondre aux exigences suivantes :

1. Implémentez une vue pour obtenir les détails de l'utilisateur en fonction de l'ID utilisateur. L'exemple de code est le suivant :

def index(request): user_id = request.GET.get('user_id') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where id=%s' % user_id) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

Cela semble bien en surface. Mais si l'id_utilisateur transmis par l'utilisateur est égal à 1 ou 1=1, alors l'instruction SQL épissée ci-dessus est :

select id,username from front_user where id=1 or 1=1

La condition de l'instruction SQL ci-dessus est id=1 ou 1=1, tant que id=1 ou Si l'un des deux 1=1 est vrai, alors la condition entière est vraie. Il ne fait aucun doute que 1=1

est définitivement établi. Par conséquent, après avoir exécuté l'instruction SQL ci-dessus, toutes les données de la table front_user seront extraites.

2. Implémentez une vue qui extrait les utilisateurs en fonction de leur nom d'utilisateur. L'exemple de code est le suivant :

def index(request): username = request.GET.get('username') cursor = connection.cursor() cursor.execute('select 
id,username from front_user where username='%s'' % username) rows = cursor.fetchall() for row in rows: print(row) 
return HttpResponse('success')

Cela ne semble poser aucun problème en surface. Mais si le nom d'utilisateur transmis par l'utilisateur est zhiliao' ou '1=1, alors l'instruction SQL épissée ci-dessus est :

select id,username from front_user where username='zhiliao' or '1=1'

La condition de l'instruction sql ci-dessus est username='zhiliao' ou une chaîne , aucun doute, le jugement de chaîne est définitivement établi. Par conséquent, toutes les données de la table front_user seront extraites.

La défense contre l'injection SQL peut être classée selon les points suivants :

Ce qui précède est le principe de l'injection SQL. Il détruit l'instruction SQL originale en transmettant des paramètres malveillants pour atteindre ses propres objectifs. Bien entendu, l’injection SQL est loin d’être simple, et ce dont nous parlons maintenant n’est que la pointe de l’iceberg. Alors, comment empêcher l’injection SQL ?

1. Ne faites jamais confiance aux entrées des utilisateurs. Pour vérifier la saisie de l'utilisateur, vous pouvez utiliser des expressions régulières ou limiter la longueur ; convertir des guillemets simples et des « - » doubles, etc.

2. N'utilisez jamais d'assemblage dynamique de SQL. Vous pouvez utiliser du SQL paramétré ou utiliser directement des procédures stockées pour la requête et l'accès aux données. Par exemple :

def index(request): user_id = '1 or 1=1' cursor = connection.cursor() cursor.execute('select id,username from 
front_user where id=%s',(user_id,)) rows = cursor.fetchall() for row in rows: print(row) return HttpResponse('success')

3. N'utilisez jamais une connexion à une base de données avec des privilèges d'administrateur. Utilisez une connexion à une base de données distincte avec des privilèges limités pour chaque application.

4. Ne stockez pas d'informations confidentielles directement, ne cryptez pas ou ne hachez pas les mots de passe et les informations sensibles.

5. Les informations d'exception de l'application doivent donner le moins d'indices possible. Il est préférable d'utiliser des informations d'erreur personnalisées pour envelopper les informations d'erreur d'origine.

Résumé :

1. Utilisez des instructions SQL pour effectuer des attaques par injection sur les pages Web. La page Web obtient les paramètres d'entrée de l'utilisateur, mais certains utilisateurs malveillants utilisent des instructions SQL spéciales. pour télécharger les paramètres. Si vous ne jugez pas l'exactitude et la légalité des paramètres obtenus à la fin, cela peut endommager la base de données

2 Lors du téléchargement de données avec get et post, vérifiez les paramètres

.

3. L'utilisation de l'ORM de Dajngo peut effectivement éviter l'injection SQL, car Django a échappé aux caractères spéciaux

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn