Postgres fonksiyonlarında SQL enjeksiyonu ve hazırlanan sorgular


Yanıtlar:


36

Değişir.

SQL fonksiyonları

İle LANGUAGE sqlcevap 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.

PL / pgSQL fonksiyonları

İle LANGUAGE plpgsqlcevap 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:

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:

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 .


Yani, özet olarak: Eğer 1) sadece sql dilini kullanıyorum, ben güvendeyim, 2) eğer plpgslq kullanıyorsam ama çalıştırmıyorsam, ben güvendim Uygunsa L güvendeyim, ya da 4) eğer plpgsql kullanır ve çalıştırıp tanımlayıcıları kullanırsam, ancak% I veya quote_ident uygunsa güvendeyim. Doğru?
mickeyf_supports_Monica 12:13

@mickeyf: Temel olarak evet. Artı, USINGdeğerleri EXECUTEmü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.
Erwin Brandstetter 12:13
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.