"SELECT * FROM Table1 WHERE Id =" + intVariable ToString ()
ความปลอดภัย
ใช้ได้
ผู้โจมตีไม่สามารถฉีดอะไรเข้าไปในตัวแปร int ที่คุณพิมพ์ได้
ผลการดำเนินงาน
ไม่ได้ตกลง
การใช้พารามิเตอร์จะดีกว่าดังนั้นแบบสอบถามจะถูกรวบรวมหนึ่งครั้งและแคชไว้สำหรับการใช้งานครั้งต่อไป ครั้งต่อไปแม้จะมีค่าพารามิเตอร์ต่างกันคิวรีก็จะถูกแคชและไม่จำเป็นต้องคอมไพล์ในเซิร์ฟเวอร์ฐานข้อมูล
รูปแบบการเข้ารหัส
การปฏิบัติที่ไม่ดี
- พารามิเตอร์สามารถอ่านได้มากขึ้น
- บางทีมันอาจทำให้คุณเคยชินกับการสืบค้นโดยไม่มีพารามิเตอร์บางทีคุณอาจทำผิดพลาดเพียงครั้งเดียวและใช้ค่าสตริงด้วยวิธีนี้แล้วคุณอาจจะบอกลาข้อมูลของคุณได้ นิสัยที่ไม่ดี!
"SELECT * FROM Product WHERE Id =" + TextBox1.Text
แม้ว่าจะไม่ใช่คำถามของคุณ แต่อาจมีประโยชน์สำหรับผู้อ่านในอนาคต:
หายนะความปลอดภัย !
แม้ว่าId
ฟิลด์จะเป็นจำนวนเต็ม แต่แบบสอบถามของคุณอาจอยู่ภายใต้การฉีด SQL สมมติว่าคุณมีข้อความค้นหาในแอปพลิเคชันของคุณ"SELECT * FROM Table1 WHERE Id=" + TextBox1.Text
ผู้โจมตีสามารถแทรกลงในกล่องข้อความ1; DELETE Table1
และแบบสอบถามจะเป็น:
"SELECT * FROM Table1 WHERE Id=1; DELETE Table1"
หากคุณไม่ต้องการใช้การสืบค้นแบบพารามิเตอร์ที่นี่คุณควรใช้ค่าที่พิมพ์:
string.Format("SELECT * FROM Table1 WHERE Id={0}", int.Parse(TextBox1.Text))
คำถามของคุณ
คำถามของฉันเกิดขึ้นเนื่องจากเพื่อนร่วมงานคนหนึ่งเขียนข้อความค้นหาจำนวนมากที่เชื่อมโยงกับค่าจำนวนเต็มและฉันสงสัยว่าฉันเสียเวลาที่จะแก้ไขทั้งหมดหรือไม่
ฉันคิดว่าการเปลี่ยนรหัสเหล่านั้นไม่เสียเวลา แนะนำให้เปลี่ยนแน่นอน!
หากเพื่อนร่วมงานของคุณใช้ตัวแปร int ก็จะไม่มีความเสี่ยงด้านความปลอดภัย แต่ฉันคิดว่าการเปลี่ยนรหัสเหล่านั้นไม่เสียเวลาและแนะนำให้เปลี่ยนรหัสเหล่านั้น ทำให้โค้ดอ่านง่ายขึ้นบำรุงรักษาได้มากขึ้นและทำให้การดำเนินการเร็วขึ้น