PHP Ionic Angularjs Phonegap AJAX Javascript CSS MySQL jQuery Forum

วิธีการประยุกต์เข้ารหัส cookie แบบ two way encryption อย่างง่าย

18 October 2015 By


สำหรับเนื้อหาต่อไปนี้ เราจะทำการเข้ารหัส cookie เพื่อป้องกัน เช่น กรณี cookie
เราโดนขโมยจากการทำ XSS ค่าที่ได้นั้น ก็จะไม่สามารถนำไปใช้งานได้ หรือถ้าต้องการ
ใช้งานค่านั้น ก็จำเป็นต้องมี key สำหรับถอดรหัสข้อมูลนั้น ก่อน
โดยในที่นี้จะใช้ฟังก์ชัน 
 
จากเว็บไซต์ 
https://naveensnayak.wordpress.com/2013/03/12/simple-php-encrypt-and-decrypt/
 
หรือถ้าใครจะใช้รูปแบบอื่นก็สามารถ ค้นหาฟังก์ชั่นที่ต้องการจาก google ค้นคำว่า

php two way encryption 

 
1. เริ่มต้นให้เราสร้างไฟล์ชื่อ encrypt_decrypt.php ตามนี้
 
<?php
// https://naveensnayak.wordpress.com/2013/03/12/simple-php-encrypt-and-decrypt/
/**
 * simple method to encrypt or decrypt a plain text string
 * initialization vector(IV) has to be the same when encrypting and decrypting
 * PHP 5.4.9
 *
 * this is a beginners template for simple encryption decryption
 * before using this in production environments, please read about encryption
 *
 * @param string $action: can be 'encrypt' or 'decrypt'
 * @param string $string: string to encrypt or decrypt
 *
 * @return string
 */
function encrypt_decrypt($action, $string) {
    $output = false;

    $encrypt_method = "AES-256-CBC";
    $secret_key = 'oooooooo';
    $secret_iv = 'oooooooo';

    // hash
    $key = hash('sha256', $secret_key);
    
    // iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
    $iv = substr(hash('sha256', $secret_iv), 0, 16);

    if( $action == 'encrypt' ) {
        $output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
        $output = base64_encode($output);
    }
    else if( $action == 'decrypt' ){
        $output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
    }

    return $output;
}
// ลบ comment ตั้งแต่ส่วนนี้ลงไปออก เพื่อทดสอบการเข้ารหัส ถอดรหัส
//$plain_txt = "mypassword";
//echo "Plain Text = $plain_txt";
//echo "<br>";    
//
//$encrypted_txt = encrypt_decrypt('encrypt', $plain_txt);
//echo "Encrypted Text = $encrypted_txt";
//echo "<br>";    
//
//$decrypted_txt = encrypt_decrypt('decrypt', $encrypted_txt);
//echo "Decrypted Text = $decrypted_txt";
//echo "<br>";    
//
//if( $plain_txt === $decrypted_txt ) echo "SUCCESS";
//else echo "FAILED";
//
//echo "<br>";    
?>
 
แก้ไขค่าตรงนี้
 
    $secret_key = 'oooooooo';
    $secret_iv = 'oooooooo';
 
เป็นค่าที่ต้องการ อะไรก็ได้ เสมือนเป็น key ในการเข้ารหัสและถอดรหัสเฉพาะของเรา
สำหรับฟังก์ชั่นนี้ ทางผู้เขียนโค้ดเขาบอกว่า server ของเราต้องมีการติดตั้ง openssl และ
ทำงานเปิดทำงานอยู่ เราสามารถทดสอบง่ายๆ โดย
อัพไฟล์ข้างต้นขึ้น server แล้วลบ commnet โค้ดทดสอบออก แล้วรันไฟล์ดูว่า สามารถเข้า
รหัสและถอดรหัสได้หรือไม่ ถ้าได้แสดงว่า เราสามารถใช้ฟังก์ชั่นนี้ได้ 
หลังทดสอบแล้วก็ปิดคอมเม้นไว้เหมือนเดิม โดยระวังไม่ให้ก่อนคำสั่ง <?php และหลัง ?>
อย่าให้มีช่องว่าง เพราะเราจะ include ไฟล์นี้ไว้สำหรับ เข้ารหัส cookie พร้อมสร้างตัวแปร cookie ด้วย

 
 
2. ต่อไปให้เราสร้างไฟล์ชื่อ setcookie.php สำหรับเข้ารหัสและสร้างตัวแปร cookie รูปแบบง่ายๆ ดังนี้
 
<?php
include("encrypt_decrypt.php");
if(isset($_POST['data_ck']) && trim($_POST['data_ck'])!="" && 
isset($_POST['name_ck']) && trim($_POST['name_ck'])!=""){
$name_ck=trim($_POST['name_ck']);
$value_ck=encrypt_decrypt('encrypt', trim($_POST['data_ck']));
$day_ck=365; // จำนวนวันที่ต้องการให้ cookie คงอยู่
setcookie($name_ck,$value_ck,time()+60*60*24*$day_ck);  	
}
?>
 
รูปแบบการกำหนดตัวแปร cookie ข้างต้นกำหนดสำหรับใช้ในโดนเมนนั้นๆ หาก
ใครต้องการกำหนดแบบเฉพาะ ก็สามารถศึกษาการกำหนดตัวแปร cookie จากฟังก์ชั่น
setcookie เพิ่มเติมได้
การทำงานคือ เราจะใช้ jquery ajax ในการส่งค่าชื่อ และค่า ของ cookie ที่ต้องการ
จากนั้นนำค่ามาเข้ารหัสแล้วเข้าทำการกำหนดค่า
 
3. การทดสอบและใช้งาน เราจะทำการทดสอบอย่างง่าย กับรูปแบบ
การเก็บช้อมูลล็อกอินไว้ในตัวแปร cookie สมมติเป็นไฟล์ชื่อ page_login.php
ดูโค้ดและคำธิบายแสดงในโค้ดดังนี้
 
<?php
// เรียกไฟล์เข้ารหัส เพราะเราจะใช้ในการถอดรหัสข้อมูลมาแสดงใน ฟอร์ม
include("encrypt_decrypt.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>


<br><br><br>
<div class="container" style="margin:auto;width:600px;">
<form name="myform1" id="myform1" action="" role="form" method="post">
<table class="table" style="width:500px;">
   <tr class="active">
       <td colspan="2" class="text-center">
           LOGIN
       </td>
   </tr>
    <tr>
        <td width="100" class="text-right">
            Username::
        </td>
        <td class="text-left">
            <input type="text" name="user" id="user" class="form-control input-sm" 
            value="<?=(isset($_COOKIE['user_ck']))?$_COOKIE['user_ck']:NULL?>">
        </td>        
    </tr>
    <tr>
        <td class="text-right">
            Password::
        </td>
        <td class="text-left">
            <input type="password" name="pass" id="pass" class="form-control input-sm" 
            value="<?=(isset($_COOKIE['pass_ck']))?encrypt_decrypt('decrypt', $_COOKIE['pass_ck']):NULL?>" >
        </td>        
    </tr>    
    <tr>
        <td class="text-right">

        </td>
        <td class="text-left">
            <input type="checkbox" name="remember" id="remember" value="1" 
            <?=(isset($_COOKIE['check_ck']) && $_COOKIE['check_ck']==1)?" checked":NULL?>>
            Rembmer?
        </td>        
    </tr>   
    <tr>
        <td class="text-right">

        </td>
        <td class="text-left">
         <input type="submit" value="Login" name="btn_submit">
        </td>        
    </tr>           
</table>    
</form>
<br>
<pre>
    <?php print_r($_COOKIE); ?>
</pre>
</div>

<script type="text/javascript">
$(function(){
    
    $("form#myform1").on("submit",function(){
        // ถ้าคลิกเลือกให้จำข้อมูลการล็อกอิน
        if($("#remember").prop("checked")){
            var days=365; // กำหนดจำนวนวันที่ต้องการให้จำค่า  
            var date = new Date();  
            date.setTime(date.getTime()+(days*24*60*60*1000));  
            var expires = " expires="+date.toGMTString();  
            document.cookie = "user_ck=" +$("#user").val()+ "; " + expires + ";";       
            document.cookie = "check_ck=" +$("#remember").val()+ "; " + expires + ";";       
            // เราจะเข้ารหัส cookie เฉพาะรหัสผ่าน
            $.post("setcookie.php",{
                name_ck:'pass_ck',
                data_ck:$("#pass").val()
            },function(){
                $("form#myform1")[0].submit();
            });
        }else{
            // ถ้าไม่ให้จำข้อมูลการล็อกอิน ให้ล้างค่าตัวแปร cookie
            var date = new Date();  
            date.setTime(date.getTime()*-1);        
            var expires = " expires="+date.toGMTString();             
            document.cookie = "user_ck=;"+expires+";";  
            document.cookie = "check_ck=;"+expires+";";		
            document.cookie = "pass_ck=;"+expires+";";	
            $("form#myform1")[0].submit(); // เสร็จแล้วก็ submit ฟอร์มปกติ
        }
        return false;
    });

});
    </script>        
</body>
</html>
 
 
จากโค้ดตัวอย่าง เราจะมีฟอร์มสำหรับทำการล็อกอิน มีให้กรอก username และ password และมีให้เลือกว่า
ต้องการที่จำข้อมูลการล็อกอินหรือไม่ โดยมี checkbox ให้ติ้กเลือก ซึ่งในที่นี้เราจะทำการเข้ารหัสเฉพาะ
รหัสผ่าน ส่วนค่าอื่นๆ ก็กำหนดปกติ โดยส่งค่าด้วย jquery ajax
จะเห็นว่า เราใช้การกำหนดตัวแปร cookie ทั้งใช้ javascript และ php
 
*ซึ่งจริงๆ แล้วการกำหนดตัวแปร cookie เราสามารถกำหนดในไฟล์ php เลยก็ได้โดยกำหนดไว้ในหน้าไฟล์
ที่เราทำการ submit ข้อมูลไป ตัวอย่างเช่น  เราส่งค่าไปที่ไฟล์เดิม ดังนั้นก็สามารถกำหนดโค้ดด้านบนเป็น
ดังนี้แทนการใช้ jquery ajax ได้
 
 
<?php
// เรียกไฟล์เข้ารหัส เพราะเราจะใช้ในการถอดรหัสข้อมูลมาแสดงใน ฟอร์ม
include("encrypt_decrypt.php");
if(isset($_POST['user']) && $_POST['user']!=""
   && isset($_POST['pass']) && $_POST['pass']!=""){
    
    if(isset($_POST['remember'])){
        $day_ck=365;
        $encrypt_pass=encrypt_decrypt('encrypt', trim($_POST['pass']));
        setcookie('user_ck',$_POST['user'],time()+60*60*24*$day_ck);  	
        setcookie('pass_ck',$encrypt_pass,time()+60*60*24*$day_ck);  	
        setcookie('check_ck',$_POST['remember'],time()+60*60*24*$day_ck);  	
    }else{
        setcookie('user_ck',NULL,time()+60*60*24*-1);  	
        setcookie('pass_ck',NULL,time()+60*60*24*-1);  	
        setcookie('check_ck',NULL,time()+60*60*24*-1);  	        
    }
    // ทำคำสั่งล็อกอิน
    
    echo '<meta http-equiv="refresh" content="0;URL=" />'; // reditect ไปหน้าเดิม
    exit;
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="http://code.jquery.com/jquery-1.11.3.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>


<br><br><br>
<div class="container" style="margin:auto;width:600px;">
<form name="myform1" id="myform1" action="" role="form" method="post">
<table class="table" style="width:500px;">
   <tr class="active">
       <td colspan="2" class="text-center">
           LOGIN
       </td>
   </tr>
    <tr>
        <td width="100" class="text-right">
            Username::
        </td>
        <td class="text-left">
            <input type="text" name="user" id="user" class="form-control input-sm" 
            value="<?=(isset($_COOKIE['user_ck']))?$_COOKIE['user_ck']:NULL?>">
        </td>        
    </tr>
    <tr>
        <td class="text-right">
            Password::
        </td>
        <td class="text-left">
            <input type="password" name="pass" id="pass" class="form-control input-sm" 
            value="<?=(isset($_COOKIE['pass_ck']))?encrypt_decrypt('decrypt', $_COOKIE['pass_ck']):NULL?>" >
        </td>        
    </tr>    
    <tr>
        <td class="text-right">

        </td>
        <td class="text-left">
            <input type="checkbox" name="remember" id="remember" value="1" 
            <?=(isset($_COOKIE['check_ck']) && $_COOKIE['check_ck']==1)?" checked":NULL?>>
            Rembmer?
        </td>        
    </tr>   
    <tr>
        <td class="text-right">

        </td>
        <td class="text-left">
         <input type="submit" value="Login" name="btn_submit">
        </td>        
    </tr>           
</table>    
</form>
<br>
<pre>
    <?php print_r($_COOKIE); ?>
</pre>
</div>

   
</body>
</html>
 
 
จะเห็นว่าการใช้งานแบบ php อย่างเดียวในการกำหนด cookie ก็จะเขียนง่ายกว่า รวมทั้งเราสามารถ
เข้ารหัสตัวแปร cookie ก็ตัวก็ได้ตามต้องการ แต่ต้องระวังเรื่องช่องว่าง ห้ามเกิดพื้นที่ว่างก่อนคำสั่งในการ
สร้างตัวแปร cookie ด้วย php เพราะจะทำให้เราไม่สามารถกำหนดตัวแปรได้ 
กรณีเรากำหนดแบบใช้ php อย่างเดียว ไฟล์ setcookie.php เราไม่จำเป็นต้องใช้
 
แนวทางข้างต้น สามารถนำไปปรับใช้ และประยุกต์ตามต้องการ ใช้ป้องกันข้อมูลของเราได้
เช่น ถ้าสมมติเว็บไซต์ของเราโดนขโมยตัวแปรค่า cookie อย่างเรากำหนดให้จำ username
และ password ในตัวแปร cookie แบบตรงๆ หากข้อมูลนี้โดนขโมยด้วยวิธีอย่างการใช้ XSS
ก็จะทำให้คนที่ได้ข้อมูลนั้นไป สามารถเอาค่าที่ได้ มาทำการล็อกอินใช้งานระบบ แทนเราได้
แต่ถ้าเขาได้ค่าไป แต่เป็นค่าที่ถูกเข้ารหัสไว้ ก็ไม่สามารถที่จะนำมาใช้ในการล็อกอินเข้าสู่ระบบ
ของเราได้ แบบนี้เป็นต้น
 

Tags:: xss encrypt php เข้ารหัส decrypt

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

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


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





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