Question

Quel est le meilleur moyen de se protéger contre l'injection SQL pour une application ASP classique?

FYI, je l’utilise avec une base de données d’accès. (Je n'ai pas écrit l'application)

Était-ce utile?

La solution

Procédures stockées et / ou instructions préparées:

https://stackoverflow.com/questions / 1973 / quel-est-le-meilleur-moyen-d'éviter-les attaques par injection SQL

Puis-je protéger contre l'injection SQL en échappant les guillemets simples à l'utilisateur et entourant l'entrée?

Catching SQL Injection et autres requêtes Web malveillantes

Avec Access DB, vous pouvez toujours le faire, mais si l'injection SQL vous inquiète déjà, je pense que vous devez tout de même quitter Access.

Voici un lien vers la technique dans Access:

http://www.asp101.com/samples/storedqueries.asp

Notez que ce qui protège généralement contre l’injection n’est pas la procédure stockée elle-même, mais bien le fait qu’elle soit paramétrée et non dynamique. N'oubliez pas que même les SP qui construisent du code dynamique peuvent être vulnérables à l'injection s'ils utilisent des paramètres de certaines manières pour générer le code dynamique. Globalement, je préfère les SP car ils forment une couche d'interface que les applications accèdent à la base de données. Les applications ne sont donc même pas autorisées à exécuter du code arbitraire.

De plus, le point d'exécution de la procédure stockée peut être vulnérable si vous n'utilisez pas de commande et de paramètres, par exemple. cela reste vulnérable car il est construit dynamiquement et peut être une cible d'injection:

Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;

N'oubliez pas que votre base de données doit défendre son propre périmètre et que, si plusieurs logins disposent de droits sur INSERT / UPDATE / DELETE dans les tableaux, tout code contenu dans ces applications (ou dans les applications compromises) peut constituer un potentiel. problème. Si les logins ne disposent que des droits pour exécuter des procédures stockées, il s'agit d'un entonnoir par lequel vous pouvez beaucoup plus facilement garantir un comportement correct. (Similaire aux concepts OO dans lesquels les objets sont responsables de leurs interfaces et n'exposent pas tout leur fonctionnement interne.)

Autres conseils

Voici quelques scripts sqlinject que j'ai créés il y a longtemps une version simple et une version étendue:

function SQLInject(strWords) 
dim badChars, newChars, i
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") 
newChars = strWords 
for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 
newChars = newChars 
newChars= replace(newChars, "'", "''")
newChars= replace(newChars, " ", "")
newChars= replace(newChars, "'", "|")
newChars= replace(newChars, "|", "''")
newChars= replace(newChars, "\""", "|")
newChars= replace(newChars, "|", "''")
SQLInject=newChars
end function 


function SQLInject2(strWords)
dim badChars, newChars, tmpChars, regEx, i
badChars = array( _
"select(.*)(from|with|by){1}", "insert(.*)(into|values){1}", "update(.*)set", "delete(.*)(from|with){1}", _
"drop(.*)(from|aggre|role|assem|key|cert|cont|credential|data|endpoint|event|f ulltext|function|index|login|type|schema|procedure|que|remote|role|route|sign| stat|syno|table|trigger|user|view|xml){1}", _
"alter(.*)(application|assem|key|author|cert|credential|data|endpoint|fulltext |function|index|login|type|schema|procedure|que|remote|role|route|serv|table|u ser|view|xml){1}", _
"xp_", "sp_", "restore\s", "grant\s", "revoke\s", _
"dbcc", "dump", "use\s", "set\s", "truncate\s", "backup\s", _
"load\s", "save\s", "shutdown", "cast(.*)\(", "convert(.*)\(", "execute\s", _
"updatetext", "writetext", "reconfigure", _
"/\*", "\*/", ";", "\-\-", "\[", "\]", "char(.*)\(", "nchar(.*)\(") 
newChars = strWords
for i = 0 to uBound(badChars)
Set regEx = New RegExp
regEx.Pattern = badChars(i)
regEx.IgnoreCase = True
regEx.Global = True
newChars = regEx.Replace(newChars, "")
Set regEx = nothing
next
newChars = replace(newChars, "'", "''")
SqlInject2 = newChars
end function

"Un moyen efficace de se protéger contre l'injection SQL pour une application ASP classique" est de valider impitoyablement toutes les entrées. Période.

Les procédures stockées seules et / ou un système de base de données différent n'équivalent pas nécessairement à une bonne sécurité.

MS a récemment mis en place un outil d’inspection d’injection SQL qui recherche les entrées non validées utilisées dans une requête. C’est ce que vous devriez rechercher.

Voici le lien: L'outil Analyseur de code source Microsoft pour l'injection SQL permet de rechercher les vulnérabilités d'injection SQL dans le code ASP

À l'aide de requêtes paramétrées, vous devez créer un objet de commande, lui attribuer des paramètres avec un nom et une valeur. Si vous le faites, vous n'aurez plus à vous soucier de rien (en vous référant à l'injection SQL;))

http://prepared-statement.blogspot.com /2006/02/asp-prepared-statements.html

Et ne faites pas confiance aux procédures stockées, elles peuvent également devenir un vecteur d'attaque si vous n'utilisez pas d'instructions préparées.

si les procédures stockées ne sont pas une option - et même si elles le sont - valider toutes les entrées de manière approfondie

Hé, toute base de données et développeur qui l'utilise.

Rien de plus mais rien de moins.

Si vous êtes un bon développeur, vous pouvez créer un site de commerce électronique en utilisant des fichiers texte comme base de données. Oui, il ne sera pas aussi performant qu'un site Web géré par Oracle, mais il conviendra parfaitement aux petites entreprises telles que la fabrication de bijoux sur mesure à domicile.

Et si vous êtes un bon développeur, vous n'utiliserez pas d'instructions SQL en ligne sur vos pages ASP. Même dans Access, vous avez la possibilité de créer et d’utiliser des requêtes.

Stocker les procs avec vérification des données, avec encodage HTML - est le meilleur moyen de prévenir toute attaque par injection SQL.

L'outil Analyseur de code source Microsoft pour l'injection SQL est disponible pour rechercher les vulnérabilités d'injection SQL dans Code ASP

Basculer au minimum vers SQL Express est une excellente option. Cela rendra les choses beaucoup plus sûres. Même si l'utilisation de paramètres et de procédures stockées peut grandement aider. Je vous recommande également de valider les entrées avec soin pour vous assurer qu'elles correspondent à ce que vous attendez.

Pour des valeurs telles que des nombres, il est assez facile d’extraire le nombre pour vérifier qu’il s’agit bien d’un nombre. Échappe à tous les caractères spéciaux pour SQL. Cela empêchera la tentative d’attaque de fonctionner.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top