SQL Injection (SQL enjeksiyonu), kötü niyetli kullanıcıların veritabanına zararlı SQL komutları ekleyerek yetkisiz veri erişimi veya veri manipülasyonu yapmasına olanak tanıyan bir güvenlik açığıdır. SQL enjeksiyonunun nasıl çalıştığını ve nasıl önlenebileceğini göstermek için bir örnek üzerinden gidelim.
Örnek Senaryo
Bir web uygulamasında, kullanıcıların kullanıcı adı ve şifre ile giriş yapmasını sağlayan basit bir login formu olduğunu varsayalım. Bu form, kullanıcı adı ve şifreyi alıp veritabanında doğrulamak için SQL sorgusu kullanır.
Güvensiz Kod python
import sqlite3
def login(username, password):
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"
cursor.execute(query)
user = cursor.fetchone()
if user:
print("Login successful")
else:
print("Login failed")
conn.close()
Bu kod parçası, kullanıcı adı ve şifreyi bir SQL sorgusuna doğrudan yerleştirir. Eğer kötü niyetli bir kullanıcı, kullanıcı adı veya şifre alanına özel hazırlanmış bir giriş yaparsa, SQL enjeksiyonu gerçekleştirilebilir.
SQL Enjeksiyonu Örneği
Kullanıcı adı alanına şu değeri girdiğinizi varsayalım:
' OR '1'='1
Şifre alanına herhangi bir şey (örneğin password123
) girebiliriz, çünkü bu alan SQL sorgusunda önemli olmayacaktır. Bu durumda, SQL sorgusu şu hale gelir:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'password123'
Bu sorgu, '1'='1' ifadesi her zaman doğru olduğu için tüm kullanıcıları döndürecektir. Yani, saldırgan, şifreyi bilmeden sisteme giriş yapabilir.
Güvenli Kod
SQL enjeksiyonunu önlemek için, parametreli sorgular (prepared statements) veya ORM (Object-Relational Mapping) araçları kullanılabilir. İşte aynı örnek, parametreli sorgular kullanılarak nasıl güvenli hale getirilir:
import sqlite3
def login(username, password):
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
query = "SELECT * FROM users WHERE username = ? AND password = ?"
cursor.execute(query, (username, password))
user = cursor.fetchone()
if user:
print("Login successful")
else:
print("Login failed")
conn.close()
Bu şekilde, kullanıcı adı ve şifre doğrudan SQL sorgusuna eklenmez, yerine parametreler kullanılarak sorguya dahil edilir. Bu, SQL enjeksiyonunu önler çünkü kullanıcı tarafından girilen değerler SQL sorgusunun bir parçası olarak değil, ayrı parametreler olarak işlenir.
Sonuç
SQL enjeksiyonu, güvenlik açığı bulunan web uygulamalarında ciddi sonuçlara yol açabilir. Bu nedenle, her zaman parametreli sorgular kullanarak veya ORM araçlarıyla çalışarak kullanıcı girişlerini güvenli bir şekilde işlemek önemlidir. Bu yöntemler, kullanıcı tarafından sağlanan verilerin doğrudan SQL sorgularına dahil edilmesini engeller ve böylece SQL enjeksiyonu riskini ortadan kaldırır.
Top comments (0)