ProgramlamaFullstack Geliştirici

Parametreli sorgular ve dinamik SQL hakkında konuşun. Her bir yaklaşımı ne zaman kullanmalıyız, dinamik SQL ile ilgili hangi riskler vardır ve bunlardan nasıl kaçınılabilir? Örnekler verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Parametreli sorgular, değerleri sorguya özel parametreler aracılığıyla geçirme imkanı sağlar, bu sayede değişkenlerin doğrudan yerine konması yerine, güvenliği artırır ve SQL enjeksiyonlarına karşı koruma sağlar. Ayrıca, tekrar eden sorguların planlarının önbelleğe alınması sayesinde yürütme süresini hızlandırır.

Dinamik SQL, sorguları anlık olarak oluşturma ve yürütme imkanı tanır (örneğin, MS SQL'de EXEC sp_executesql veya PostgreSQL'de PREPARE/EXECUTE aracılığıyla). Çok dikkatli olunması gerekir: değerin doğrudan sorgu metnine yerleştirilmesi SQL enjeksiyonlarına, sözdizimi hatalarına ve kötü performansa yol açabilir.

Python ve psycopg2 kütüphanesi ile parametrik sorgu örneği:

cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

PostgreSQL'de dinamik SQL örneği:

EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);

Yanıltıcı soru.

Soru: Neden bazı eski uygulamaların yaptığı gibi sadece tırnakları ('') kaçırmak, SQL enjeksiyonlarına karşı korumak için yeterli değildir?

Cevap:

Tırnakları kaçırmak, özellikle saldırgan SQL sorgusu yapısını yerleştirirse (örneğin, "; DROP TABLE users;") tüm türdeki enjeksiyonlardan korumaz. Ayrıca, bu her veri türünün farklı özelliklerini kapsamaz ve kodlama veya özel karakterler aracılığıyla filtrelerin atlanmasına karşı koruma sağlamaz. Her zaman parametreli sorgular kullanılmalıdır.


Hikaye

Bir maaş hesaplama sisteminde dinamik SQL raporları oluşturuyordu. Eski bir çerçevede parametrelemenin desteklenmemesi nedeniyle, dizeleri manuel olarak birleştirdik. Bir kullanıcı, "soyadı" alanına bir SQL parçası kazara (veya bilinçli olarak) aktardı - bu, başkalarının maaş bilgilerine erişim sağladı.

Hikaye

Küçük bir çevrimiçi mağaza, yeterli doğrulama olmadan ürünleri filtrelemek için dinamik SQL kullandı. Standart dışı bir değer belirtmeye çalıştığında, kullanıcı bir SQL ayrıştırıcı hatası meydana getirdi ve bu, tüm ürünlerin listesini "dondurdu".

Hikaye

CRM uygulamasında "O'Connor" harfi, SQL sorgularını basit dize birleştirme ile oluşturan uygulamada bir hataya neden oldu. Kaçırılan tekil tırnak yüzünden bu soyadıyla hiçbir kayıt kaydedilemedi ve bu durum sadece bir yıl sonra fark edildi.