# SQL Injection'dan korunma: parametreli sorgu (Python, PHP, Node.js örnekleri)

**URL:** <https://sibernobet.com/t/sql-injectiondan-korunma-parametreli-sorgu-python-php-node-js-ornekleri/36>\
**Category:** Siber Savunma · Cyber Defense\
**Tags:** web-guvenligi, sql, owasp\
**Created:** [Ekim 2, 2026, 12:33ös UTC](https://sibernobet.com/t/sql-injectiondan-korunma-parametreli-sorgu-python-php-node-js-ornekleri/36 "2026-10-02T12:33:42Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kalkan](https://sibernobet.com/user_avatar/sibernobet.com/kalkan/32/63_2.png) [@Kalkan](https://sibernobet.com/u/Kalkan)\
**Post date:** [Ekim 2, 2026, 12:33ös UTC](https://sibernobet.com/t/sql-injectiondan-korunma-parametreli-sorgu-python-php-node-js-ornekleri/36/1 "2026-10-02T12:33:42Z")

</div>

SQL Injection hâlâ OWASP Top 10 listesinde. Sebebi basit: kullanıcıdan gelen veriyi **metin birleştirerek** sorguya koymak.

### ❌ Yanlış (savunmasız)

```python
kullanici = request.form["kullanici"]
cursor.execute(f"SELECT * FROM uyeler WHERE ad = '{kullanici}'")

```

Kullanıcı adı alanına özel karakterler girildiğinde sorgunun anlamı değişir ve saldırgan veritabanında istemediğin işlemler yapabilir.

### ✅ Doğru: parametreli sorgu

Veri ile komut ayrı gönderilir; veritabanı girdiyi **asla komut olarak çalıştırmaz**.

**Python (sqlite3 / psycopg)**

```python
cursor.execute("SELECT * FROM uyeler WHERE ad = ?", (kullanici,)) # sqlite3
cursor.execute("SELECT * FROM uyeler WHERE ad = %s", (kullanici,)) # psycopg (PostgreSQL)

```

**PHP (PDO)**

```php
$stmt = $pdo->prepare("SELECT * FROM uyeler WHERE ad = :ad");
$stmt->execute(["ad" => $_POST["kullanici"]]);
$uye = $stmt->fetch();

```

**Node.js (mysql2)**

```javascript
const [rows] = await db.execute("SELECT * FROM uyeler WHERE ad = ?", [kullanici]);

```

### Ek savunma katmanları

- **ORM kullan** (SQLAlchemy, Prisma, Eloquent). Bunlar varsayılan olarak parametreli çalışır. Ama ORM içinde “raw query” yazarken yine dikkat et.
- **En az yetki:** Uygulamanın veritabanı kullanıcısı `DROP` ve `GRANT` yetkisine sahip olmasın.
- **Tablo veya kolon adı kullanıcıdan geliyorsa** parametre işe yaramaz. İzin verilen değerlerden oluşan bir liste (whitelist) kullan:

```python
IZINLI = {"ad", "tarih", "puan"}
sirala = request.args.get("sirala", "tarih")
if sirala not in IZINLI:
    sirala = "tarih"
cursor.execute(f"SELECT * FROM uyeler ORDER BY {sirala}") # artık güvenli

```

- **Hata mesajlarını kullanıcıya gösterme.** Ayrıntılı SQL hatası saldırgana yol haritası verir.

Kendi uygulamanızı test etmek isterseniz **yalnızca kendi sistemlerinizde** veya PortSwigger Web Security Academy gibi yasal laboratuvarlarda çalışın.
