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.
S2Dao fournit des variables intégrées. Si vous ne l'utilisez pas correctement, il se comportera très dangereusement, alors notez-le.
La variable incorporée est décrite comme suit.
/ \ * $ Nom de l'argument * / littéral
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);
}
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é.
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.
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.
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
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é.
Recommended Posts