SQL korumaları
AST denetleyicisinin her gönderimde uyguladığı kurallar — WHERE zorunluluğu, LIMIT enjeksiyonu, transaction'lar ve yasaklı komutlar.
Güncelleme:
Her gönderim, onay kuyruğuna girmeden önce parse edilip denetlenir. Kural ihlal eden talep, açık bir mesajla gönderim anında reddedilir — DBA’e bile ulaşmaz, veritabanına hiç ulaşmaz.
Kurallar
UPDATE / DELETE için WHERE zorunlu
DELETE FROM users; -- ✗ reddedilir
DELETE FROM users WHERE id = 42; -- ✓ kabul (yine de onay gerekir)
Bu kural transaction içinde de geçerlidir. İstisnası yoktur — tüm tabloyu
etkileyen bir yazma, açıkça ifade edilmelidir (ör. WHERE 1 = 1); kazayla asla
gerçekleşemez.
SELECT’e LIMIT eklenir
LIMITyok mu? Varsayılan (1000) otomatik eklenir.LIMITüst sınırın (10000) üzerinde mi? Aşağı çekilir.LIMIT ALL(PostgreSQL) sınırsız sayılır ve sınırlanır.- Offset korunur:
LIMIT 10, 20000→LIMIT 10, 10000,LIMIT 99999 OFFSET 4→LIMIT 10000 OFFSET 4. - Alt sorgu LIMIT’lerine dokunulmaz; yalnızca dış sorgu denetlenir. Kilitleme
ifadeleri gözetilir — eklenen LIMIT,
FOR UPDATE’ten önce yerleşir.
İki sayı da yapılandırılabilir — bkz. Yapılandırma. Hazırlanan SQL (eklenen LIMIT ile) gönderimden önce geliştiriciye, incelemede DBA’e gösterilir; onayladığınız şey birebir çalışan şeydir.
Çoklu ifadeler açık transaction ister
UPDATE a SET x = 1 WHERE id = 1;
UPDATE b SET y = 2 WHERE id = 2; -- ✗ reddedilir: iki çıplak ifade
BEGIN;
UPDATE a SET x = 1 WHERE id = 1;
UPDATE b SET y = 2 WHERE id = 2;
COMMIT; -- ✓ kabul, atomik çalışır
İşçi ifadeleri gerçek bir transaction içinde çalıştırır: herhangi biri
başarısız olursa tamamı geri alınır. Gönderimde ROLLBACK reddedilir —
başarısızlıkta geri alma otomatiktir, elle yazılacak bir şey değildir. İç içe
transaction desteklenmez.
Her zaman yasak
Bazı komutlar rolden bağımsız olarak doğrudan reddedilir:
DROP DATABASE/DROP SCHEMAGRANT,REVOKECREATE USER/ALTER USER/DROP USER(veROLE/LOGINtürevleri)SET GLOBALSHUTDOWN
Veritabanı yönetimi altyapı araçlarınızın işidir, bir sorgu portalının değil.
Lehçeler ve temkinli geri düşüş
Parser önce MySQL lehçesini bilir. Tam parse edemediği ifadeler (PostgreSQL
::jsonb cast’leri, sürücüye özgü operatörler) yine anahtar kelime bazında
korunur: parse edilemeyen WHERE’siz bir UPDATE yine reddedilir, parse
edilemeyen bir SELECT’e yine LIMIT eklenir — sınıflandırılamayan her şey ise
yazma sayılır, yani tam onay incelemesinden geçer. QueryProxy tereddütte
her zaman katı taraftadır.