ในสคริปต์อีเมล PHP ในส่วนก่อนหน้ามีช่องโหว่
ขั้นแรก ให้ดูโค้ด PHP จากบทที่แล้ว:
<html><head><meta charset="utf-8"><title>บทช่วยสอนการเขียนโค้ด (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // หากได้รับพารามิเตอร์อีเมล ให้ส่งอีเมล // ส่งอีเมล $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "ส่งเมลเรียบร้อยแล้ว";} else { // หากไม่มีอีเมล พารามิเตอร์ จากนั้นแสดงแบบฟอร์ม echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text'><br> Subject: <input name='subject' type='text'><br> ข้อความ:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form >";}?></body></html>
ปัญหาของโค้ดข้างต้นคือผู้ใช้ที่ไม่ได้รับอนุญาตสามารถแทรกข้อมูลในส่วนหัวของอีเมลผ่านแบบฟอร์มป้อนข้อมูลได้
จะเกิดอะไรขึ้นหากผู้ใช้เพิ่มข้อความต่อไปนี้ลงในอีเมลในกล่องป้อนข้อมูลในแบบฟอร์ม
[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
ตามปกติแล้ว ฟังก์ชัน mail() จะใส่ข้อความด้านบนลงในส่วนหัวของอีเมล ดังนั้นตอนนี้ส่วนหัวจึงมีช่อง Cc:, Bcc: และ To: เพิ่มเติม เมื่อผู้ใช้คลิกปุ่มส่ง อีเมลนี้จะถูกส่งไปยังที่อยู่ทั้งหมดข้างต้น!
วิธีที่ดีที่สุดในการป้องกันการแทรกอีเมลคือการตรวจสอบความถูกต้องของอินพุต
รหัสต่อไปนี้คล้ายกับรหัสในบทที่แล้ว แต่ที่นี่เราได้เพิ่มเครื่องมือตรวจสอบอินพุตเพื่อตรวจจับฟิลด์อีเมลในแบบฟอร์ม:
<html><head><meta charset="utf-8"><title>บทช่วยสอนการเขียนโค้ด (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) กรองอีเมล // ใช้ FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() กรองอีเมล // ใช้ FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; }} if (isset($_REQUEST['email'])){/ // หากได้รับพารามิเตอร์อีเมล ให้ส่งอีเมล // ตรวจสอบว่าอีเมล $mailcheck = spamcheck($_REQUEST['email']); ถูกกฎหมายหรือไม่ ($mailcheck==FALSE) { echo "การป้อนข้อมูลที่ไม่ถูกต้อง"; } else { // ส่งอีเมล $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; ข้อความ'] ; mail("[email protected]", "Subject: $subject", $message, "From: $email" ); echo "ขอบคุณ สำหรับการใช้แบบฟอร์มอีเมลของเรา"; }}else{ // หากไม่มีพารามิเตอร์อีเมล ให้แสดงแบบฟอร์ม echo "<form method='post' action='mailform.php'> Email: <input name='email' type ='text '><br> เรื่อง: <input name='subject' type='text'><br> ข้อความ:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>";}?></body></html>
ในโค้ดด้านบน เราใช้ตัวกรอง PHP เพื่อตรวจสอบอินพุต:
ตัวกรอง FILTER_SANITIZE_EMAIL จะลบอักขระที่ผิดกฎหมายของอีเมลออกจากสตริง
ตัวกรอง FILTER_VALIDATE_EMAIL ตรวจสอบค่าของที่อยู่อีเมล
คุณสามารถอ่านเพิ่มเติมเกี่ยวกับตัวกรองได้ในตัวกรอง PHP ของเรา