J'essaie de mettre en place une injection anti SQL en java et je trouve très difficile de travailler avec la fonction de chaîne "replaceAll". En fin de compte, j'ai besoin d'une fonction qui convertira tout existant \
en \\
, tout "
en \"
, tout '
en \'
et tout en \n
de \\n
sorte que lorsque la chaîne est évaluée par des injections SQL MySQL soient bloquées.
J'ai monté du code avec lequel je travaillais et tous les éléments \\\\\\\\\\\
de la fonction me rendent fou. Si quelqu'un avait un exemple de cela, je l'apprécierais beaucoup.
CREATE VIEW myview AS SELECT * FROM mytable WHERE col = ?
donné que l'instruction principale est une instruction DDL , même si la partie que vous essayez de paramétrer est en fait DML .Réponses:
Les PreparedStatements sont la voie à suivre, car ils rendent l'injection SQL impossible. Voici un exemple simple prenant l'entrée de l'utilisateur comme paramètres:
Quels que soient les caractères du nom et de l'e-mail, ces caractères seront placés directement dans la base de données. Ils n'affecteront en aucun cas l'instruction INSERT.
Il existe différentes méthodes de définition pour différents types de données - celle que vous utilisez dépend des champs de votre base de données. Par exemple, si vous avez une colonne INTEGER dans la base de données, vous devez utiliser une
setInt
méthode. La documentation PreparedStatement répertorie toutes les différentes méthodes disponibles pour définir et obtenir des données.la source
Le seul moyen d'empêcher l'injection SQL est d'utiliser SQL paramétré. Il n'est tout simplement pas possible de créer un filtre plus intelligent que les personnes qui piratent SQL pour gagner leur vie.
Utilisez donc des paramètres pour toutes les clauses d'entrée, de mise à jour et where. Le SQL dynamique est simplement une porte ouverte pour les pirates informatiques, et cela inclut le SQL dynamique dans les procédures stockées. Paramétrer, paramétrer, paramétrer.
la source
Si vraiment vous ne pouvez pas utiliser l' option de défense 1: instructions préparées (requêtes paramétrées) ou l' option de défense 2: procédures stockées , ne créez pas votre propre outil, utilisez l' API de sécurité d'entreprise OWASP . Depuis l' ESAPI OWASP hébergé sur Google Code:
Pour plus de détails, consultez Prévention des injections SQL dans Java et Aide-mémoire sur la prévention des injections SQL .
Portez une attention particulière à l' option de défense 3: échapper à toutes les entrées fournies par l'utilisateur qui présente le projet OWASP ESAPI ).
la source
(Ceci est en réponse au commentaire du PO sous la question d'origine; Je suis tout à fait d'accord que PreparedStatement est l'outil pour ce travail, pas les expressions régulières.)
Quand vous dites
\n
, voulez-vous dire la séquence\
+n
ou un caractère de saut de ligne réel? Si c'est\
+n
, la tâche est assez simple:Pour faire correspondre une barre oblique inverse dans l'entrée, vous en mettez quatre dans la chaîne de regex. Pour mettre une barre oblique inverse dans la sortie, vous en mettez quatre dans la chaîne de remplacement. Cela suppose que vous créez les expressions régulières et les remplacements sous la forme de littéraux Java String. Si vous les créez d'une autre manière (par exemple, en les lisant à partir d'un fichier), vous n'avez pas à faire tout ce double échappement.
Si vous avez un caractère de saut de ligne dans l'entrée et que vous souhaitez le remplacer par une séquence d'échappement, vous pouvez effectuer un deuxième passage sur l'entrée avec ceci:
Ou peut-être voulez-vous deux contre-obliques (je ne suis pas trop clair à ce sujet):
la source
Les PreparedStatements sont la voie à suivre dans la plupart des cas, mais pas dans tous. Parfois, vous vous retrouverez dans une situation où une requête, ou une partie de celle-ci, doit être construite et stockée sous forme de chaîne pour une utilisation ultérieure. Consultez la feuille de triche de prévention des injections SQL sur le site OWASP pour plus de détails et des API dans différents langages de programmation.
la source
Les instructions préparées sont la meilleure solution, mais si vous avez vraiment besoin de le faire manuellement, vous pouvez également utiliser la
StringEscapeUtils
classe de la bibliothèque Apache Commons-Lang. Il a uneescapeSql(String)
méthode que vous pouvez utiliser:import org.apache.commons.lang.StringEscapeUtils; … String escapedSQL = StringEscapeUtils.escapeSql(unescapedSQL);
la source
L'utilisation d'une expression régulière pour supprimer du texte qui pourrait provoquer une injection SQL ressemble à ce que l'instruction SQL est envoyée à la base de données via un
Statement
plutôt qu'unPreparedStatement
.L'un des moyens les plus simples d'empêcher une injection SQL en premier lieu consiste à utiliser a
PreparedStatement
, qui accepte les données à remplacer dans une instruction SQL à l'aide d'espaces réservés, qui ne repose pas sur des concaténations de chaînes pour créer une instruction SQL à envoyer à la base de données.Pour plus d'informations, utiliser les instructions préparées à partir des didacticiels Java serait un bon point de départ.
la source
Dans le cas où vous avez affaire à un système hérité, ou si vous avez trop d'endroits pour passer à
PreparedStatement
s en trop peu de temps - c'est-à-dire s'il y a un obstacle à l'utilisation des meilleures pratiques suggérées par d'autres réponses, vous pouvez essayer AntiSQLFilterla source
Vous avez besoin du code suivant ci-dessous. En un coup d'œil, cela peut ressembler à n'importe quel ancien code que j'ai créé. Cependant, j'ai regardé le code source de http://grepcode.com/file/repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.31/com/mysql/jdbc/PreparedStatement. java . Puis après cela, j'ai soigneusement examiné le code de setString (int parameterIndex, String x) pour trouver les caractères qu'il échappe et les ai personnalisés dans ma propre classe afin qu'il puisse être utilisé aux fins dont vous avez besoin. Après tout, s'il s'agit de la liste des personnages qu'Oracle échappe, alors savoir que c'est vraiment réconfortant en termes de sécurité. Peut-être qu'Oracle a besoin d'un coup de pouce pour ajouter une méthode similaire à celle-ci pour la prochaine version majeure de Java.
la source
mysql-connector-java-xxx
, les déclarationscase '\u00a5'
etcase '\u20a9'
semblent avoir été suppriméesorg.ostermiller.utils.StringHelper.escapeSQL()
oucom.aoindustries.sql.SQLUtility.escapeSQL()
.Après avoir recherché une solution de test pour empêcher sqlmap de l'injection SQL, dans le cas d'un système hérité qui ne peut pas appliquer les déclarations préparées partout.
La rubrique java-security-cross-site-scripting-xss-and-sql-injection ÉTAIT LA SOLUTION
J'ai essayé la solution de @Richard mais cela n'a pas fonctionné dans mon cas. j'ai utilisé un filtre
la source
java-security-cross-site-scripting-xss-and-sql-injection topic
? J'essaye de trouver une solution pour une application héritée.De: [Source]
}
la source
Si vous utilisez PL / SQL, vous pouvez également l'utiliser
DBMS_ASSERT
pour nettoyer votre entrée afin que vous puissiez l'utiliser sans vous soucier des injections SQL.voir cette réponse par exemple: https://stackoverflow.com/a/21406499/1726419
la source