Bir Sorgu Çalıştırıcıyı Salt Okunur Yapmak İçin SQL Ayrıştırmayın
SQL dizelerini anahtar kelimeler açısından kontrol ederek veritabanınızı güvenli hale getirmeye çalışmaktan vazgeçin.
SQL çalıştırmak için bir araç geliştiriyorsanız, salt okunur (read-only) bir moda ihtiyaç duyarsınız. Yanlışlıkla yapılan bir UPDATE işleminin verilerinizi silmesini engellemek istersiniz. İlk düşünceniz DELETE veya DROP gibi kelimeleri engellemek olabilir.
Bunu yapmayın.
Dize (string) kontrollerini atlatmak kolaydır. Bir kullanıcı, bir DELETE işlemini gizlemek için bir WITH ifadesi kullanabilir. Komutları gizlemek için yorum satırlarını kullanabilirler. Bir tabloya yazma işlemi yapan bir fonksiyon çağırabilirler. Sonuçta, kazanılması imkansız bir "köstebek vurma" (whack-a-mole) oyunu oynamaya başlarsınız.
Güvenliği veritabanının yönetmesine izin verin.
Postgres'in bunun için yerleşik bir özelliği vardır. Bir işlemi (transaction) salt okunur olarak tanımlayabilirsiniz. Sunucu daha sonra tüm yazma komutlarını reddeder. Bu; CTE'leri, fonksiyonları ve DDL'i kapsar.
Bunu Python'da doğru şekilde nasıl uygulayacağınız aşağıdadır:
- autocommit değerini False yaparak gerçek bir işlem kullanın.
- İlk komut olarak SET TRANSACTION READ ONLY çalıştırın.
- Uzun süren sorguların sisteminizi kilitlemesini önlemek için bir statement_timeout belirleyin.
- Kilitleri ve anlık görüntüleri (snapshots) serbest bırakmak için sonunda rollback() kullanın.
Bu yaklaşım SQL metnini incelemez. Sorgu, sunucuya yazıldığı haliyle gider. Siz motorun kuralı uygulamasını söylersiniz.
Güvenlik iki bölümden oluşur:
- Yazmalara karşı koruma: Salt okunur işlemler kullanın.
- Kaynak suistimaline karşı koruma: Zaman aşımları ve satır sınırları kullanın.
Salt okunur bir sorgu, devasa bir join işlemiyle sisteminizi hala çökertebilir. Salt okunur bir işlem yazma işlemlerini durdurur ancak yoğun kaynak kullanımını durdurmaz. Ad-hoc SQL'i güvenli hale getirmek için her ikisine de ihtiyacınız vardır.
SQL ayrıştırmayı bırakın. Veritabanından işini yapmasını isteyin.
Kaynak: https://dev.to/hitoshi1964/dont-parse-sql-to-make-a-query-runner-read-only-b62