วิธีป้องกันการฉีด sql

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

ทุกคนรู้ดีว่าความก้าวหน้าของการรักษาความปลอดภัยทางเทคโนโลยีเป็นคุณสมบัติพื้นฐานและสำคัญสำหรับทุกธุรกิจและแพลตฟอร์มโซเชียลมีเดีย เกือบทุกธุรกิจถ่ายทอดข้อมูลธุรกิจของตน ซึ่งเก็บข้อมูลนี้ไว้ในฐานข้อมูล ดังนั้น SQL จึงมีเทคนิคในการบันทึกข้อมูลของคุณจากแฮกเกอร์ เราสามารถป้องกันข้อมูลเว็บไซต์ของเราจากแฮกเกอร์โดยใช้เทคนิคต่างๆ ในทำนองเดียวกัน การฉีด SQL เป็นเทคนิคการแฮ็ก แฮกเกอร์สามารถเข้าถึงข้อมูลของคุณ และพวกเขาสามารถทำให้เซิร์ฟเวอร์ของคุณพังได้ด้วยการใส่รหัสลงในฐานข้อมูลของคุณ วิธีนี้เป็นไปได้เนื่องจากการเข้ารหัสที่ไม่เหมาะสมของแพ็คเกจเว็บแบบเอียง ผู้พัฒนารายใหม่บางรายไม่ตรวจสอบความว่างของช่องข้อมูล และช่องว่างเป็นสาเหตุของการฉีด SQL

ป้องกัน SQL Injection ผ่าน Parameterized Queries

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

โค้ดตัวอย่างง่ายๆ สำหรับเทคนิคนี้คือ:

รายชื่อสาธารณะ safeFindAccountsByCustomerId ( String customerId )

พ่นข้อยกเว้น {

สตริง sql = ' เลือก ' + ' customer_id, acc_number, branch_id, ยอดคงเหลือจากบัญชี ' +' โดยที่ customer_id = ? ' ;

การเชื่อมต่อ c = dataSource.getConnection( ) ;

PreparedStatement p = c.prepareStatement( sql ) ;

p.setString( 1 , customerId );

ResultSet rs = p.executeQuery( sql ) );

// ละเว้น – ประมวลผลแถวและส่งคืนรายการบัญชี

}

ในโค้ดด้านบนเมธอด prepareStatement() ที่มีอยู่ในตัวอย่างการเชื่อมต่อเพื่อรับ PreparedStatement สิ่งนี้ทำให้เราสามารถแทรกค่าที่บุคคลให้มาอย่างถูกต้องในคำถามก่อนที่จะดำเนินการ

การใช้แบบสอบถามที่เตรียมไว้ของ PDO

ใช้ PDO และแบบสอบถามที่เตรียมไว้

($conn เป็นวัตถุ PDO)

$stmt = $conn -> เตรียม (‘ INSERT INTO tbl VALUES ( :Id , :name ) ‘ );

$stmt -> bindValue ( ' :id ' , $id );

$stmt -> bindValue(' :name ' , $name ) ;

$stmt -> ดำเนินการ ( ) ;

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

ป้องกันผ่าน Object Relational Mapping (ORM) ใน Ruby Framework

ทีมพัฒนาจำนวนมากเลือกใช้เฟรมเวิร์ก Object Relational Mapping (ORM) เพื่อทำให้การแปลหน่วยผลลัพธ์ SQL เป็นอ็อบเจกต์โค้ดเป็นไปอย่างราบรื่นยิ่งขึ้น เครื่องมือ ORM มักจะแนะนำว่านักพัฒนาไม่ค่อยควรเขียนคำสั่ง SQL ของโค้ดของพวกเขา - และเครื่องมือเหล่านี้ก็ใช้คำสั่งแบบกำหนดพารามิเตอร์อย่างมีความสุขภายใต้ประทุน

def current_user (อีเมล)

# วัตถุ 'ผู้ใช้' เป็นวัตถุ Active Record ที่ต้องหาวิธีการ

# สร้างขึ้นโดยอัตโนมัติโดย Rails

User.find_by_email (อีเมล)

จบ

โค้ดข้างต้นจะช่วยคุณประหยัดจากการฉีด SQL หรือการโจมตีของแฮ็กเกอร์

ฐานข้อมูลเข้ารหัส

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