Tout le monde connaît l'injection SQL. Il s'agit d'une méthode d'attaque courante. Les attaquants entrent dans des fragments SQL étranges sur les informations de formulaire ou l'URL de l'interface, telles que les instructions "ou '1' = '1'", qui peuvent envahir les applications avec une vérification insuffisante des paramètres. Nous devons donc faire un certain travail dans notre application pour empêcher de telles méthodes d'attaque. Dans certaines applications à haute sécurité, comme les logiciels bancaires, nous utilisons souvent la méthode de remplacement de toutes les instructions SQL par des procédures stockées pour empêcher l'injection SQL. C'est bien sûr un moyen très sûr, mais nous n'avons peut-être pas besoin de cette méthode rigide dans notre développement quotidien.
En tant que cadre de la couche de persistance semi-automatisée, le cadre MyBatis doit être écrit manuellement par nous-mêmes. À l'heure actuelle, bien sûr, il est nécessaire d'empêcher l'injection de SQL. En fait, SQL de MyBatis est une structure avec une fonction "Input + Output", similaire à une fonction, comme suit:
<select id = "getblogbyid" resultType = "blog" ParameterType = "int"> <br> SELECT ID, titre, auteur, contenu dans le blog où id = # {id} </lect> Ici, ParameterType indique le type de paramètre d'entrée, et ResultType indique le type de paramètre de sortie. En réponse à ce qui précède, si nous voulons empêcher l'injection de SQL, nous devons naturellement travailler dur sur les paramètres d'entrée. La partie en surbrillance du code ci-dessus est la pièce où les paramètres d'entrée sont épissés dans SQL. Après avoir transmis les paramètres, imprimez l'instruction SQL exécutée et vous verrez que SQL ressemble à ceci:
Sélectionnez ID, titre, auteur, contenu du blog où id =?
Peu importe les paramètres saisis, le SQL imprimé est comme ça. En effet, MyBatis permet la fonction de précompilation. Avant l'exécution de SQL, le SQL ci-dessus sera envoyé à la base de données pour la compilation. Pendant l'exécution, vous pouvez utiliser directement le SQL compilé et remplacer l'espace réservé "?". Étant donné que l'injection SQL ne peut fonctionner que sur le processus de compilation, cette méthode peut éviter le problème de l'injection SQL.
Comment MyBatis réalise-t-il la pré-compilation de SQL? En fait, au bas du cadre, la classe de mise en scène de JDBC est à l'œuvre. PréparetStatement est une sous-classe de déclaration que nous connaissons très bien. Son objet contient des instructions SQL compilées. Cette approche "prête" améliore non seulement la sécurité, mais améliore également l'efficacité lors de l'exécution d'un SQL plusieurs fois, car SQL a été compilé et n'a pas besoin de compiler lors de l'exécution à nouveau.
Cela dit, pouvons-nous empêcher l'injection SQL en utilisant MyBatis? Bien sûr que non, veuillez consulter le code suivant:
<select id = "orderblog" resultType = "blog" ParameterType = "map"> SELECT ID, titre, auteur, contenu dans l'ordre du blog par $ {OrderParam} </lect> Après une observation minutieuse, le format du paramètre en ligne est passé de "# {xxx}" à $ {xxx}. Si nous attribuons le paramètre "OrderParam" à "ID" et imprimons le SQL, cela ressemble à ceci:
Sélectionnez ID, titre, auteur, contenu de l'ordre du blog par ID
De toute évidence, cela ne peut pas empêcher l'injection de SQL. Dans MyBatis, les paramètres du format "$ {xxx}" participeront directement à la compilation SQL, empêchant ainsi les attaques d'injection. Cependant, en ce qui concerne les noms de table dynamiques et les noms de colonnes, nous ne pouvons utiliser que des formats de paramètres comme "$ {xxx}", nous devons donc traiter manuellement ces paramètres dans le code pour empêcher l'injection.
Conclusion: Lorsque vous écrivez des instructions de mappage MyBatis, essayez d'utiliser le format "# {xxx}". Si vous devez utiliser des paramètres comme "$ {xxx}", vous devez faire manuellement un bon travail de filtrage pour éviter les attaques d'injection SQL.
Ce qui précède est le contenu complet du cadre de la couche de persistance Java Mybatis empêche l'injection SQL que l'éditeur vous apporte. J'espère que tout le monde soutiendra Wulin.com plus ~