[JAVA] Achten Sie auf eingebettete Variablen in S2Dao

Über S2Dao, das gerade EOLed wurde. Ich benutze es für geschäftliche Zwecke, aber es ist gefährlich, wenn ich es falsch benutze. Notieren Sie es sich.

Eingebettete Variablen

S2Dao bietet eingebettete Variablen. Wenn Sie es falsch verwenden, verhält es sich sehr gefährlich. Notieren Sie es sich.

Verwendung eingebetteter Variablen

Die eingebettete Variable wird wie folgt beschrieben.

/ \ * $ Argumentname * / Literal

Tatsächlicher Code

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);
}

Ich werde es bewegen

curl


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

Laufzeitprotokoll


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'

Auf diese Weise können Sie sehen, dass der in / * $ name * / festgelegte Teil (eingebettete Variable) ersetzt und SQL ausgeführt wird.

SQL-Injektion

Das Gefährliche an eingebetteten Variablen ist dann, dass der SQL-Teil so wie er ist durch den Inhalt des Arguments ersetzt wird, sodass die Gefahr einer SQL-Injection besteht.

Ich werde es versuchen.

Versuchen Sie es mit SQL Injection

curl


$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=A'or'A'='A"
id:1name:Taro Tanaka erstellt_ad:2019-05-03 19:25:33.0updated_ad:null
id:2name:Hanako Sato erstellt_ad:2019-05-03 23:48:40.0updated_ad:null

Laufzeitprotokoll


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'

Auf diese Weise können alle Daten erfasst werden.

Gegenmaßnahmen

Ich denke, es gibt zwei Möglichkeiten, damit umzugehen.

Grundsätzlich denke ich, dass es besser ist, Kommentare zu Bindungsvariablen zu verwenden.

Die Verwendung ist einfach. Geben Sie einfach Folgendes an:

/ \ * Argumentname * / Literal

Beispiel für die Verwendung von Bindevariablen

BalanceDao


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

Versuchen Sie es mit SQL Injection.

Es wird nichts zurückgegeben


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

Laufzeitprotokoll


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'

Im Ausführungsprotokoll sieht es so aus, als ob die SQL-Injektion erfolgreich war, aber tatsächlich wurde nichts zurückgegeben.

Referenz

S2Dao-Referenz

Recommended Posts

Achten Sie auf eingebettete Variablen in S2Dao
Punkte, die bei Java beachtet werden müssen, sind gleich
Dinge, auf die Sie bei der zukünftigen Java-Entwicklung achten sollten
[Durchsuchen] Achten Sie auf ransackable_scopes!
Dinge, auf die Sie beim Erstellen eines Frameworks achten sollten
Verwenden Sie Variablen für Klassennamen und ID-Namen in haml
Dinge, auf die Sie bei der Verwendung von Kmeans in Deeplearning4j achten sollten
Was ist schließlich Objektorientierung oder nur eine Sache, auf die Sie bei der Programmierung achten müssen?
[Java] Machen Sie die Variablen der erweiterten for-Anweisung und für jede Anweisung unveränderlich