1. Qu’est-ce que l’injection SQL ? L’injection SQL consiste à insérer des commandes SQL dans le formulaire pour soumettre ou saisir la chaîne de requête du nom de domaine ou de la requête de page, et enfin tromper le serveur pour qu’il exécute certaines commandes SQL malveillantes. En soumettant des paramètres pour construire des instructions SQL intelligentes, vous pouvez obtenir avec succès les données souhaitées.
2. SQL type d’injection Plus précisément, l’injection SQL peut être divisée en cinq catégories, à savoir : injection de nombres, injection de caractères, injection de recherche (comme ça), injection en interne, et injection de connexion de phrases. Du point de vue de l’application, une attention particulière doit être portée à l’injection SQL dans l’IP, la recherche, la suppression par lots et le transfert de base de données à base de données.
3. Comment injecter
Voyons un exemple typique
SqlCommand cmd = new SqlCommand(« SELECT * FROM PE_USERS WHERE UserName = ' » 2+ Nom d’utilisateur + « ' ET Mot de passe utilisateur = ' » + Mot d’accès + « ' », conn) ; Puisqu’il n’y a pas de validation pour UserName et PassWord, si UserName="admin' OR 1=1-- » L’instruction SQL exécutée devient :
SÉLECTIONNEZ * DEPUIS PE_USERS OÙ UserName='admin' OU 1=1—' ET UserPassword='' Cela entraîne une injection SQL, et les conditions sont toujours valables, ce qui permet de vous connecter avec succès sans mot de passe.
4. Comment prévenir l’injection SQL
1. Filtrer ou convertir les chaînes suspectes
L’injection SQL est empêchée en écrivant des fonctions qui filtrent ou convertissent les chaînes dangereuses, puis utilisent GLOBAL.ASAX ou réécrivent les instances contextuelles
Voici un exemple
bool statique public SqlFilter2(chaîne InText) 2 { 3 string word="and|exec|insert|select|delete|update|chr|mid|master|or|truncate|char|declare|join » ; 4 if(InText==null) 5 retourner faux ; 6 forach (chaîne i dans le mot). Split('|')) 7 { 8 if((InText.ToLower(). IndexOf(i+ » « )>-1)|| (InText.ToLower(). IndexOf( » « +i)>-1)) 9 { 10 reviennent vrais ; 11 } 12 } 13 retourne faux ; 14 }
2. Global.asax
vide protégé Application_BeginRequest(Object sender, EventArgs e) 2 { 3 // Parcourir les paramètres Post, sauf pour les domaines cachés 4 Foreach (la chaîne I dans ceci. Demande.Formulaire) 5 { 6 if(i=="__VIEWSTATE »)continuez ; 7 this.goErr(this). Request.Form.ToString()) ; 8 } 9 // Traversez le paramètre Get. 10 de forage (chaîne i dans ce livre). Request.QueryString) 11 { 12 this.goErr(this). Request.QueryString.ToString()) ; 13 } 14 } vide privé goErr(chaîne tm) 2 { 3 si (WLCW. Extend.CValidity.SqlFilter2(tm)) 4 Ça. Response.end() 5 } Avantages : cet aspect est utilisé par la plupart des programmeurs débutants pour empêcher l’injection SQL, et il semble bien fonctionner dans la plupart des cas.
Inconvénients : 1. Il filtre certains caractères qui n’étaient pas utilisés à l’origine pour l’injection, causant des problèmes inattendus. Par exemple, si le nom d’un membre du forum contient les mêmes caractères que les caractères filtrés, cela provoquera des problèmes et des difficultés inattendus.
2. Un filtrage ou une conversion est nécessaire à chaque fois, ce qui réduit l’efficacité du programme
2. Utiliser des procédures stockées pour les requêtes paramétriques
Le principal objectif de l’injection SQL est d’exécuter des commandes malveillantes dans la base de données en soumettant du code SQL malveillant. Ainsi, tant que les commandes SQL sont traitées avant l’exécution, l’injection SQL peut être efficacement empêchée. Les requêtes paramétrées peuvent efficacement empêcher l’injection SQL.
Exemple
const string strSql = « SELECT * FROM [PE_Users] WHERE UserName = @UserName » ; Paramètres parms = nouveaux Paramètres(« @UserName », DbType.String, userName) ; Il existe un paramètre @UserName ci-dessus, utilisant l’objet Prarmeter, par lequel le paramètre est ajouté à l’objet Commande, Cela vous donne une requête paramétrée. Comme décrit ci-dessus, ADO.NET envoie la déclaration SQL suivante à SQL Server :
Exécutif sp_executesql N 'select * from [pe_users] où username=@username ',N '@username nvarchar(20) ',@username=N 'nom' SQL Server remplace @username par la chaîne « name » avant d’exécuter la requête. Supposons que vous ayez les entrées suivantes :
'union select @@version, null, null— L’instruction SQL générée ressemble à ceci :
Exécutif sp_executesql N 'select * from [pe_users] où username=@username ',N '@username nvarchar(20) ',@username=N ''' union select @@version,null,null-- ' Vous pouvez voir que ADO.NET échappe à l’entrée.
- public SqlParameter Add(string parameterName, SqlDbType sqlDbType, int size);
Code de copie
DbTye ou SqlDbType peuvent être une variété de types de données. Vous pouvez choisir en fonction de votre type de données. Dans certains endroits, il peut aussi être utilisé pour spécifier la longueur du paramètre : int size. Cela évite également efficacement les débordements de bases de données et les notes SQL Possibilité d’entrer. Avantages : Empêche efficacement l’injection SQL. Inconvénients : Certains endroits ne peuvent pas être appliqués, comme dans.
3. Liste blanche
Description : Certaines plages de paramètres connues peuvent être gérées sous forme de whitelists, ce qui peut empêcher l’injection SQL et l’interrogation Faux, par exemple : ordre par + nom de colonne, lorsque le nom de la colonne est passé sous forme de paramètre, une liste blanche peut être formulée pour juger d’abord le paramètre que le numéro soit dans la liste blanche, puis interrogez, sinon il sera traité incorrectement. Avantages : sûr et fiable Inconvénients : Petit nombre d’applications |