การฉีด SQL (SQLi)

Mar 12 2023
สวัสดี ขอบคุณที่สละเวลาอ่านบทความนี้ — อัพ! ฉันรู้สึกทราบซึ้ง! เนื้อหาในวันนี้จะเกี่ยวกับการทำความเข้าใจ 'SQL Injection' เนื้อหาทั้งหมดขึ้นอยู่กับประสบการณ์และความรู้ส่วนตัวของฉัน การโต้ตอบกับผู้คนที่น่าทึ่งในพื้นที่ App Sec และ Software Development และการอ่านจำนวนมากและการเข้ารหัสที่ปลอดภัย ในบทความนี้ ผมจะพยายามทำให้เนื้อหาในขั้นพื้นฐานง่ายขึ้น
มาเรียนรู้ไปด้วยกัน | การฉีด SQL

สวัสดี,

ขอบคุณที่สละเวลาอ่านบทความนี้ — อัพ! ฉันรู้สึกทราบซึ้ง!

เนื้อหาวันนี้จะเป็นการทำความเข้าใจเกี่ยวกับ 'SQL Injection'

เนื้อหาทั้งหมดอิงจากประสบการณ์และความรู้ส่วนตัวของฉัน การโต้ตอบกับผู้คนที่น่าทึ่งในพื้นที่ App Sec และการพัฒนาซอฟต์แวร์ และการอ่านจำนวนมากและการเข้ารหัสที่ปลอดภัย

ในบทความนี้ ผมจะพยายามทำให้เนื้อหาในขั้นพื้นฐานง่ายขึ้น ฉันแน่ใจว่าผู้อ่านจะมีความคิดและความคิดเห็นของตนเอง และฉันยินดีรับคำติชมและการสนทนา

มุมมอง / ความคิดเห็น / ความคิดเห็นเป็นของฉันเองและไม่ใช่นายจ้างในอดีต / ปัจจุบันของฉัน

มาเรียนรู้กัน!

การฉีด SQL คืออะไร?

การโจมตีความปลอดภัยของแอปพลิเคชันประเภทหนึ่งที่ผู้ประสงค์ร้ายแทรกโค้ด SQL ที่เป็นอันตรายลงในช่องป้อนข้อมูลที่มีช่องโหว่เพื่อเข้าถึงและจัดการข้อมูลภายในฐานข้อมูล SQLi ช่วยให้ผู้โจมตีสามารถดู / แก้ไข / ลบข้อมูลในฐานข้อมูลได้

จะแก้ไข SQLi ได้อย่างไร?

อย่าเชื่อมต่อการสืบค้น SQL และค่าที่ป้อน

ทำการตรวจสอบอินพุตเสมอ ( ความเห็นส่วนตัวของฉัน มันขัดขวางลายเซ็นที่เป็นอันตรายจำนวนมาก ) จากนั้นทำตามหนึ่งในกลยุทธ์ด้านล่างเพื่อแก้ไข SQLi -

  1. Parameterized Query:ส่งผ่านค่าอินพุตเป็นพารามิเตอร์ไปยังคำสั่ง sql สิ่งนี้ได้มาจากการใช้เคียวรีที่กำหนดพารามิเตอร์ สิ่งนี้จะป้องกันไม่ให้อินพุตที่เป็นอันตรายถูกเรียกใช้งานเป็นรหัส SQL
  2. กระบวนงานที่เก็บไว้:เป็นการดีกว่ามากที่จะไม่มีการสืบค้น SQL sql ภายในโค้ดและย้ายไปยังฐานข้อมูลผ่านกระบวนงานที่เก็บไว้

ข้อความค้นหาที่กำหนดพารามิเตอร์:

ในตัวอย่างโค้ดด้านล่าง ชื่อและรหัสผ่านจะถูกส่งเป็นพารามิเตอร์ไปยังคำสั่ง sql ผ่าน 'setString()' มันเป็นวิธีการของPreparedStatement

....
// simple basic example
// assume name and pass are obtained from some input
// conn is the connection
String sqlStatement = "SELECT * FROM userdetails WHERE name = ? AND pass = ?";
PreparedStatement stmt = conn.prepareStatement(sqlStatement);
stmt.setString(1, name);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
// carry on with your logic
....

ในตัวอย่างโค้ดด้านล่าง 'ชื่อ' และ 'ตำแหน่ง' จะถูกส่งผ่านเป็นพารามิเตอร์ไปยังกระบวนงานที่เก็บไว้ 'userDetails' ผ่าน 'setString()' เป็นวิธีการของ CallableStatement เอาต์พุตได้รับผ่านพารามิเตอร์ 'เอาต์พุต' ซึ่งใช้ 'registerOutParameter' เป็นอีกวิธีหนึ่งของ CallableStatement

....
// simple basic example
// Assume name and location are obtained from some input
// conn is the connection
CallableStatement stmt = conn.prepareCall("{ call userdetails(?,?,?) }");
stmt.setString(1, name);
stmt.setString(2, location);
stmt.registerOutParameter(3, java.sql.Types.INTEGER);
stmt.execute();
int output = stmt.getInt(3);
// carry on with your logic...
....

ความคิดเห็น / ข้อเสนอแนะยินดีต้อนรับเสมอเพราะฉันมักจะต้องการปรับปรุงเนื้อหาและพัฒนาให้ดียิ่งขึ้น

การเขียนแหล่งที่มา: ประสบการณ์ของฉันเองใน App Sec, การถอดความเนื้อหาจากเว็บไซต์ออนไลน์หลายแห่ง, Open AI, DALL-E, Developer และเครื่องมือ NLP

ขอบคุณ!

เพิ่มฉันในLinkedIn