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

1. สร้างไฟล์ที่มีชื่อว่า sql_injection.php โดยใช้ script ตามด้านล่างนี้…เอามาทั้งหมดเลย

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 เพื่อแสดงข้อมูลจากฐานข้อมูล
เช่น www.nayjoe.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>

 

nattanon

ณัฐนนท์ ลำสมุทร

Leave a Reply

Your email address will not be published. Required fields are marked *