Project นี้หยุดพัฒนาแล้ว!
สำหรับการป้องกันทางเลือก โปรดเลือกและตัดสินใจด้วยตนเองดังรายการต่อไปนี้.
การป้องกัน XSS
การป้องกัน CSRF
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;