ป้องกัน SQL Injection ใน Go Postgresql

Oct 02 2020

ฉันค้นคว้าเกี่ยวกับฟอรัมของการฉีด postgresql ใน Go และฉันพบข้อมูลที่เป็นประโยชน์ในการฉีด SQL ดังต่อไปนี้:

วิธีดำเนินการค้นหา IN ใน SQL โดยใช้ Golang

ฉันจะป้องกันการโจมตีด้วยการฉีด SQL ใน Go ขณะใช้ "database / sql" ได้อย่างไร?

แต่ฉันยังต้องการคำแนะนำเนื่องจากรหัสของฉันใน Go ใช้รหัสและกรณีการใช้งานประเภทอื่น usecase / คำถามบางอย่างที่ฉันต้องการคำแนะนำเป็นเช่นนี้

  1. การใช้การวนซ้ำการค้นหากับการแทรกหลาย ๆ ครั้งเช่นการINSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)ใช้ fmt.Sprintf ฉันรู้ว่าการใช้ sprinft นั้นไม่ดี มีวิธีแก้ปัญหาสำหรับการค้นหาแบบวนซ้ำสำหรับการแทรกไหม เช่น:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. มันมีความปลอดภัยที่จะใช้ในการสร้าง fmt.Sprintf แบบสอบถามถ้าพระรามใช้%dแทน%s?
  3. การใช้คำสั่งเตรียมและแบบสอบถามนั้นปลอดภัย แต่จะเกิดอะไรขึ้นถ้าฉันใช้ฟังก์ชันเลือก (โดยใช้ $1,$2) และฟังก์ชัน NamedQuery (โดยใช้ชื่อ struct) เช่น: Select * from a where text = $1-> ใช้สิ่งนี้$1ปลอดภัยหรือไม่ และเช่น: Select * from a where text = :text-> สิ่งนี้ปลอดภัยในฟังก์ชัน NamedQuery หรือไม่

ต้องการคำแนะนำจากพวกคุณ ขอบคุณ!

คำตอบ

5 KennyGrant Oct 02 2020 at 18:20

ประการแรกมักชอบใช้ตัวยึดฐานข้อมูล? $ 1 เป็นต้น

  1. ใช่ปลอดภัยที่จะใช้ fmt.Sprintf กับพารามิเตอร์จำนวนเต็มเพื่อสร้าง SQL แม้ว่าจะคุ้มค่าที่จะหลีกเลี่ยงหากคุณทำได้ แต่พารามิเตอร์ที่สามของคุณคือ% s - หลีกเลี่ยงสิ่งนั้นและใช้หรือไม่
  2. ใช่มันปลอดภัยที่จะใช้ fmt.Sprintf กับพารามิเตอร์จำนวนเต็ม แต่% s หรือ% v มีความเสี่ยงมากกว่าและฉันจะหลีกเลี่ยงไม่คิดว่าทำไมคุณถึงต้องการ
  3. ใช้ตัวยึดที่นี่แล้วใช่ว่าจะปลอดภัย

กฎทั่วไป:

  • ใช้ตัวยึดตามค่าเริ่มต้นจึงไม่ควรใช้% d (เช่นในแบบสอบถาม IN ของคุณเป็นต้น)
  • แยกวิเคราะห์พารามิเตอร์เป็นประเภทเช่นจำนวนเต็มก่อนการตรวจสอบความถูกต้องหรือการใช้งาน
  • หลีกเลี่ยงการต่อสายอักขระหากทำได้และระมัดระวังเป็นพิเศษกับพารามิเตอร์สตริง
  • รหัสยากเสมอเช่นชื่อคอลัมน์และชื่อตารางอย่าสร้างจากอินพุตของผู้ใช้ (เช่น? sort = mystringcolname)
  • ตรวจสอบเสมอว่าพารามิเตอร์ที่คุณได้รับเป็นเพียงพารามิเตอร์ที่ได้รับอนุญาตสำหรับผู้ใช้รายนั้น