DEV Community

Mustafa  Çam
Mustafa Çam

Posted on

SQL injection

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()
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Ş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'
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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)