This service has regrettably been disabled. This message is purely being displayed as to not cause any damage to any website connected to this feature.

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

Bu sene 2- 3 Kasim’da düzenlenen ve ismi “hackathonist” seçilen hackathon İTÜ kampüsünde yapıldı. Bu sene yapılan hackathonnun birde teması vardı. İstanbul ulaşım API’lerini kullanarak akıllı şehir uygulamaları geliştirmemiz bekleniyordu.Bununla ilgili olarak 1 Kasım günü CitySDK projesi anlatıldı. Proje bir cümle ile geliştiricilere rest servisler sunarak istedikleri ortamda uygulama geliştirmeyi sağlıyor. Burada benim gördüğüm eksik android geliştiricileri için bir kütüphanenin olmamasıydı. Yani siz bir uygulama geliştirmek isterseniz daha önce bu SDKyı kullanan kişilerin yaptığı işleri tekrar etmeniz gerekiyordu. Bende fikir olarak kendime android geliştiricileri için bir kütüphane ve bu kütüphane ile örnek bir proje yapmayı seçtim. Geliştirdiğim uygulamaları githubdan görebilirsiniz. Kütüphane için buradan, örnek uygulama içinse şuradan kodlara erişebilirsiniz. Etkinlik sayfası içinde şuraya bakabilirsiniz.

Bir veriyi SharedPreferences da saklamak icin aşağıdaki gibi bir kod parcacığı yazmak gerekiyor.

SharedPreferences settings = getSharedPreferences(Constants.PREFERENCESTAG, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("email", mEmail.getText().toString());
editor.commit();

Saklanan verinin tekrar kullanılması içinde aşağıdaki gibi birşeyler yazmak gerekiyor.

SharedPreferences settings = getSharedPreferences(Constants.PREFERENCESTAG, 0);
settings.getString("email", "");

Android’de bir intenti başlatırken ona veri geçirmek istiyorsanız. Aşağıdaki gibi yapabilirsiniz.

Veri göndermek için

Intent intent = new Intent(LITestActivity.this, Register.class);
intent.putExtra("name", person.getFirstName());
intent.putExtra("lastName",  person.getLastName());
intent.putExtra("id", id);
startActivity(intent);

 

Verileri çekmek için

Intent myIntent = getIntent();
String name = myIntent.getStringExtra("name");

Bu problem Manifest.xml de aşağıdaki izini vermediğimizden kaynaklanabilir. Eğer bu probleminizi çözmezse aşağıdaki java kodunu sinifiniza ekleyin.

  • < uses-permission android:name="android.permission.INTERNET" />
  • StrictMode.ThreadPolicy policy =
    new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);

    cmddeyken netsh wlan set hostednetwork mode=allow ssid=agadi key=şifre yazıyoruz. Şifrenin 8 karakter’den fazla olması gerekiyor. Daha sonra Ağ Bağlantılarınızı Görüntüledikten sonra Sağ tuşunuzla tıklayıp Özellik ‘e tıklayın. Paylaşım Sekmesine gelip diğer bilgisayarlar için izin verin. cmdye tekrar gelerek netsh wlan start hostednetwork çalıştırın. Böylelikle diğer bilgisayarlar sizin bilgisayarınızı access point olarak kullanabilirler. Bu durumu sona erdirmek için yine cmdye netsh wlan set hostednetwork mode=disallow ssid=ağadı key=şifre yazarak bu işlemi yapabilirsiniz.

    Hibernate nesnelerinizde, normal tipteki (String, int, boolean..) verileriniz çağır anında dolarlar. Sizin eğer tablo ilişkilerinizden dolayı sınıfınızda başka bir sınıf referans edilmişse bu bağlı verilerin çekilmesi için iki yöntem vardır. Bunlar lazy ve eager. Eğer eager kullanırsanız, normal tipteki verileri çekerken ilişkili tablodaki verileride otomatikman çekmiş olursunuz. Lazy kullanırsanız eğer o verilere context içerisinde erişmek isterseniz, o zaman çeker.