เสริมความปลอดภัยให้ form ป้องกัน csrf/xss

class Veesf ที่ผมทำขึ้นมานี้ ได้มาจากการใช้ codeigniter 2 แล้วได้เห็นการทำงานของตัวช่วยรักษาความปลอดภัยต่างๆที่ทำงานได้อย่างมีประสิทธิภาพ.
ผมจึงลองหา class ต่างๆที่มีแจกในเน็ตที่เกี่ยวข้องกันนี้ และได้เขียนออกมาเป็น class นี้ เพื่อแจกจ่ายให้ web developer (php) ได้นำไปใช้กันเพื่อเสริมความปลอดภัยให้เว็บที่คุณทำ.

Properties/Methods ต่างๆที่มี

property/method attribute รายละเอียด
csrf_prevention (property) กำหนดว่าจะมีการป้องกัน csrf หรือไม่. ค่าที่กำหนดเป็น boolean(true/false) ค่าเดิมคือ true
csrf_token_name กำหนดชื่อของ csrf token ค่าเดิมคือ csrf_token
form_close() ปิดฟอร์ม ออกมาเป็นแทก </form>
form_hidden($hidden_name = '', $hidden_value = '', $attribute = '') $hidden_name @string
$hidden_value @string
$attribute @array
เขียนแทก input type="hidden"
ตัวอย่าง echo $veesf->hidden("hidden_name", "hidden_value", array("id"=>"myid", "class"=>"myclass"));
จะได้ <input type="hidden" name="hidden_name" value="hidden_value" id="myid" class="myclass" />
form_open($action = '', $attribute = '') $action @string
$attribute @array
เขียนแทกเปิดฟอร์ม <form>
ตัวอย่าง echo $veesf->form_open("page.php", array("enctype"=>"multipart/form-data", "id"=>"myid"));
จะได้ <form method="post" action="page.php" enctype="multipart/form-data" id="myid">
และจะได้ <input type="hidden" name="encrypted_csrf_token_name" value="encrypted_csrf_token_value" /> ถ้ามีกำหนดให้ป้องกัน csrf
form_open_multipart($action = '', $attribute = '') $action @string
$attribute @array
เขียนแทกเปิดฟอร์ม <form> สำหรับอัปโหลด
ตัวอย่าง echo $veesf->form_open_multipart("page.php", array("id"=>"myid"));
จะได้ <form method="post" action="page.php" enctype="multipart/form-data" id="myid">
และจะได้ <input type="hidden" name="encrypted_csrf_token_name" value="encrypted_csrf_token_value" /> ถ้ามีกำหนดให้ป้องกัน csrf
generate_token() สำหรับสร้าง input hidden เพื่อใส่ค่าป้องกัน csrf ทางฟอร์ม
method นี้ไม่จำเป็นต้องใช้ถ้าหากเปิดฟอร์มด้วย form_open แล้ว
input_get($name = '', $xssfilter = false) $name @string
$xssfilter @boolean
รับค่า $_GET โดยหากไม่มีค่าใดส่งมาจะได้ null
กำหนด $xssfilter เป็น true เพื่อป้องกันการโจมตีแบบ cross site scripting(xss)
input_post($name = '', $xssfilter = false) $name @string
$xssfilter @boolean
รับค่า $_POST โดยหากไม่มีค่าใดส่งมาทาง method post จะได้ null
กำหนด $xssfilter เป็น true เพื่อป้องกันการโจมตีแบบ cross site scripting(xss)
xss_clean($data) $data @mixed กรองเพื่อป้องกันการโจมตีแบบ xss
method นี้ถูกเรียกใช้ใน input_get และ input_post โดยอัตโนมัติ เมื่อกำหนด $xssfilter เป็น true

ตัวอย่างการใช้งาน


<?php
require_once("veesf.php");
$vsf = new veesf();
?>
<!doctype html>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8" />
        <title>test Vee form secured</title>
        <style type="text/css" media="all">
            .hrmajor {border: none; border-top: 3px solid #ccc; margin: 20px 0 20px 0;}
            .hrminor {border: none; border-top: 2px dashed #efefef;}
        </style>
    </head>
    <body>
        <h1>ทดสอบ Vee secured form</h1>
        <h3>ทดสอบ xss</h3>
        input xss test result:<br />
        <?php echo $vsf->input_post("xss", true); ?><br />
        <textarea name="null" cols="50" rows="7"><?php echo $vsf->input_post("xss", true); ?></textarea><br />
        <hr />
        <?php echo $vsf->form_open("test.php"); ?>
            xss test: <br /><textarea name="xss" cols="50" rows="7"><?php echo $vsf->input_post("xss"); ?></textarea><br />
            <input type="submit" value="send" />
        <?php echo $vsf->form_close(); ?>
    </body>
</html>

จากนั้นให้ทดลองการป้องกันด้วยวิธีจากในเว็บต่อไปนี้
http://www.owasp.org/index.php/Testing_for_CSRF_%28OWASP-SM-005%29 csrf
http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 xss
http://www.chipmunkninja.com/Helping-Prevent-XSS-Attacks-in-2@ xss

ในส่วนของการป้องกัน xss ที่ทำมาแล้วนั้น ยังไม่ได้ผลลัพธ์เป็นที่น่าพอใจเท่าใดนัก แม้ว่าจะป้องกันได้ดีแล้วก็ตาม.

การ กำหนดว่าจะป้องกัน csrf หรือไม่นั้น สามารถกำหนดได้โดยผ่าน config เช่น $config['csrf_prevention'] = false; แล้วเริ่ม class $vsf = new veesf($config);
หรือกำหนดหลังเริ่ม class แล้วก็ได้ เช่น $vsf->csrf_prevention = false;