การฉีด SQL (SQLi)
สวัสดี,
ขอบคุณที่สละเวลาอ่านบทความนี้ — อัพ! ฉันรู้สึกทราบซึ้ง!
เนื้อหาวันนี้จะเป็นการทำความเข้าใจเกี่ยวกับ 'SQL Injection'
เนื้อหาทั้งหมดอิงจากประสบการณ์และความรู้ส่วนตัวของฉัน การโต้ตอบกับผู้คนที่น่าทึ่งในพื้นที่ App Sec และการพัฒนาซอฟต์แวร์ และการอ่านจำนวนมากและการเข้ารหัสที่ปลอดภัย
ในบทความนี้ ผมจะพยายามทำให้เนื้อหาในขั้นพื้นฐานง่ายขึ้น ฉันแน่ใจว่าผู้อ่านจะมีความคิดและความคิดเห็นของตนเอง และฉันยินดีรับคำติชมและการสนทนา
มุมมอง / ความคิดเห็น / ความคิดเห็นเป็นของฉันเองและไม่ใช่นายจ้างในอดีต / ปัจจุบันของฉัน
มาเรียนรู้กัน!
การฉีด SQL คืออะไร?
การโจมตีความปลอดภัยของแอปพลิเคชันประเภทหนึ่งที่ผู้ประสงค์ร้ายแทรกโค้ด SQL ที่เป็นอันตรายลงในช่องป้อนข้อมูลที่มีช่องโหว่เพื่อเข้าถึงและจัดการข้อมูลภายในฐานข้อมูล SQLi ช่วยให้ผู้โจมตีสามารถดู / แก้ไข / ลบข้อมูลในฐานข้อมูลได้
จะแก้ไข SQLi ได้อย่างไร?
อย่าเชื่อมต่อการสืบค้น SQL และค่าที่ป้อน
ทำการตรวจสอบอินพุตเสมอ ( ความเห็นส่วนตัวของฉัน มันขัดขวางลายเซ็นที่เป็นอันตรายจำนวนมาก ) จากนั้นทำตามหนึ่งในกลยุทธ์ด้านล่างเพื่อแก้ไข SQLi -
- Parameterized Query:ส่งผ่านค่าอินพุตเป็นพารามิเตอร์ไปยังคำสั่ง sql สิ่งนี้ได้มาจากการใช้เคียวรีที่กำหนดพารามิเตอร์ สิ่งนี้จะป้องกันไม่ให้อินพุตที่เป็นอันตรายถูกเรียกใช้งานเป็นรหัส SQL
- กระบวนงานที่เก็บไว้:เป็นการดีกว่ามากที่จะไม่มีการสืบค้น 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





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)