Go Postgresql'de SQL Enjeksiyonunu Önleyin

Oct 02 2020

Go'da postgresql injection forumunu araştırıyorum ve SQL enjeksiyonunda aşağıdaki gibi bazı yararlı bilgiler buldum:

Golang kullanarak SQL'de IN araması nasıl yapılır?

Go'da "veritabanı / sql" kullanırken SQL enjeksiyon saldırılarını nasıl önleyebilirim?

ancak yine de tavsiyeye ihtiyacım var çünkü Go'daki kodum farklı türde bir kod ve kullanım alanları kullanıyor. tavsiyeye ihtiyacım olan bazı kullanım durumları / sorular böyledir

  1. INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)Fmt.Sprintf gibi birden çok ekleme için sorgu döngüsü kullanmak, sprinft kullanmanın kötü olduğunu biliyorum. bu döngü sorgusu için herhangi bir çözüm var mı? Ör:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. Param kullanıyorsa, sorgu oluşturmak için fmt.Sprintf kullanmak güvenli mi %dyerine %s?
  3. Prepare deyimini ve Sorguyu kullanmak güvenlidir, ancak ya Select (kullanarak $1,$2) ve NamedQuery işlevi (adındaki yapı kullanılarak) Örn: Select * from a where text = $1-> bu $1kasayı kullanıyor mu? ve Örn: Select * from a where text = :text-> bu NamedQuery işlevinde güvenli midir?

Lütfen tavsiyelerinize ihtiyacım var çocuklar. Teşekkür ederim!

Yanıtlar

5 KennyGrant Oct 02 2020 at 18:20

İlk olarak, genellikle db yer tutucularını kullanmayı mı tercih edersiniz? 1 dolar vb.

  1. Evet, SQL oluşturmak için tamsayı parametreleriyle fmt.Sprintf kullanmak güvenlidir, ancak yapabiliyorsanız kaçınmaya değer, ancak üçüncü parametreniz% s - bundan kaçının ve kullanın?
  2. Evet, tamsayı parametreleriyle fmt.Sprintf kullanmak güvenlidir, ancak% s veya% v çok daha risklidir ve bundan kaçınıyorum, neden buna ihtiyacın olduğunu düşünemiyorum.
  3. Burada yer tutucular kullanın, o zaman evet güvenlidir.

Genel kurallar:

  • Varsayılan olarak yer tutucular kullanın,% d nadiren kullanılır (örneğin, IN sorgunuzda olduğu gibi)
  • Herhangi bir doğrulama veya kullanımdan önce parametreleri tamsayı gibi türlere ayrıştırın
  • Mümkünse string concat'den kaçının ve özellikle string parametrelerine karşı dikkatli olun
  • Sütun ve tablo adları gibi şeyleri her zaman sabit kodlayın, bunları asla kullanıcı girdisinden üretmeyin (örneğin? Sort = mystringcolname)
  • Her zaman aldığınız parametrelerin yalnızca o kullanıcı için yetkilendirilmiş olanlar olduğunu doğrulayın