การโจมตีแบบ (CSRF) หรือ Cross-site Request Forgery จะใช้ “ตัวตน (Identity)” และ “สิทธิ์ (Privilege)” ของเหยื่อที่มีบนเว็บไซต์ ในการปลอมตัวเป็นเหยื่อ Hacker จะใช้ประโยชน์จาก Cookies ที่เก็บไว้บน Webbrowser (เว็บเบราว์เซอร์) ที่ส่ง Cookie ไปเก็บข้อมูลเพื่อใช้ในการการพิสูจน์ตัวตน Website (เว็บไซต์) ผู้ให้บริการควรเปลี่ยนจากการใช้ Cookie ที่ทำ Session-tracking มาเป็น Session Token ที่ถูกสร้างขึ้นแบบไดนามิก ทำให้ Hacker ทำการ Hack ได้ยากมากขึ้น
โดยบทความนี้จะกล่าวถึงวิธีสร้าง Form ป้องกันการโจมตีแบบ CSRF ใน php อย่างง่าย
วิธีสร้าง Form ป้องกันการโจมตีแบบ CSRF ใน php
หน้า index.php
<html>
<head>
<title>วิธีสร้าง Form ป้องกันการโจมตีแบบ CSRF ใน php</title>
</head>
<body>
<form action="sign.php" method="post" name="frm_data">
<table width="500">
<caption><h3>วิธีสร้าง Form ป้องกันการโจมตีแบบ CSRF ใน php</h3></caption>
<tr>
<td>Input :</td>
<td>
<input type="text" class="form-control" name="name" id="name" value=""/>
</td>
<input type = "hidden" name ="<?php echo md5(session_id()); ?>" value="1">
</tr>
<tr>
</td><td><td><input name="but_submit" type="submit" value="Submit" /></td>
</tr>
</form>
</body>
</html>
หน้า sign.php
<?php
$token = md5(session_id());
if (isset($_POST["name"])) {
$name = $_POST["name"];
if(!isset($_POST[$token])){
echo "โทเค็นการรักษาความปลอดภัยไม่ตรงกัน การร้องขอถูกยกเลิกเพื่อป้องกันการละเมิดความปลอดภัย โปรดลองอีกครั้ง";
exit;
}
if($_POST[$token] == $token){
echo "โทเค็นการรักษาความปลอดภัยไม่ตรงกัน การร้องขอถูกยกเลิกเพื่อป้องกันการละเมิดความปลอดภัย โปรดลองอีกครั้ง" ;
exit;
}
echo $_POST['name'];
}
?>
ผลลัพธ์
หน้า index.php
หน้า sign.php (จะรับค่าจากหน้า index.php)
หมายเหตุ : ตัวแปร token มีค่าไม่เท่ากับค่าที่ไดนามิคออกมา หรือไม่มีเลยจะแสดงว่า "โทเค็นการรักษาความปลอดภัยไม่ตรงกัน การร้องขอถูกยกเลิกเพื่อป้องกันการละเมิดความปลอดภัย โปรดลองอีกครั้ง"
อ้างอิงรูปภาพ : flickr.com