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

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

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;

ความคิดเห็น

  • vee vee

    คุณโสภณ ตอนนั้นผมทำแล้วทดสอบด้วยข้อมูลทดลองต่างๆ ผมก็จำไม่ค่อยได้แล้วว่ามันยังบกพร่องอะไรบ้าง
    คุณลองเอาวิธีทดสอบจากเว็บนี้ไปลองดูทีละอันก็แล้วกันนะครับ http://ha.ckers.org/xss.html

    ถ้านำไปปรับปรุงแล้วอย่างไร เอามาโพสท์ลิ้งค์ที่นี่ได้นะครับ (ในคอมเม้นท์นี้แหละ)

  • โสภณ โสภณ

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

    รบกวนขอข้อมูลว่าสมควรเพิ่มเติมหรือขาดอะไรผมจะขอเอาคลาสนี้ไปปรับปรุงครับ

    ขอบคุณมากครับ

    itdeliver(แอท)gmail.com

เขียนความคิดเห็น

ชื่อ:
ความคิดเห็น:
 
ความคิดเห็นของคุณต้องรอการตรวจจากผู้ดูแลก่อนที่จะเผยแพร่สู่สาธารณะ.