Postgres'te sorgular ve kullanıcı tanımlı fonksiyonlar SQL enjeksiyonuna karşı korunma mekanizması olarak eşdeğer olarak hazırlanır mı?
Bir yaklaşımda diğerine göre belirli avantajlar var mı?
Postgres'te sorgular ve kullanıcı tanımlı fonksiyonlar SQL enjeksiyonuna karşı korunma mekanizması olarak eşdeğer olarak hazırlanır mı?
Bir yaklaşımda diğerine göre belirli avantajlar var mı?
Yanıtlar:
Değişir.
İle LANGUAGE sql
cevap genellikle evet .
İletilen parametreler değerler olarak kabul edilir ve SQL-enjeksiyonu mümkün değildir - güvensiz işlevleri gövdeden çağırmazsanız ve parametreler geçmezseniz.
İle LANGUAGE plpgsql
cevap normalde evet .
Bununla birlikte , PL / pgSQL, geçirilen parametrelerin (veya bölümlerin) bir sorgu dizesinde birleştirildiği ve ile yürütüldüğü dinamik SQL'e izin verir EXECUTE
. Bu kullanıcı girişini SQL koduna dönüştürebilir ve SQL enjeksiyonunu mümkün kılar . Fonksiyon gövdesinin düzgünce kullanıp kullanmadığını dışarıdan söyleyemezsiniz. Araçlar verilmektedir.
Yalnızca ihtiyacınız olan yerde dinamik SQL kullanın. Parametreleri değer olarak kullanan düz SQL ifadeleri, SQL işlevlerine benzer SQL enjeksiyonuna karşı güvenlidir.
İçin dinamik SQL , tercihen geçiş değerleri ile değerleri olarak:
USING
fıkra. Örnek .SQL enjeksiyonunu prensipte imkansız kılar.
SQL dizesindeki değerleri birleştirirseniz , şunu kullanın:
Dizeleri tek tırnak içinde güvenli bir şekilde sarar , böylece sözdizimi hatalarını ve SQL enjeksiyonunu engeller.
SQL dizesinde tanımlayıcı olarak değerlendirilecek işlem parametreleri ile:
format()
format belirteci ile%I
. Örnek .quote_ident()
. Örnek .regclass
tablo adları için: _tbl::regclass
. Örnek .Dizeleri gerektiğinde güvenle çift tırnak içine alır , böylece sözdizimi hatalarını ve SQL enjeksiyonunu engeller .
İlgili:
Asla sadece kullanıcı girdisinden bir dize oluşturma ve çalıştırma. Bu, doğrudan kullanıcı tarafından iletilen veya bir sistem kataloğundan alınan tanımlayıcıları içerir. Tüm kullanıcı girişi gibi muamele ve dinamik SQL oluştururken güvenle teklif edilecek var!
Bu ilgili cevabın performans sonuçları hakkında daha fazla bilgi :
SQL enjeksiyonundaki temeller:
Dinamik SQL'e izin veren diğer sunucu dilleri için de benzer hususlar geçerlidir .
USING
değerleri EXECUTE
mümkün olduğu her zaman geçirmek için yan tümce kullanın . Sen olabilir bir SQL fonksiyonu içinden bir PL / pgSQL işlevini çağırmak ve parametreleri geçmektedir. Dolayısıyla, kesinlikle doğru olmak için, doğrudan veya dolaylı olarak güvensiz işlevler çağırmadığınız sürece güvendesiniz. Tüm işlevleriniz doğru yapılırsa, bu olamaz.