Risk nedir?
Bir saldırgan sistemin tüm verilerine doğrudan erişebilir. Saldırgan, basit bir yönetemle sistemde depolanan önemli bilgileri çalabilir (örneğin kişisel kullanıcı veya kredi kartı bilgileri gibi ) ve mevcut verileri değiştirebilir veya silebilir.

Nasıl olur?
Saldırgan uygulamanın dışardan kabul ettiği parameterle sql metinleri gönderir. Uygulama da bu gelen parametreler kontrol edilmez ve yazılan sql sorgularıyla birleştirilirse bu problem oluşur.

Nasıl önlenebilir?
Verinin geldiği kaynağa bakılmaksızın, tüm girdi parametrelerini doğrulayın. Doğrulama bir beyaz listeye dayanmalıdır: yalnızca kötü desenleri reddetmek yerine belirli bir yapıya uyan verileri kabul edin. Kontroller veri tipi, boyut, format ve beklenen değerlere göre yapılmalıdır.

SQL cümlelerini birleştirmek yerine stored procedureler veya parametrik sql sorguları kullanılmalıdır. Daha iyi bir çözüm için hibernate, entityframework gibi ORM kütüphanlerini kullanabilirsiniz.

Örnek
Aşağıdaki örnekte dışardan alınan user parametresi sql sorgusuna hiç bir kontrol yapılmadan ekleniyor. Burada gelen parametrenin değeri user + “ or 1=1 “ olursa bu sorgudan herzaman bir değer geri dönecektir. Aşağıdaki örnek için sql sorgusu şu şekilde olacaktır.
“select user_id from User where user = ” + user + “ or 1 = 1 “;

public class SqlInjection {
       public static void getUserId(Connection con) {
                System.out.println("enter user name");
                Scanner in = new Scanner(System.in);
                String user = in.nextLine();
                String query = "select user_id from User where user = " + user;
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery(query);
       }
}

Parametrik sorgu yazmak bu problemi çözmek için bir yoldur.

public class SqlInjectionFixed {
       public static void getUserId(Connection con) {
                System.out.println("enter user name");
                Scanner in = new Scanner(System.in);
                String user = in.nextLine();
                String query = "select user_id from User where user = ?";
                PreparedStatement stmt = con.createStatement(query);
                stmt.setString(1, user);
                ResultSet rs = stmt.executeQuery(query);
       }
}