ป้องกัน SQL Injection ใน Go Postgresql
Oct 02 2020
ฉันค้นคว้าเกี่ยวกับฟอรัมของการฉีด postgresql ใน Go และฉันพบข้อมูลที่เป็นประโยชน์ในการฉีด SQL ดังต่อไปนี้:
วิธีดำเนินการค้นหา IN ใน SQL โดยใช้ Golang
ฉันจะป้องกันการโจมตีด้วยการฉีด SQL ใน Go ขณะใช้ "database / sql" ได้อย่างไร?
แต่ฉันยังต้องการคำแนะนำเนื่องจากรหัสของฉันใน Go ใช้รหัสและกรณีการใช้งานประเภทอื่น usecase / คำถามบางอย่างที่ฉันต้องการคำแนะนำเป็นเช่นนี้
- การใช้การวนซ้ำการค้นหากับการแทรกหลาย ๆ ครั้งเช่นการ
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) - มันมีความปลอดภัยที่จะใช้ในการสร้าง fmt.Sprintf แบบสอบถามถ้าพระรามใช้
%dแทน%s? - การใช้คำสั่งเตรียมและแบบสอบถามนั้นปลอดภัย แต่จะเกิดอะไรขึ้นถ้าฉันใช้ฟังก์ชันเลือก (โดยใช้ $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 เป็นต้น
- ใช่ปลอดภัยที่จะใช้ fmt.Sprintf กับพารามิเตอร์จำนวนเต็มเพื่อสร้าง SQL แม้ว่าจะคุ้มค่าที่จะหลีกเลี่ยงหากคุณทำได้ แต่พารามิเตอร์ที่สามของคุณคือ% s - หลีกเลี่ยงสิ่งนั้นและใช้หรือไม่
- ใช่มันปลอดภัยที่จะใช้ fmt.Sprintf กับพารามิเตอร์จำนวนเต็ม แต่% s หรือ% v มีความเสี่ยงมากกว่าและฉันจะหลีกเลี่ยงไม่คิดว่าทำไมคุณถึงต้องการ
- ใช้ตัวยึดที่นี่แล้วใช่ว่าจะปลอดภัย
กฎทั่วไป:
- ใช้ตัวยึดตามค่าเริ่มต้นจึงไม่ควรใช้% d (เช่นในแบบสอบถาม IN ของคุณเป็นต้น)
- แยกวิเคราะห์พารามิเตอร์เป็นประเภทเช่นจำนวนเต็มก่อนการตรวจสอบความถูกต้องหรือการใช้งาน
- หลีกเลี่ยงการต่อสายอักขระหากทำได้และระมัดระวังเป็นพิเศษกับพารามิเตอร์สตริง
- รหัสยากเสมอเช่นชื่อคอลัมน์และชื่อตารางอย่าสร้างจากอินพุตของผู้ใช้ (เช่น? sort = mystringcolname)
- ตรวจสอบเสมอว่าพารามิเตอร์ที่คุณได้รับเป็นเพียงพารามิเตอร์ที่ได้รับอนุญาตสำหรับผู้ใช้รายนั้น