SQL Injection (ไทย)
หน้าแรก PHP MySQL เกร็ดความรู้ SQL Injection (ไทย)
SQL Injection เป็นวิธี hack รูปแบบหนึ่ง ซึ่งปัจจุบันยังมีเว็บบางที่ ที่สามารถ hack ด้วยวิธีนี้ได้ โดยเฉพาะของประเทศไทย โดยการ hack รูปแบบนี้จะมีวิธีคือการใส่ บางส่วนของภาษา sql เข้าไปใน input ที่จะนำไปใช้เป็น sql ที่จะ query ไปยัง server เพื่อให้ได้สิทธิเป็น Member หรืออาจจะเป็น Admin เลยก็ได้นะครับ ในกรณีที่ร้ายที่สุดคือ ถูกลบข้อมูลทั้งหมดใน Database นั้นไปเลยครับ
10 ปากว่าไม่เท่าตาเห็น เรามาทดลองดีกว่าครับว่ามันเป็นยังไง สมมุติ Code หน้า Login เป็นแบบนี้
<?php
mysql_connect("localhost","root","");
mysql_select_db("sqlinjection");
$sql= "SELECT * FROM users WHERE user = '".$_POST['username']."' AND pass='".$_POST['password']."';";
$res = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($res) > 0){
echo "เข้าสู่ระบบเรียบร้อย";
}else{ echo "เข้าสู่ระบบล้มเหลว"; }
?>
ถ้าสมมุติเราใส่ช่อง username เป็น Admin แล้ว Password เป็น ' or '9'='9 Code Sql จะเป็นงี้ครับ
SELECT * FROM users WHERE user = 'Admin' AND pass='' or '9'='9';
ซึ่งจะทำให้เราได้ User Admin มาใช้เลยนะครับ อันนี้เป็นแค่ตัวอย่างนะครับ ของจริงอาจจะยากกว่านี้มาก แต่ถ้าโดนแบบนี้ได้ ข้อมูลก็อาจจะหายหมดก็ได้นะครับ โดยเฉพาะคนที่ชอบใส่ or die(mysql_error()) เพราะบางทีมันก็มีข้อมูลที่เป็นประโชน์ให้ hacker นะครับ เช่นชื่อ field ชื่อตาราง
ต่อมาเป็นวิธีป้องกันครับ
ถ้าเป็น php ให้เปิด magic_quotes_gpc หรือใช้ function ที่ชื่อ addslashes(เป็น function ที่มีไว้สำหรับเพิ่ม เข้าไปหน้าตัวอักษรที่อาจจะทำให้ออกจาก string ใน sql เช่นพวก ' หรือ ) กับข้อมูลก่อนนำไปเข้า sql ครับ นี่เป็นตัวอย่าง Code ที่แก้ไขแล้ว
<?php
mysql_connect("localhost","root","");
mysql_select_db("sqlinjection");
$sql= "SELECT * FROM users WHERE user = '".addslashes ($_POST['username'])."' AND pass='".addslashes ($_POST['password'])."';";
$res = mysql_query($sql);
if(mysql_num_rows($res) > 0){
echo "เข้าสู่ระบบเรียบร้อย";
}else{
echo "เข้าสู่ระบบล้มเหลว";
}
?>
มันจะได้ sql อย่างนี้ครับ
SELECT * FROM users WHERE user = 'Admin' AND pass='' or '9'='9';
มันจะปลอดภัยกว่าครับ
ขึ้นไปด้านบน
