0Pricing
Python Academy · Ders

Parametreli Sorgular

SQL enjeksiyonunu önleyin

Parametreli Sorgular, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Dizeler Oluşturmanın Tehlikesi

Dizeleri birleştirerek SQL oluşturmak risklidir. Kullanıcı girdisi SQL içeriyorsa sorgunuzu değiştirebilir. Buna SQL enjeksiyonu denir.

Güvenilmeyen verilerle bunu asla yapmayın.

name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)

Enjeksiyon Nasıl Görünür

Kötü amaçlı bir değer olduğunu düşünün. Bu değeri birleştirmek, sorgunun anlamını tamamen değiştirir.

name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')

İmdatımıza Yer Tutucular Yetişiyor

Güvenli yöntem parametreli sorgular kullanmaktır. Yer tutucu olarak ? kullanın ve değerleri bir demet olarak verin. Sürücü, bu değerleri güvenli şekilde özel karakterlerden arındırır.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Birden Fazla Yer Tutucu

Her değer için bir ? kullanın. Değerleri, göründükleri sırayla bir demet içinde verin.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Tek Değerli Demetler

Tek öğeli bir demetin sonunda virgül bulunmalıdır: ('Alice',). Virgül olmazsa Python, parantezleri yalnızca gruplama amacıyla kullanılmış kabul eder.

good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))

Enjeksiyon Girişimi Engellendi

Yer tutucular kullanıldığında kötü amaçlı bir değer SQL olarak değil, düz veri olarak ele alınır. Bu değer hiçbir şeyle eşleşmez.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
evil = "x' OR '1'='1"
cur.execute('SELECT * FROM users WHERE name = ?', (evil,))
print('Rows matched:', cur.fetchall())
conn.close()

Adlandırılmış Yer Tutucular

SQLite, :name söz dizimiyle adlandırılmış yer tutucuları da destekler. Değerlerden oluşan bir sözlük verin.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (:n, :a)', {'n': 'Carol', 'a': 40})
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

WHERE İçinde Parametreler

Yer tutucular, WHERE dâhil olmak üzere değer alan her yan tümcede çalışır.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT name FROM users WHERE age > ?', (28,))
print(cur.fetchall())
conn.close()

executemany

Birçok satır eklemek için executemany() işlevini demetlerden oluşan bir listeyle kullanın. Bu yöntem daha hızlıdır ve yine güvenlidir.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
rows = [('Alice',), ('Bob',), ('Carol',)]
cur.executemany('INSERT INTO users (name) VALUES (?)', rows)
cur.execute('SELECT COUNT(*) FROM users')
print(cur.fetchone())
conn.close()

Yer Tutucular Tanımlayıcılar İçin Kullanılmaz

Yer tutucular yalnızca değerler için çalışır; tablo veya sütun adları için çalışmaz. Bu adlar, kendi kodunuzdaki güvenilir bir izin listesinden alınmalıdır.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
allowed = {'name', 'id'}
col = 'name'
if col in allowed:
    cur.execute('SELECT ' + col + ' FROM users')
    print('Safe column query ran')
conn.close()

Yeniden Kullanılabilir Ekleme İşlevi

Parametreli ekleme işlemlerini bir işlev içinde sarmalamak, kodunuzu temiz ve tutarlı biçimde güvenli tutar.

import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')

def add_user(cursor, name):
    cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))

add_user(cur, 'Dave')
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()

Hızlı Kontrol

Güvenli sorgular hakkındaki bilginizi sınayın.

Özet

Enjeksiyona karşı güvenli sorgular yazmayı öğrendiniz.

  • Güvenilmeyen girdileri asla SQL ile birleştirmeyin
  • Değerlerden oluşan bir demetle ? yer tutucularını kullanın
  • Adlandırılmış :name yer tutucuları bir sözlük alır
  • executemany() birçok satırı güvenli şekilde ekler
  • Yer tutucular tanımlayıcılar için değil, değerler içindir

Sıkça Sorulan Sorular

“Parametreli Sorgular” dersi ücretsiz mi?

Evet — “Parametreli Sorgular” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Parametreli Sorgular” dersinde ne öğreneceğim?

SQL enjeksiyonunu önleyin Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Parametreli Sorgular” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Tablolara Bağlanma ve Tablo Oluşturma
  2. Ekleme, Seçme, Güncelleme, Silme
  3. Parametreli Sorgular
  4. İşlemler ve Bağlam Yöneticileri
← Python Academy Sayfasına Dön