[JAVA] Attention aux variables embarquées dans S2Dao

A propos de S2Dao, qui vient d'être EOLed. Je l'utilise pour les affaires, mais c'est dangereux si je ne l'utilise pas correctement, alors prenez-en note.

Variables incorporées

S2Dao fournit des variables intégrées. Si vous ne l'utilisez pas correctement, il se comportera très dangereusement, alors notez-le.

Comment utiliser les variables intégrées

La variable incorporée est décrite comme suit.

/ \ * $ Nom de l'argument * / littéral

Code réel

BalanceDao


@S2Dao(bean = Balance.class)
public interface BalanceDao {
    @Sql("select id, name, amount, created_at, updated_at from balance where name = '/*$name*/'Tanaka''")
    public List<Balance> findByName(String name);
}

Je vais le déplacer

curl


$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=Taro Tanaka"
id:1name:Création de Taro Tanaka_ad:2019-05-03 19:25:33.0updated_ad:null

Journal d'exécution


DEBUG 2019-05-04 12:51:36,087 [http-nio-8080-exec-5] select id, name, amount, created_at, updated_at from balance where name = 'Taro Tanaka'

De cette façon, vous pouvez voir que la partie (variable intégrée) définie dans / * $ name * / est remplacée et SQL est exécuté.

Injection SQL

Ensuite, ce qui est dangereux avec les variables embarquées, c'est que la partie SQL est remplacée par le contenu de l'argument tel quel, donc il y a un risque d'injection SQL.

Je vais essayer.

Essayez l'injection SQL

curl


$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=A'or'A'='A"
id:1name:Création de Taro Tanaka_ad:2019-05-03 19:25:33.0updated_ad:null
id:2name:Hanako Sato a créé_ad:2019-05-03 23:48:40.0updated_ad:null

Journal d'exécution


DEBUG 2019-05-04 12:54:57,636 [http-nio-8080-exec-6] select id, name, amount, created_at, updated_at from balance where name = 'A'or'A'='A'

De cette manière, toutes les données peuvent être acquises.

Contre-mesures

Je pense qu'il y a deux façons de gérer cela.

Fondamentalement, je pense qu'il est préférable d'utiliser des commentaires de variable de liaison.

L'utilisation est simple. Précisez simplement ce qui suit:

/ \ * Nom de l'argument * / littéral

Exemple d'utilisation de variables de liaison

BalanceDao


@Sql("select id, name, amount, created_at, updated_at from balance where name = /*name*/'Tanaka'")
public List<Balance> findByName(String name);

Essayez l'injection SQL.

Rien n'est retourné


$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=A'or'A'='A"
$

Journal d'exécution


DEBUG 2019-05-04 13:01:31,270 [http-nio-8080-exec-3] select id, name, amount, created_at, updated_at from balance where name = 'A'or'A'='A'

Il semble que l'injection SQL a réussi dans le journal d'exécution, mais rien n'a été renvoyé.

référence

Référence S2Dao

Recommended Posts

Attention aux variables embarquées dans S2Dao
Points à connaître avec Java Equals
Points à surveiller dans le développement futur de Java
[Ransack] Attention aux ransackable_scopes!
Points à surveiller lors de la création d'un framework
Utiliser des variables pour les noms de classe et les noms d'identifiant dans haml
Choses à surveiller lors de l'utilisation de Kmeans dans Deeplearning4j
Qu'est-ce que l'orientation objet après tout ou juste une chose à surveiller dans la programmation
[Java] Rendre les variables de l'instruction for étendue et de chaque instruction immuables