มีหลายๆเทคนิค และหลายๆ วิธีที่ใช้สำหรับการป้องกันปัญหา SQL injuction หรือการส่งคำสั่งพิเศษเพื่อไปประมวลผมรวมกับคิวรี่ของภาษา SQL โดยเทคนิคโดยทั่วไปที่นิยมใช้คือ
1. ฟังก์ชั่น mysql_real_escape_string() เป็นฟังก์ชั่นสำหรับการเปลี่ยนอักขระพิเศษที่ส่งเข้ามาให้กลายเป็น string ที่ไม่สามารถประผลได้เช่น ถูกส่งคำสั่ง ‘or’ 1=1 เข้ามา ฟังก์ชันจะแปลงให้กลายเป็น \’or\’ 1=1 แทน เป็นต้น
2. trim() หรือ str_replace() ใช้สำหรับการตัดช่องว่างหรือแทนที่ช่องว่างด้วยค่าอื่นๆ เช่น หากส่งคำสั่ง or 1=1 เข้ามา ช่องว่างจะถูกตัดออกทำให้คำสั่งไม่สามารถประมวลผลร่วมกับคำสั่ง SQL ได้
3. เทคนิคการแปลงให้ค่าให้เป็นข้อมูลชนิดใดชนิดหนึ่ง เช่น หากมีการส่งค่า id มาจากตัวแปร $_GET[‘id’] เพื่อเรียกเรคเคอร์ที่มีค่า id เท่ากับ id ที่ส่งมา โดยทั่วไป id ต้องเป็นข้อมูลประเภทตัวเลข หรือ Integer เท่านั้น ดังนั้นก่อนนำค่าที่ได้จาก id ไปทำงานร่วมกับคำสั่ง SQL ควรแปลงค่าที่ถูกส่งมาทั้งหมดให้กลายเป็นตัวเลขโดยอาจใช้
- ฟังก์ชัน intval (return ค่า integer ของตัวแปรออกมา)
- ใช้ sprintf(“%d %s”)
- หรือตรวจสอบค่าในตัวแปรที่รับมานั้นเป็นตัวเลขหรือด้วยฟังก์ชัน is_numuric() เป็นต้น
4. ใช้ฟังก์ชัน bind_param ร่วมกับการทำงานของคำสั่ง SQL ตัวอย่าง php.net
<?php
$mysqli = new mysqli(‘localhost’, ‘my_user’, ‘my_password’, ‘world’);
/* check connection */
if (mysqli_connect_errno()) {
printf(“Connect failed: %s\n”, mysqli_connect_error());
exit();
}
$stmt = $mysqli->prepare(“INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)”);
$stmt->bind_param(‘sssd’, $code, $language, $official, $percent);
$code = ‘DEU’;
$language = ‘Bavarian’;
$official = “F”;
$percent = 11.2;
/* execute prepared statement */
$stmt->execute();
printf(“%d Row inserted.\n”, $stmt->affected_rows);
/* close statement and connection */
$stmt->close();
/* Clean up table CountryLanguage */
$mysqli->query(“DELETE FROM CountryLanguage WHERE Language=’Bavarian'”);
printf(“%d Row deleted.\n”, $mysqli->affected_rows);
/* close connection */
$mysqli->close();
?>
ยังมีอีกหลายๆ เทคนิค หากพบเจอจะนำมาบันทึกและนำเสนอในครั้งๆ ต่อไป