J'ai une API Web qui se connecte à mon serveur SQL à l'aide d'une connexion en lecture seule et je souhaite autoriser les utilisateurs avertis de mon API à entrer une clause SQL where sur la chaîne de requête. Je veux simplement dire ce qu'ils entrent dans l'instruction select.
Une connexion en lecture seule à la base de données avec un privilège minimum (sélection de la capacité sur une seule table) empêche-t-elle toutes les attaques par injection?
Non. Vous pourriez confondre l'injection SQL avec l'injection de données; les tables en lecture seule n'empêchent pas l'injection SQL et au mieux ne font que peu pour limiter son impact.
L'injection SQL signifie simplement la possibilité d'injecter du code SQL. Bien que les tables en lecture seule puissent limiter la capacité à injecter data dans la table, elles n'ont pas d'impact sur la capacité à:
Si vous
veulent simplement clouer ce qu'ils entrent dans l'instruction
select
.
alors vous autorisez expressément l'attaquant à essayer n'importe lequel de ces éléments.
Maintenant, vous pouvez certainement faire des choses pour limiter cela. Vous pouvez interdire les guillemets et les caractères de séparation des instructions SQL. Vous pouvez interdire toute entrée qui n'est pas [A-Za-z0-9"=]
(ou équivalent équivalent à votre base de données). Mais si vous commencez à suivre ce chemin, vous feriez mieux d'écrire votre application correctement : exposez une interface de requête plus riche où vous proposez les clés à vérifier puis vous effectuez des citations appropriées sur toutes les valeurs entrées par l'utilisateur.
Non, exemple trivial
EXEC ('SELECT COUNT(*)
FROM table
WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')
Définissez @Password sur a' OR 1=1;--
Et votre mot de passe est contourné
Une connexion en lecture seule à la base de données avec un privilège minimum (sélection de la capacité sur une seule table) empêche-t-elle toutes les attaques par injection?
L'injection SQL est un moyen pour un attaquant de modifier une instruction existante afin qu'elle provoque des actions involontaires. Ces actions peuvent être des modifications de la base de données ou l'exécution de code sur le système, mais aussi simplement renvoyer des données qu'il ne devrait pas ou faire un déni de service en exécutant des opérations gourmandes en ressources.
Restreindre les requêtes aux seules sélections sur une table spécifique peut limiter l'impact, mais vous pourrez probablement toujours provoquer un déni de service. Et selon l'endroit où les résultats de la requête seront utilisés, vous pouvez modifier le comportement de l'application en renvoyant des résultats inattendus.
Pas du tout. Les failles d'injection SQL ne se trouvent pas au niveau du serveur SQL mais au niveau de l'application Web, donc si l'application Web est sensible à l'injection SQL, elle le restera quel que soit le niveau d'accès à la base de données.
Cependant, le principe du moindre privilège que vous mentionnez fait que, même si quelqu'un parvient à exploiter une injection SQL sur l'application Web, il n'obtiendra qu'un accès en lecture sur le contenu de la base de données, il ne pourra pas modifier le contenu ou la structure de la base de données .