PHP Ionic Angular HTML5 AJAX Javascript CSS MySQL jQuery Forum


ป้องกัน SQL Injection ด้วย php ฟังก์ชั่นอย่างง่าย ตอนที่ 1

20 February 2015 By Ninenik Narkdee
sql injection

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ sql injection



ตัวอย่างฟังก์ชั่นต่อไปนี้ เป็นแนวทางอย่างง่าย สำหรับใช้ในการป้องกัน
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

<?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>






Tags:: sql injection




เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



หริอ สมัครสมาชิก และล็อกอิน ด้วย Facebook



อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ


URL สำหรับอ้างอิง