PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

ป้องกัน SQL Injection สำหรับการ ล็อกอิน อย่างง่าย ตอนที่ 2

21 February 2015 By


ต่อเนื่อง และเพิ่มเติมจากเนื้อหาบทความก่อนหน้า 
 
ป้องกัน SQL Injection ด้วย php ฟังก์ชั่นอย่างง่าย ตอนที่ 1 
http://www.ninenik.com/content.php?arti_id=602 via @ninenik
 
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 ที่เป็นตัวเลข


ตัวอย่างการใช้งาน
 
กรณีสมมติเราไฟล์สำหรับเป็นฟอร์มล็อกอิน อย่างง่าย ชื่อ login.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test Login</title>
</head>
<body>

    
    <br>

<form id="myform1" name="myform1" method="post" action="check_login.php">
    Username:<br>
    <input type="text" name="username" id="username"><br>
    Password<br>
    <input type="password" name="password" id="password"><br>
    <br>
    <input type="submit" value="Login" name="login" value="Log In">
    
</form>
        
</body>
</html>


ส่งค่าไปตรวจสอบที่ไฟล์ check_login.php
สมมติไฟล์เชื่อมต่อฐานข้อมูลเราชื่อ connect.php

<?php
session_start(); // สำหรับใช้งานตัวแปร SESSION
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 ที่จะใช้แสดงผล     
?>


ไฟล์ check_login.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
if(isset($_POST['login']) && $_POST['login']!=""){
    real_esc($_POST);
    $q="
    SELECT * FROM tbl_member WHERE 
    member_name='".$_POST['username']."' 
    AND member_password='".$_POST['password']."'
    AND member_type='1' LIMIT 1 
    ";
    $qr=mysql_query($q);
    if($qr && mysql_num_rows($qr)>0){
        $rs=mysql_fetch_array($qr);
        echo $rs['member_name']."<br>";  
        $_SESSION['ses_member_id']=$rs['member_id'];
        echo "Ok";
    }else{
        echo "No";
    }
}
?>
</body>
</html>

Tags:: sql injection

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

กรุณาล็อกอิน และลงชื่อติดตาม


สมัครสมาชิกได้ที่        ล็อกอินได้ที่   





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