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

เขียนเมื่อ 9 ปีก่อน โดย Ninenik Narkdee
sql injection

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

ดูแล้ว 8,683 ครั้ง




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


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





Tags:: sql injection




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

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

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

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



( หรือ เข้าใช้งานผ่าน Social Login )




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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ