> For the complete documentation index, see [llms.txt](https://emre-ermenek.gitbook.io/sqli-egitimi/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://emre-ermenek.gitbook.io/sqli-egitimi/sql-injection-sqli-egitim-modulu-ve-portswigger/sql-injection-neden-olur.md).

# SQL Injection Neden Olur?

Güncel web siteleri ve uygulamalar dinamiktir. Siz bir arama yaptığınızda uygulama bu girdiyi arka planda veritabanına sorar. Eğer kodu yazan kişi, kullanıcıdan gelen girdiye "temizdir" diye fazla güvenirse SQLi (SQL Injection) doğar.

Örneğin bir e-ticaret sitesinde "telefon" kategorisini seçtiniz. Arka planda çalışan örnek bir sorgu nasıl olurdu? `SELECT * FROM products WHERE category='telefon' AND isPublished=1`

Sorguda diyor ki: "Git *products* adlı tablodaki *category* değeri telefon VE *isPublished* (yayında olma) değeri 1 olan verileri çek."

Eğer yazılımcı bizden kategori değerini olduğu gibi aldıysa, "telefon" yazmak yerine arama kutusuna şöyle bir girdi gönderebiliriz: `' OR 1=1 --`

Böylece arka plandaki sorgunun son hali şu olur: `SELECT * FROM products WHERE category='' OR 1=1 --' AND isPublished=1`

Peki ne yaptık?

* Tek tırnak işareti (`'`) ile yazılımcının açtığı kategori sorgusunu erkenden kapattık.
* `OR 1=1` diyerek matematiksel olarak her zaman doğru (True) olan bir koşul oluşturduk.
* Çift tire (`-`) işareti ile de sorgunun kalanını (isPublished filtresini ve artan tırnağı) yorum satırına alıp çöpe attık.

(Not: **MySQL veritabanlarında çift tireden sonra mutlaka bir boşluk bırakmak zorundasınızdır (`--` ).** Aksi takdirde MySQL bunu bir yorum satırı olarak algılamaz ve syntax hatası verir.)

Böylece veritabanının okuyup algıladığı nihai sorgu şu oldu: `SELECT * FROM products WHERE category='' OR 1=1`

Yani veritabanına dedik ki: "Kategori değeri boş olan VEYA 1=1 olan verileri getir." 1=1 her zaman doğru olduğu için filtreler kalktı ve products (ürünler) tablosundaki her şeyi çekmiş olduk. Bunun gerçek dünyadaki karşılığı şudur: Normal bir kullanıcının görmemesi gereken, henüz yayına girmemiş (isPublished=0) veya stokta olmayan tüm gizli ürünleri tek bir hamleyle ekrana döktük.

Mantığı kavradığımıza göre, şimdi saldırganların bu zafiyeti sömürmek için kullandığı 3 temel kategoriye bakalım:

In-band, Out-of-band ve Blind(Inferential) SQL Injection

Bu tekniklerden In-band’i öğrenerek başlayacağız.
