ฟังก์ชั่นที่ใช้สำหรับป้องกัน SQL injuction เบื้องต้น

มีหลายๆเทคนิค และหลายๆ วิธีที่ใช้สำหรับการป้องกันปัญหา 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();
?>

ยังมีอีกหลายๆ เทคนิค หากพบเจอจะนำมาบันทึกและนำเสนอในครั้งๆ ต่อไป

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s