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

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

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

ดูแล้ว 6,989 ครั้ง




ต่อเนื่อง และเพิ่มเติมจากเนื้อหาบทความก่อนหน้า 
 
ป้องกัน SQL Injection ด้วย php ฟังก์ชั่นอย่างง่าย ตอนที่ 1 
 
php ฟังก์ชั่น
ให้สร้างไฟล์ชื่อ sql_injection.php ไว้สำหรับ include ไฟล์ที่ต้องการใช้งาน

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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];
            }           
        }
    }
}


การใช้งาน

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!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

1
2
3
4
5
6
7
8
9
10
<?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
ตัวอย่างด้านล่าง กำหนดการจัดเก็บรหัสผ่านแบบง่าย การตรวจสอบจริงไม่มีการเข้ารหัส
เพิ่มความปลอดภัย สามารถปรับแต่งและประยุกต์เข้ารหัส ก่อนบันทึกข้อมูลตามต้องการ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?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>


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





Tags:: sql injection




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

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

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

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



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




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










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