ฟังก์ชั่นความปลอดภัย PHP: strip_tags, filter_var, Md5 และ sha1

⚡ สรุปอย่างชาญฉลาด

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

  • 🛡️ รู้จักภัยคุกคาม: ความเสี่ยงหลักๆ ได้แก่ การโจมตีแบบ SQL injection, Cross-site scripting และการแทรกโค้ด ซึ่งมักเกิดขึ้นผ่านแบบฟอร์มหรือ URL พารามิเตอร์
  • 🧹 ป้ายติดสินค้า: strip_tags ลบ HTML ออก Javaใช้สคริปต์และแท็ก PHP จากข้อมูลที่ป้อนเข้ามา เพื่อลดความเสี่ยงจากการโจมตีแบบ Cross-Site Scripting (XSS) ที่เก็บข้อมูลไว้
  • ตรวจสอบความถูกต้องของข้อมูลที่ป้อน: filter_var จะตรวจสอบและกรองข้อมูล โดยยืนยันว่าค่าที่ได้รับเป็นประเภทที่คาดหวังไว้ก่อนที่โค้ดของคุณจะเชื่อถือค่านั้น
  • 🔒 หลบหนีหรือผูกมัด: mysqli_real_escape_string ทำหน้าที่แปลงอินพุตของคำสั่ง SQL ให้เป็นรูปแบบที่ปลอดภัย แต่คำสั่งเตรียมการแบบมีพารามิเตอร์ (parameterized prepared statements) เป็นวิธีการป้องกันการโจมตี SQL injection ที่มีประสิทธิภาพมากกว่า
  • 🔑 เข้ารหัสรหัสผ่านให้ถูกต้อง: ห้ามเก็บรหัสผ่านด้วย MD5 หรือ SHA1 เด็ดขาด ให้ใช้ password_hash และ password_verify แทน ซึ่งใช้การเข้ารหัสแบบ bcrypt ที่ช้าและมีการเพิ่มเกลือ (salted hashing)
  • 💡 การป้องกันเชิงลึก: รวมการตรวจสอบความถูกต้อง, escapingรวมถึง HTTPS และบัญชีฐานข้อมูลที่มีสิทธิ์ขั้นต่ำ แทนที่จะพึ่งพาการควบคุมเพียงอย่างเดียว
  • 🤖 AI ช่วยเหลือ: เครื่องมือ AI สามารถตรวจสอบโค้ด PHP เพื่อหาช่องโหว่ด้านความปลอดภัย และช่วยแก้ไขช่องโหว่ SQL injection หรือ XSS ได้อย่างปลอดภัย

ความปลอดภัยของ PHP

ภัยคุกคามความปลอดภัยที่อาจเกิดขึ้น

โดยพื้นฐานแล้ว มีคนสองกลุ่มที่สามารถโจมตีระบบของคุณได้:

  • แฮกเกอร์ – โดยมีเจตนาที่จะเข้าถึงข้อมูลที่ไม่ได้รับอนุญาตหรือขัดขวางแอปพลิเคชัน
  • ผู้ใช้งานอาจป้อนข้อมูลที่ไม่ถูกต้องลงในแบบฟอร์มโดยไม่รู้ตัว ซึ่งอาจส่งผลเสียต่อเว็บไซต์หรือแอปพลิเคชันบนเว็บได้

ต่อไปนี้คือประเภทของการโจมตีที่เราจำเป็นต้องระวัง

ด้วย 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

PHP strip_tags

สมมติว่าคุณได้รับข้อมูลต่อไปนี้จากผู้ใช้: 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

PHP strip_tags

ต่อไปนี้เราจะปกป้องแอปพลิเคชันของเราจากการโจมตีดังกล่าวโดยใช้ฟังก์ชัน strip_tags

<?php
 
$user_input = "<script>alert(0);</script>";
 
echo strip_tags($user_input);
 
?>

เรียกดูไฟล์ URL http://localhost/phptuts/comments.php

PHP strip_tags

ฟังก์ชั่น 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.

PHP Md5 และ PHP sha1

สำคัญ: 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

คำถามที่พบบ่อย

ใช้ prepared statements ที่มีพารามิเตอร์ผูกมัดใน mysqli หรือ PDO โดยจะส่งคำสั่ง SQL และข้อมูลแยกกัน ทำให้ข้อมูลที่ผู้ใช้ป้อนไม่สามารถเปลี่ยนแปลงโครงสร้างของคำสั่ง SQL ได้ ซึ่งมีความปลอดภัยกว่าการใช้ esca ด้วยตนเองping อินพุต

strip_tags จะลบแท็ก HTML และ PHP ออกทั้งหมด ในขณะที่ htmlspecialchars จะแปลงแท็กเหล่านั้นให้เป็นเอนทิตีที่ปลอดภัยเพื่อให้แสดงผลเป็นข้อความ สำหรับการแสดงผล escaping การป้องกัน XSS นั้น htmlspecialchars มักเป็นตัวเลือกที่ปลอดภัยกว่า

สร้างโทเค็น CSRF ที่ไม่ซ้ำกันสำหรับแต่ละเซสชัน ฝังโทเค็นนั้นเป็นฟิลด์ที่ซ่อนไว้ในทุกแบบฟอร์ม และตรวจสอบความถูกต้องเมื่อส่งข้อมูล ปฏิเสธคำขอใดๆ ที่ไม่มีโทเค็นหรือโทเค็นไม่ตรงกับค่าที่จัดเก็บไว้

ใช่แล้ว AI สามารถสแกนหาช่องโหว่ SQL injection, XSS, การเข้ารหัสรหัสผ่านที่ไม่ปลอดภัย และการจัดการไฟล์ที่ไม่ปลอดภัย จากนั้นจะอธิบายความเสี่ยงแต่ละอย่างและแนะนำวิธีแก้ไข ควรใช้เป็นเพียงการตรวจสอบเบื้องต้นที่เป็นประโยชน์ ไม่ใช่การทดแทนการตรวจสอบความปลอดภัยอย่างละเอียด

ใช่แล้ว วางโค้ดที่มีช่องโหว่ลงไป แล้ว AI ก็สามารถเขียนทับด้วยคำสั่งเตรียมการ (prepared statements) และแสดงผลลัพธ์เป็น esca ได้pingและการตรวจสอบความถูกต้องของข้อมูลนำเข้า ทดสอบโค้ดที่แก้ไขแล้วและยืนยันการแก้ไขกับข้อมูลโจมตีต้นฉบับ

สรุปโพสต์นี้ด้วย: