|
||
|
| root > Veritabanı Güvenliği > SQLite3 |
|
|
| Python | SQLite3 Veritabanı Güvenliği |
|
Merhaba Arkadaşlar. Bu Makalemde sizlere, python ile veritabanı işlemleri yaparken karşılaşılabilecek güvenlik zaafiyetlerinden ve bu zaafiyetlerin giderilmesinden bahsedeceğim. Tabiki python ile birlikte gelen, yan, python"un resmi olarak desteklediği veritabanı olan sqlite3 kullanıyor olacağız. Şimdi aşağıdaki kodu inceleyelim ;![]() Basit bir program yazdık ve 4 Adet kullanıcı olan bir veritabanına sahibiz. Veritabanını disc üzerinde değil ram üzerinde geçici olarak oluşturuyoruz. Kullanıcı adı ve şifresini programa giren kullanıcıdan raw_input yolu ile alıyoruz. Gidip veritabanında sorguluyoruz. Eğer bilgiler doğru ise hoşgeldiniz mesajı ile karşılıyoruz lakin yanlış ise tekrar girmesini istiyoruz ve programa almıyoruz. Tabiki bu kodlar sorunsuz çalışacaktır bir yanlış söz konusu değil fakat bir zaafiyet söz konusudur. Sql bir sorgulama dilidir. Yani sql injection sadece web"te olmaz. Veritabanı kullanan her program sql injection tehlikesi ile karşı karşıyadır. Yani şu halde bizim programımızda bu tehlike ile karşı karşıya. Hemen programımızı çalıştıralım ve kullanıcı adı ve parola kısmına şu satırı yerleştirelim ; a" OR "1" = "1 Şifre ve kullanıcı adları doğru olmadığı halde program sizi tanıdı ve hoşgeldiniz mesajını verdi değil mi ? İşte Sql Injection"a karşı korumasız bir program. Hemen bu satırı kod içinde göstererek canlı canlı görelim ; im.execute("""SELECT * FROM Uyeler WHERE k_Adi = "x" OR "1" = "1" AND Sifre = "x" OR "1" = "1"""") İşte Sql Incection Uygulandığında Sorgumuz Yukarıdaki şekilde değişiyor ve Anlayarak sorgumuzu okuduğumuzda aslında mantıksız da değil hani bu şekilde sorgumuzun kabul olması gayet normal diyebiliyoruz. Sorguyu Tükçeleştirelim ; Kullanıcı Adı x olan Or (veya) 1=1 ise diyoruz ve burada tabiki kullanıcı adı x olan kullanıcıyı bulamıyor ve Or dan sonraki şartımız ise 1=1 oluyor ve bu sağlandığından bu kısım başarı ile aşılıyor. Aynısı Şifre kısmınada uygulanıyor ve Sonucunda sorgumuz şöyle kalıyor ; im.execute("""SELECT * FROM Uyeler WHERE "1" = "1" AND "1" = "1"""") Or sayesinde bizim kullanıcıdan asıl olarak istediğimiz bilgiler eleniyor ve geriye sql injection yapan kişinin istediği kısım kalıyor. Bu şekilde de giriş sağlanıyor. Peki bunu önlemenin yolu yok mu ? Elbet te Var. Her dilde olduğu gibi Python"da da bu gib açıkları önlemenin yolu var. Şöyle oluyor ; for i in veriler: im.execute("""INSERT INTO kullanicilar VALUES (?, ?)""", i) Bu satırda Values kısmındaki değerler yerine ? ni eklemeliyiz. im.execute("""SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND parola = ?""", (kName, Sifresi)) Yukarıdaki Satırdada Kullanıcı adı ve şifreleri direkt eşitlemek yerine ilgili alanlara ? koyarak parametre beklemesini sağlıyoruz. Bu şekilde sql injection"dan korunmuş oluyoruz. Bir sonraki makalemde görüşmek üzere. İyi Çalışmalar... |
|
| Bağlantılar Bg.org.tr |
| CS - Security Expert Network | AUP&TOS |