ฟังก์ชั่นความปลอดภัย PHP: strip_tags, filter_var, Md5 และ sha1
⚡ สรุปอย่างชาญฉลาด
PHP Security ปกป้องเว็บแอปพลิเคชันจากผู้โจมตีและการป้อนข้อมูลที่ไม่ระมัดระวัง โดยการตรวจสอบความถูกต้อง การกรอง และการจัดเก็บข้อมูลอย่างปลอดภัย คู่มือนี้จะกล่าวถึงภัยคุกคามหลักๆ จากนั้นจะแสดงวิธีการใช้งาน strip_tags, filter_var และ escapingและเทคโนโลยีการแฮชรหัสผ่านสมัยใหม่ด้วย password_hash เพื่อป้องกันการโจมตี XSS, SQL injection และการขโมยข้อมูลประจำตัว

ภัยคุกคามความปลอดภัยที่อาจเกิดขึ้น
โดยพื้นฐานแล้ว มีคนสองกลุ่มที่สามารถโจมตีระบบของคุณได้:
- แฮกเกอร์ – โดยมีเจตนาที่จะเข้าถึงข้อมูลที่ไม่ได้รับอนุญาตหรือขัดขวางแอปพลิเคชัน
- ผู้ใช้งานอาจป้อนข้อมูลที่ไม่ถูกต้องลงในแบบฟอร์มโดยไม่รู้ตัว ซึ่งอาจส่งผลเสียต่อเว็บไซต์หรือแอปพลิเคชันบนเว็บได้
ต่อไปนี้คือประเภทของการโจมตีที่เราจำเป็นต้องระวัง
ด้วย SQL Injection – การโจมตีประเภทนี้จะเพิ่มโค้ดที่เป็นอันตรายเข้าไป SQL งบ
การดำเนินการนี้ทำได้โดยใช้แบบฟอร์มป้อนข้อมูลของผู้ใช้ หรือ URLที่ใช้ตัวแปร
โค้ดที่แนบมานี้จะปิดใช้งานเงื่อนไขในส่วน WHERE ของคำสั่ง SQL นอกจากนี้ โค้ดที่แนบมานี้ยังสามารถ:
- ใส่เงื่อนไขที่จะเป็นจริงเสมอ
- ลบข้อมูลจากตาราง
- อัปเดตข้อมูลในตาราง
การโจมตีประเภทนี้มักจะใช้เพื่อเข้าถึงแอปพลิเคชันโดยไม่ได้รับอนุญาต
การเขียนสคริปต์ข้ามไซต์ (XSS) – การโจมตีประเภทนี้จะแทรกโค้ดที่เป็นอันตราย โดยปกติแล้ว Javaสคริปต์นี้สร้างขึ้นโดยใช้แบบฟอร์มป้อนข้อมูลจากผู้ใช้ เช่น แบบฟอร์มติดต่อเราและแบบฟอร์มแสดงความคิดเห็น โดยมีวัตถุประสงค์เพื่อ:
- ดึงข้อมูลที่ละเอียดอ่อนเช่น ข้อมูลคุกกี้
- เปลี่ยนเส้นทางผู้ใช้ไปยังหน้าอื่น URL.
ภัยคุกคามอื่นๆ อาจรวมถึงการแทรกโค้ด PHP, การแทรกเชลล์, การแทรกอีเมล และการเปิดเผยซอร์สโค้ดของสคริปต์
แนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของแอปพลิเคชัน PHP
ต่อไปนี้เราจะมาดูแนวทางปฏิบัติที่ดีที่สุดด้านความปลอดภัยของ PHP ที่เราต้องพิจารณาเมื่อพัฒนาโปรแกรมกันping แอปพลิเคชันของเรา
PHP strip_tags
ฟังก์ชัน strip_tags จะลบ HTML ออก Javaต้นฉบับหรือแท็ก PHP จากสตริง
ฟังก์ชันนี้มีประโยชน์เมื่อเราต้องปกป้องแอปพลิเคชันของเราจากการโจมตี เช่น การโจมตีแบบ Cross-Site Scripting (XSS)
ลองพิจารณาแอปพลิเคชันที่รับความคิดเห็นจากผู้ใช้ดู
<?php $user_input = "Your site rocks"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
สมมติว่าคุณได้บันทึกไฟล์ comments.php ไว้ในโฟลเดอร์ phptuts แล้ว ให้เข้าไปที่โฟลเดอร์นั้น URL http://localhost/phptuts/comments.php
สมมติว่าคุณได้รับข้อมูลต่อไปนี้จากผู้ใช้: alert(‘Your site sucks!’);
<?php $user_input = "<script>alert(0);</script>"; echo "<h4>My Commenting System</h4>"; echo $user_input; ?>
เรียกดูไฟล์ URL http://localhost/phptuts/comments.php
ต่อไปนี้เราจะปกป้องแอปพลิเคชันของเราจากการโจมตีดังกล่าวโดยใช้ฟังก์ชัน strip_tags
<?php $user_input = "<script>alert(0);</script>"; echo strip_tags($user_input); ?>
เรียกดูไฟล์ URL http://localhost/phptuts/comments.php
ฟังก์ชั่น PHP filter_var
ฟังก์ชัน filter_var ใช้เพื่อตรวจสอบความถูกต้องและทำให้ข้อมูลสะอาด
การตรวจสอบความถูกต้องจะตรวจสอบว่าข้อมูลมีประเภทที่ถูกต้องหรือไม่ การตรวจสอบความถูกต้องของตัวเลขในสตริงส่งกลับผลลัพธ์ที่เป็นเท็จ
การฆ่าเชื้อคือการลบอักขระที่ผิดกฎหมายออกจาก เชือก.
โปรดดูข้อมูลอ้างอิงฉบับเต็มได้ที่ลิงก์นี้: filter_var
โค้ดด้านล่างนี้ใช้สำหรับระบบแสดงความคิดเห็น โดยใช้ฟังก์ชัน filter_var และค่าคงที่ FILTER_SANITIZE_STRIPPED เพื่อลบแท็กออก
<?php $user_input = "<script>alert(0);</script>"; echo filter_var($user_input, FILTER_SANITIZE_STRIPPED); ?>
Output:
alert('Your site sucks!');
หมายเหตุ FILTER_SANITIZE_STRIPPED (ชื่อเรียกอีกอย่างหนึ่งของ FILTER_SANITIZE_STRING) ถูกยกเลิกการใช้งานแล้วใน PHP เวอร์ชัน 8.1 สำหรับโค้ดใหม่ ให้ใช้ strip_tags() หรือเพื่อการแสดงผลที่ปลอดภัย ให้ใช้ htmlspecialchars()
PHP mysqli_real_escape_string
ฟังก์ชัน mysqli_real_escape_string ใช้เพื่อช่วยปกป้องแอปพลิเคชันจากการโจมตีแบบ SQL injection
สมมติว่าเรามีคำสั่ง SQL ต่อไปนี้สำหรับการตรวจสอบความถูกต้องของรหัสผู้ใช้และรหัสผ่าน
<?php SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass'; ?>
ผู้ใช้ที่เป็นอันตรายสามารถเข้าสู่ระบบได้ ' หรือ 1 = 1 — ใส่ 1234 ในช่องข้อความรหัสผู้ใช้ และ 1234 ในช่องข้อความรหัสผ่าน มาเริ่มเขียนโค้ดโมดูลการตรวจสอบสิทธิ์กันเลย
<?php $uid = "0$uid1$pwd';"; echo $sql; ?>
ผลลัพธ์สุดท้ายจะเป็นดังนี้:
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
ที่นี่
- “WHERE uid = ”” ตรวจสอบว่ารหัสผู้ใช้ว่างเปล่าหรือไม่
- “หรือ 1 = 1” เป็นเงื่อนไขที่จะเป็นจริงเสมอ
- เครื่องหมาย “–” ใช้สำหรับคอมเมนต์ส่วนที่ตรวจสอบรหัสผ่าน
คำสั่งค้นหาข้างต้นจะส่งคืนผู้ใช้ทั้งหมด ต่อไปนี้เราจะใช้ฟังก์ชัน mysqli_real_escape_string เพื่อรักษาความปลอดภัยให้กับโมดูลการเข้าสู่ระบบของเรา โปรดทราบว่าในโค้ดจริง ฟังก์ชันนี้จะรับการเชื่อมต่อฐานข้อมูลเป็นอาร์กิวเมนต์แรก
<?php $uid = mysqli_real_escape_string($conn, "0$uid1$pwd';"; echo $sql; ?>
โค้ดด้านบนจะแสดงผลลัพธ์ดังนี้:
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
หมายเหตุ: เครื่องหมายอัญประกาศเดี่ยวตัวที่สองถูกแปลงเป็นอักขระพิเศษแล้ว ดังนั้นจะถูกถือว่าเป็นส่วนหนึ่งของรหัสผู้ใช้ และรหัสผ่านจะไม่ถูกปิดใช้งาน (คอมเมนต์)
ปฏิบัติที่ดีที่สุด: เอสก้าping ถึงแม้จะช่วยได้ แต่การใช้ prepared statements ที่มีพารามิเตอร์ใน mysqli หรือ PDO เป็นวิธีการป้องกัน SQL injection ที่แนะนำมากกว่า เพราะข้อมูลจะไม่ถูกผสมเข้าไปในข้อความของคำสั่ง SQL เลย
PHP Md5 และ PHP sha1
MD5 ย่อมาจาก Message Digest 5 และ SHA1 ย่อมาจาก Secure Hash Algorithm 1 ทั้งสองเป็นฟังก์ชันแฮชแบบทางเดียว
โค้ดด้านล่างแสดงการใช้งาน MD5 และ SHA1
<?php echo "MD5 Hash: " . md5("password"); echo "SHA1 Hash: " . sha1("password"); ?>
สมมติว่าคุณได้บันทึกไฟล์ hashes.php ไว้ในโฟลเดอร์ phptuts แล้ว ให้เข้าไปที่โฟลเดอร์นั้น URL.
สำคัญ: MD5 และ SHA1 เป็นแฮชที่ประมวลผลเร็วและไม่ใส่เกลือ (unsalted hashes) ไม่ถือว่าปลอดภัยอีกต่อไปสำหรับการจัดเก็บรหัสผ่านเนื่องจากสามารถถอดรหัสได้อย่างรวดเร็วด้วยฮาร์ดแวร์สมัยใหม่และตารางเรนโบว์ ควรใช้เฉพาะกับค่าตรวจสอบที่ไม่เกี่ยวข้องกับความปลอดภัย และใช้วิธีการด้านล่างสำหรับรหัสผ่าน
วิธีเข้ารหัสรหัสผ่านอย่างปลอดภัยใน PHP
สำหรับการจัดเก็บรหัสผ่าน PHP มีฟังก์ชัน password_hash และ password_verify ซึ่งใช้อัลกอริทึมแบบช้าและมีการเพิ่มเกลือ (bcrypt เป็นค่าเริ่มต้น) ทำให้แต่ละค่าแฮชมีเอกลักษณ์เฉพาะตัวและถอดรหัสได้ยาก แม้ว่าฐานข้อมูลของคุณจะถูกขโมยไปก็ตาม
<?php // Hash a password before storing it in the database $hash = password_hash("mypassword", PASSWORD_DEFAULT); // Verify the password when the user logs in if (password_verify("mypassword", $hash)) { echo "Password is valid"; } else { echo "Invalid password"; } ?>
- รหัสผ่าน_แฮช() สร้างแฮชที่มีการเพิ่มเกลือเพื่อจัดเก็บในฐานข้อมูล; PASSWORD_DEFAULT จะช่วยให้คุณใช้ขั้นตอนวิธีที่แนะนำในปัจจุบัน
- ยืนยันรหัสผ่าน() ตรวจสอบการพยายามเข้าสู่ระบบกับแฮชที่จัดเก็บไว้โดยไม่ต้องถอดรหัสข้อมูล
เนื่องจากค่า salt และอัลกอริทึมถูกจัดเก็บไว้ภายในค่าแฮช คุณจึงไม่ต้องจัดการค่าเหล่านั้นด้วยตนเอง ซึ่งทำให้เป็นวิธีที่ถูกต้องและยั่งยืนสำหรับการจัดการรหัสผ่านใน PHP




