class Veesf ที่ผมทำขึ้นมานี้ ได้มาจากการใช้ codeigniter 2 แล้วได้เห็นการทำงานของตัวช่วยรักษาความปลอดภัยต่างๆที่ทำงานได้อย่างมีประสิทธิภาพ.
ผมจึงลองหา class ต่างๆที่มีแจกในเน็ตที่เกี่ยวข้องกันนี้ และได้เขียนออกมาเป็น class นี้ เพื่อแจกจ่ายให้ web developer (php) ได้นำไปใช้กันเพื่อเสริมความปลอดภัยให้เว็บที่คุณทำ.
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;
คุณโสภณ ตอนนั้นผมทำแล้วทดสอบด้วยข้อมูลทดลองต่างๆ ผมก็จำไม่ค่อยได้แล้วว่ามันยังบกพร่องอะไรบ้าง
คุณลองเอาวิธีทดสอบจากเว็บนี้ไปลองดูทีละอันก็แล้วกันนะครับ http://ha.ckers.org/xss.html
ถ้านำไปปรับปรุงแล้วอย่างไร เอามาโพสท์ลิ้งค์ที่นี่ได้นะครับ (ในคอมเม้นท์นี้แหละ)
จากข้อความ "ในส่วนของการป้องกัน xss ที่ทำมาแล้วนั้น ยังไม่ได้ผลลัพธ์เป็นที่น่าพอใจเท่าใดนัก แม้ว่าจะป้องกันได้ดีแล้วก็ตาม"
รบกวนขอข้อมูลว่าสมควรเพิ่มเติมหรือขาดอะไรผมจะขอเอาคลาสนี้ไปปรับปรุงครับ
ขอบคุณมากครับ
itdeliver(แอท)gmail.com