ตัวอย่างฟังก์ชั่นต่อไปนี้ เป็นแนวทางอย่างง่าย สำหรับใช้ในการป้องกัน
SQL Injection สามารถนำไปใช้งานได้ตามต้องการ หรือปรับแต่ง ดัดแปลงเพิ่มเติม
php ฟังก์ชั่น
ให้สร้างไฟล์ชื่อ sql_injection.php ไว้สำหรับ include ไฟล์ที่ต้องการใช้งาน
การใช้งาน
ตัวอย่างการใช้งาน
function real_esc($array,$int=0){
if(count($array)>0){
if(is_array($array)){
foreach($array as $key=>$value){
if(@is_array($array[$key])){
foreach($array[$key] as $key_2=>$value_2){
if($_SERVER['REQUEST_METHOD']=='GET'){
if(get_magic_quotes_gpc()){
$_GET[$key][$key_2]=trim("$value_2");
}else{
$_GET[$key][$key_2]=@mysql_real_escape_string(trim("$value_2"));
}
$_GET[$key][$key_2]=($int==1)?(int)$_GET[$key][$key_2]:$_GET[$key][$key_2];
}else{
if(get_magic_quotes_gpc()){
$_POST[$key][$key_2]=trim("$value_2");
}else{
$_POST[$key][$key_2]=@mysql_real_escape_string(trim("$value_2"));
}
$_POST[$key][$key_2]=($int==1)?(int)$_POST[$key][$key_2]:$_POST[$key][$key_2];
}
}
}else{
if($_SERVER['REQUEST_METHOD']=='GET'){
if(get_magic_quotes_gpc()){
$_GET[$key]=trim("$value");
}else{
$_GET[$key]=@mysql_real_escape_string(trim("$value"));
}
$_GET[$key]=($int==1)?(int)$_GET[$key]:$_GET[$key];
}else{
if(get_magic_quotes_gpc()){
$_POST[$key]=trim("$value");
}else{
$_POST[$key]=@mysql_real_escape_string(trim("$value"));
}
$_POST[$key]=($int==1)?(int)$_POST[$key]:$_POST[$key];
}
}
}
}else{
$value=$array;
if($_SERVER['REQUEST_METHOD']=='GET'){
$getVars = array_keys($_GET);
$key=$getVars[0];
if(get_magic_quotes_gpc()){
$_GET[$key]=trim("$value");
}else{
$_GET[$key]=@mysql_real_escape_string(trim("$value"));
}
$_GET[$key]=($int==1)?(int)$_GET[$key]:$_GET[$key];
}else{
$getVars = array_keys($_POST);
$key=$getVars[0];
if(get_magic_quotes_gpc()){
$_POST[$key]=trim("$value");
}else{
$_POST[$key]=@mysql_real_escape_string(trim("$value"));
}
$_POST[$key]=($int==1)?(int)$_POST[$key]:$_POST[$key];
}
}
}
}
การใช้งาน
real_esc($_POST); // จัดการรายการที่ส่งแบบ POST ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql real_esc($_POST,1); // จัดการรายการที่ส่งแบบ POST ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลขทั้งหมด real_esc($_POST['member_id']); // จัดการรายการที่ส่งแบบ POST รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql real_esc($_POST['member_id'],1); // จัดการรายการที่ส่งแบบ POST รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลข real_esc($_GET); // จัดการรายการที่ส่งแบบ GET ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql real_esc($_GET,1); // จัดการรายการที่ส่งแบบ GET ทั้งหมด ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลขทั้งหมด real_esc($_GET['member_id']); // จัดการรายการที่ส่งแบบ GET รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql real_esc($_GET['member_id'],1); // จัดการรายการที่ส่งแบบ GET รายตัวแปร ก่อนนำไปใช้งานในคำสั่ง sql // และแปลงให้เป็นตัวเลขเท่านั้น ใช้สำหรับกรณีเราส่งค่า id ที่เป็นตัวเลข
ตัวอย่างการใช้งาน
ไฟล์ view_data.php แสดงรายละเอียดข้อมูล รับค่า GET ตัวแปร id
แล้วนำไปใช้งานในคำสั่ง sql เพื่อแสดงข้อมูลจากฐานข้อมูล
เช่น wwww.ninenik.com/view_data.php?id=1
สมมติไฟล์เชื่อมต่อฐานข้อมูลเราชื่อ connect.php
ไฟล์ view_data.php
<?php
header("Content-type:text/html; charset=UTF-8");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// เชื่อมต่อกับฐานข้อมูล
$link=mysql_connect("localhost","root","test"); // เชื่อมต่อ Server
mysql_select_db("test"); // ติดต่อฐานข้อมูล
mysql_query("set character set utf8"); // กำหนดค่า character set ที่จะใช้แสดงผล
?>
ไฟล์ view_data.php
<?php
// เชื่อมต่อกับฐานข้อมูล
include("connect.php");
// เรียกไฟล์ ฟังก์ชั่น sql injection ที่เราสร้างมาใช้งาน
include("sql_injection.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php
real_esc($_GET,1);
//real_esc($_GET['id'],1); // หรือใช้แบบนี้ก็ได้ กำหนด 1 เมื่อค่าต้องการเป็นตัวเลข
$q="
SELECT * FROM tbl_data WHERE data_id='".$_GET['id']."'
LIMIT 1
";
$qr=mysql_query($q);
$rs=mysql_fetch_array($qr);
echo $rs['data_detail']."<br>";
?>
</body>
</html>