<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[KodlarTR - Kodlarda Güvenlik]]></title>
		<link>https://kodlar.tr/</link>
		<description><![CDATA[KodlarTR - https://kodlar.tr]]></description>
		<pubDate>Fri, 15 May 2026 11:25:50 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[SQL Injection ve Çözümü]]></title>
			<link>https://kodlar.tr/konu-sql-injection-ve-cozumu.html</link>
			<pubDate>Sat, 03 May 2025 19:06:58 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://kodlar.tr/member.php?action=profile&uid=7">Birpay</a>]]></dc:creator>
			<guid isPermaLink="false">https://kodlar.tr/konu-sql-injection-ve-cozumu.html</guid>
			<description><![CDATA[SQL Injection ve Çözümü <br />
<br />
Kod yazarken sadece işlevselliğe değil, güvenliğe de dikkat etmek gerekir. Özellikle veritabanı ile çalışan uygulamalarda, kullanıcıdan gelen verilerin doğrudan işlenmesi çok ciddi güvenlik açıklarına neden olabilir. Bu yazıda en yaygın güvenlik açıklarından biri olan <span style="font-weight: bold;" class="mycode_b">SQL Injection</span>'ı inceleyecek ve güvenli kodlama yöntemlerini örneklerle göstermeye çalışacağım. <br />
<br />
- Sorun: SQL Injection Nedir?<br />
SQL Injection (SQL Enjeksiyonu), kötü niyetli kullanıcıların, SQL sorgularına müdahale ederek veritabanı üzerinde yetkisiz işlemler yapabilmesini sağlayan bir güvenlik açığıdır.<br />
<br />
- Örnek: Güvensiz Kod<br />
Aşağıdaki örnek, kullanıcıdan alınan "kullanici_adi" ve "sifre" ile giriş yapılmaya çalışılan bir Python (SQLite) kod parçasıdır:<br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>import sqlite3<br />
<br />
conn = sqlite3.connect('veritabani.db')<br />
cursor = conn.cursor()<br />
<br />
kullanici_adi = input("Kullanıcı adınızı girin: ")<br />
sifre = input("Şifrenizi girin: ")<br />
<br />
query = f"SELECT * FROM kullanicilar WHERE kullanici_adi = '{kullanici_adi}' AND sifre = '{sifre}'"<br />
cursor.execute(query)<br />
<br />
sonuc = cursor.fetchone()<br />
<br />
if sonuc:<br />
    print("Giriş başarılı!")<br />
else:<br />
    print("Hatalı kullanıcı adı veya şifre.")</code></div></div>
- Sorun Nerede?<br />
Bu kodda kullanıcıdan alınan veriler doğrudan SQL sorgusunun içine yerleştirilmiş. Bu durum kötü niyetli biri tarafından şu şekilde kullanılabilir:<br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>Kullanıcı adı: ' OR '1'='1<br />
Şifre: ' OR '1'='1</code></div></div>
Oluşan sorgu şöyle olur: <br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>SELECT * FROM kullanicilar WHERE kullanici_adi = '' OR '1'='1' AND sifre = '' OR '1'='1'</code></div></div>
Bu sorgu daima doğru döner ve sisteme giriş yapılır. Bu, veri sızıntısına, yetkisiz erişime ve sistemin ele geçirilmesine neden olabilir. <br />
<br />
- Çözüm: Parametreli Sorgular Kullanın<br />
SQL Injection’a karşı en etkili yöntem <span style="font-weight: bold;" class="mycode_b">parametreli sorgular</span> kullanmaktır. Böylece kullanıcıdan gelen veri, doğrudan SQL’e yerleştirilmeden işlenir ve zararlı kod olarak algılanmaz.<br />
<br />
Güvenli Kod Örneği<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>import sqlite3<br />
<br />
conn = sqlite3.connect('veritabani.db')<br />
cursor = conn.cursor()<br />
<br />
kullanici_adi = input("Kullanıcı adınızı girin: ")<br />
sifre = input("Şifrenizi girin: ")<br />
<br />
query = "SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND sifre = ?"<br />
cursor.execute(query, (kullanici_adi, sifre))<br />
<br />
sonuc = cursor.fetchone()<br />
<br />
if sonuc:<br />
    print("Giriş başarılı!")<br />
else:<br />
    print("Hatalı kullanıcı adı veya şifre.")</code></div></div>
- Neden Güvenli?<br />
Bu yöntemde, <br />
<br />
karakterleri yer tutucudur ve kullanıcıdan gelen veri bu yer tutuculara <span style="font-weight: bold;" class="mycode_b">bağlanarak</span> (binding) eklenir. Bu da verilerin yalnızca değer olarak algılanmasını sağlar, komut olarak değil.<br />
<br />
Ekstra Önlemler<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Veritabanı kullanıcılarına minimum yetki verin.</span><br />
 Uygulamanız sadece gerekli izinlerle çalışmalı (örneğin sadece SELECT/INSERT).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Şifreleri veritabanında düz metin olarak saklamayın.</span><br />
 SHA-256, bcrypt gibi şifreleme algoritmaları kullanın.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Giriş denemelerine sınırlama koyun.</span><br />
 Brute-force saldırılarına karşı korunmak için başarısız girişlerde süre limiti uygulayın.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Kapsamlı loglama ve saldırı tespiti uygulayın.</span><br />
</li>
</ol>
]]></description>
			<content:encoded><![CDATA[SQL Injection ve Çözümü <br />
<br />
Kod yazarken sadece işlevselliğe değil, güvenliğe de dikkat etmek gerekir. Özellikle veritabanı ile çalışan uygulamalarda, kullanıcıdan gelen verilerin doğrudan işlenmesi çok ciddi güvenlik açıklarına neden olabilir. Bu yazıda en yaygın güvenlik açıklarından biri olan <span style="font-weight: bold;" class="mycode_b">SQL Injection</span>'ı inceleyecek ve güvenli kodlama yöntemlerini örneklerle göstermeye çalışacağım. <br />
<br />
- Sorun: SQL Injection Nedir?<br />
SQL Injection (SQL Enjeksiyonu), kötü niyetli kullanıcıların, SQL sorgularına müdahale ederek veritabanı üzerinde yetkisiz işlemler yapabilmesini sağlayan bir güvenlik açığıdır.<br />
<br />
- Örnek: Güvensiz Kod<br />
Aşağıdaki örnek, kullanıcıdan alınan "kullanici_adi" ve "sifre" ile giriş yapılmaya çalışılan bir Python (SQLite) kod parçasıdır:<br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>import sqlite3<br />
<br />
conn = sqlite3.connect('veritabani.db')<br />
cursor = conn.cursor()<br />
<br />
kullanici_adi = input("Kullanıcı adınızı girin: ")<br />
sifre = input("Şifrenizi girin: ")<br />
<br />
query = f"SELECT * FROM kullanicilar WHERE kullanici_adi = '{kullanici_adi}' AND sifre = '{sifre}'"<br />
cursor.execute(query)<br />
<br />
sonuc = cursor.fetchone()<br />
<br />
if sonuc:<br />
    print("Giriş başarılı!")<br />
else:<br />
    print("Hatalı kullanıcı adı veya şifre.")</code></div></div>
- Sorun Nerede?<br />
Bu kodda kullanıcıdan alınan veriler doğrudan SQL sorgusunun içine yerleştirilmiş. Bu durum kötü niyetli biri tarafından şu şekilde kullanılabilir:<br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>Kullanıcı adı: ' OR '1'='1<br />
Şifre: ' OR '1'='1</code></div></div>
Oluşan sorgu şöyle olur: <br />
<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>SELECT * FROM kullanicilar WHERE kullanici_adi = '' OR '1'='1' AND sifre = '' OR '1'='1'</code></div></div>
Bu sorgu daima doğru döner ve sisteme giriş yapılır. Bu, veri sızıntısına, yetkisiz erişime ve sistemin ele geçirilmesine neden olabilir. <br />
<br />
- Çözüm: Parametreli Sorgular Kullanın<br />
SQL Injection’a karşı en etkili yöntem <span style="font-weight: bold;" class="mycode_b">parametreli sorgular</span> kullanmaktır. Böylece kullanıcıdan gelen veri, doğrudan SQL’e yerleştirilmeden işlenir ve zararlı kod olarak algılanmaz.<br />
<br />
Güvenli Kod Örneği<br />
<div class="py-4 mb-6 -mx-6 text-sm border-l-2 border-orange-400 bg-slate-100 dark:bg-slate-800 md:rounded-l-md md:ml-0 md:-mr-6 md:border-l-0 md:border-r-2" style="padding-left: calc(1.5rem - 2px); padding-right: calc(1.5rem - 2px)"><div class="sr-only">Kod:</div><div dir="ltr"><code>import sqlite3<br />
<br />
conn = sqlite3.connect('veritabani.db')<br />
cursor = conn.cursor()<br />
<br />
kullanici_adi = input("Kullanıcı adınızı girin: ")<br />
sifre = input("Şifrenizi girin: ")<br />
<br />
query = "SELECT * FROM kullanicilar WHERE kullanici_adi = ? AND sifre = ?"<br />
cursor.execute(query, (kullanici_adi, sifre))<br />
<br />
sonuc = cursor.fetchone()<br />
<br />
if sonuc:<br />
    print("Giriş başarılı!")<br />
else:<br />
    print("Hatalı kullanıcı adı veya şifre.")</code></div></div>
- Neden Güvenli?<br />
Bu yöntemde, <br />
<br />
karakterleri yer tutucudur ve kullanıcıdan gelen veri bu yer tutuculara <span style="font-weight: bold;" class="mycode_b">bağlanarak</span> (binding) eklenir. Bu da verilerin yalnızca değer olarak algılanmasını sağlar, komut olarak değil.<br />
<br />
Ekstra Önlemler<br />
<ol type="1" class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">Veritabanı kullanıcılarına minimum yetki verin.</span><br />
 Uygulamanız sadece gerekli izinlerle çalışmalı (örneğin sadece SELECT/INSERT).<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Şifreleri veritabanında düz metin olarak saklamayın.</span><br />
 SHA-256, bcrypt gibi şifreleme algoritmaları kullanın.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Giriş denemelerine sınırlama koyun.</span><br />
 Brute-force saldırılarına karşı korunmak için başarısız girişlerde süre limiti uygulayın.<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">Kapsamlı loglama ve saldırı tespiti uygulayın.</span><br />
</li>
</ol>
]]></content:encoded>
		</item>
	</channel>
</rss>