เรากำลังมีการอภิปรายอีกครั้งในที่ทำงานเกี่ยวกับการใช้การสืบค้น sql ที่เป็นพารามิเตอร์ในโค้ดของเรา เรามีสองด้านในการสนทนา: ฉันและคนอื่น ๆ บางคนที่บอกว่าเราควรใช้พารามิเตอร์เพื่อป้องกันการฉีด sql และคนอื่น ๆ ที่ไม่คิดว่าจำเป็น แต่พวกเขาต้องการแทนที่เครื่องหมายวรรคตอนเดี่ยวด้วยเครื่องหมายอะพอสทรอฟีสองตัวในทุกสตริงเพื่อหลีกเลี่ยงการฉีด sql ฐานข้อมูลของเรากำลังรัน Sql Server 2005 หรือ 2008 และฐานรหัสของเราทำงานบน. NET framework 2.0
ขอยกตัวอย่างง่ายๆใน C #:
ฉันต้องการให้เราใช้สิ่งนี้:
string sql = "SELECT * FROM Users WHERE Name=@name";
SqlCommand getUser = new SqlCommand(sql, connection);
getUser.Parameters.AddWithValue("@name", userName);
//... blabla - do something here, this is safe
ในขณะที่คนอื่น ๆ ต้องการทำสิ่งนี้:
string sql = "SELECT * FROM Users WHERE Name=" + SafeDBString(name);
SqlCommand getUser = new SqlCommand(sql, connection);
//... blabla - are we safe now?
โดยที่ฟังก์ชัน SafeDBString ถูกกำหนดดังนี้:
string SafeDBString(string inputValue)
{
return "'" + inputValue.Replace("'", "''") + "'";
}
ตอนนี้ตราบใดที่เราใช้ SafeDBString กับค่าสตริงทั้งหมดในแบบสอบถามของเราเราก็ควรจะปลอดภัย ขวา?
มีสองเหตุผลในการใช้ฟังก์ชัน SafeDBString ประการแรกมันเป็นวิธีที่ทำมาตั้งแต่ยุคหินและประการที่สองการดีบักคำสั่ง sql นั้นง่ายกว่าเนื่องจากคุณเห็นคิวรี excact ที่รันบนฐานข้อมูล
ถ้าอย่างนั้น คำถามของฉันคือการใช้ฟังก์ชัน SafeDBString เพียงพอหรือไม่เพื่อหลีกเลี่ยงการโจมตี sql injection ฉันพยายามค้นหาตัวอย่างของโค้ดที่ละเมิดมาตรการความปลอดภัยนี้ แต่ไม่พบตัวอย่างใด ๆ
มีใครที่สามารถทำลายสิ่งนี้ได้บ้าง? คุณจะทำอย่างไร?
แก้ไข: เพื่อสรุปคำตอบจนถึงตอนนี้:
- ยังไม่มีใครค้นพบวิธีใช้ SafeDBString บน Sql Server 2005 หรือ 2008 ได้เลย นั่นเป็นสิ่งที่ดีฉันคิดว่า?
- การตอบกลับหลายครั้งชี้ให้เห็นว่าคุณได้รับประสิทธิภาพที่เพิ่มขึ้นเมื่อใช้คำค้นหาที่เป็นพารามิเตอร์ เหตุผลก็คือแผนแบบสอบถามสามารถใช้ซ้ำได้
- นอกจากนี้เรายังยอมรับว่าการใช้การสืบค้นแบบพารามีทริกทำให้โค้ดที่อ่านง่ายขึ้นและดูแลรักษาได้ง่ายขึ้น
- นอกจากนี้การใช้พารามิเตอร์จะง่ายกว่าการใช้ SafeDBString เวอร์ชันต่างๆการแปลงสตริงเป็นตัวเลขและการแปลงสตริงจนถึงปัจจุบัน
- การใช้พารามิเตอร์คุณจะได้รับการแปลงประเภทอัตโนมัติซึ่งเป็นสิ่งที่มีประโยชน์อย่างยิ่งเมื่อเราทำงานกับวันที่หรือตัวเลขทศนิยม
- และสุดท้ายอย่าพยายามรักษาความปลอดภัยด้วยตัวเองตามที่ JulianR เขียนไว้ ผู้จำหน่ายฐานข้อมูลใช้เวลาและเงินจำนวนมากในการรักษาความปลอดภัย ไม่มีทางที่เราจะทำได้ดีขึ้นและไม่มีเหตุผลใดที่เราควรพยายามทำหน้าที่ของพวกเขา
ดังนั้นในขณะที่ไม่มีใครสามารถทำลายความปลอดภัยอย่างง่ายของฟังก์ชัน SafeDBString ได้ฉันก็มีข้อโต้แย้งดีๆมากมาย ขอบคุณ!