Quel est un moyen efficace de se protéger contre l'injection SQL pour une application asp classique?
Pour info je l'utilise avec une base de données d'accès. (Je n'ai pas écrit l'application)
Procédures stockées et/ou déclarations préparées:
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
capture d'injection SQL et autres requêtes Web malveillantes
Avec Access DB, vous pouvez toujours le faire, mais si vous êtes déjà inquiet à propos de l'injection SQL, je pense que vous devez quand 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 le fait qu'elle est paramétrée et non dynamique. N'oubliez pas que même les SP qui créent du code dynamique peuvent être vulnérables à l'injection s'ils utilisent les paramètres de certaines manières pour construire le code dynamique. Dans l'ensemble, je préfère les SP car ils forment une couche d'interface que les applications accèdent à la base de données, de sorte que les applications ne sont même pas autorisées à exécuter du code arbitraire en premier lieu.
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 ex. ceci est toujours 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 si plusieurs connexions ont le droit de INSERT/UPDATE/DELETE
dans les tableaux, tout code dans ces applications (ou applications compromises) peut être un problème potentiel. Si les connexions n'ont que le droit d'exécuter des procédures stockées, cela forme un entonnoir à travers lequel vous pouvez beaucoup plus facilement garantir un comportement correct. (Similaire à OO concepts où les objets sont responsables de leurs interfaces et n'exposent pas tous leurs fonctionnements internes.)
Voici quelques scripts sqlinject que j'ai fait 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" consiste à 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 sorti un outil d'inspection d'injection SQL qui recherche une entrée non validée utilisée dans une requête. C'EST ce que vous devriez rechercher.
Voici le lien: L'outil Microsoft Source Code Analyzer for SQL Injection est disponible pour trouver les vulnérabilités d'injection SQL dans ASP
À l'aide de requêtes paramétrées, vous devez créer un objet de commande, lui affecter des paramètres avec un nom et une valeur, si vous le faites, vous n'aurez pas à vous soucier de quoi que ce soit d'autre (référence à l'injection sql bien sûr;))
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 soigneusement toutes les entrées
Hé, n'importe quelle base de données aussi bonne qu'un 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, ce ne sera pas aussi bon qu'un site Web piloté par Oracle, mais il conviendra parfaitement aux petites entreprises comme la fabrication de bijoux personnalisés à 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, ainsi que le codage html - est le meilleur moyen de prévenir toute attaque par injection SQL.
l'outil Microsoft Source Code Analyzer for SQL Injection est disponible pour rechercher les vulnérabilités d'injection SQL dans ASP