PHP: ซ่อน version

Byphunsanit

PHP: ซ่อน version

การที่ซ่อน X-Powered-By: PHP/5.X.X ซึ่งจะเป็น version ที่ server ใช้โดย php.ini มีเหตุผลที่ไม่ใช่การไม่ให้ credit PHP ตามที่มีคนมา discredit PHP บ่อย ๆ ว่า PHP มันกาก แต่เป็นความปลอดภัย และความจำเป็นที่ควรทำโดยแสดงความเป็นมืออาชีพ คนละอย่างกับเพลงดัง อย่าบอกให้ใครรู้ ว่าเรารู้สึกต่อกันเช่นไร. แค่เรามองตากัน ก็สั่นสะท้านไปทั้งหัวใจ. อย่าให้ใครเห็น. ว่าฉันแอบส่งสายตาหวานๆ ให้ใคร เพราะการที่รู้ว่าใคร ( หรือ version อะไร ) มันมีข้อเสียมากกว่าข้อดี Hacker จะใช้ CVE โจมตีเราง่ายขึ้น


ทำไมเราควรตั้งค่า expose_php = Off บน Server?

เพราะถ้า php.ini มี config expose_php = On ตัว PHP จะส่ง Header ที่ชื่อว่า X-Powered-By: PHP/8.x.x ออกไปพร้อมกับทุก response

  1. ลดความเสี่ยงจากการถูกโจมตี (Security by Obscurity)
    • หากผู้ไม่หวังดี (Hacker) รู้เลขเวอร์ชันที่แน่นอน เช่น PHP/5.1.0 มันจะสามารถไปค้นหาฐานข้อมูล CVE (Common Vulnerabilities and Exposures) เพื่อหาช่องโหว่เฉพาะของเวอร์ชันนั้นๆ และโจมตีเข้าที่จุดอ่อนได้ทันที
    • การตั้งเป็น Off: แม้การปิดข้อมูลนี้จะไม่ใช่การป้องกันช่องโหว่โดยตรง แต่มันคือการ “ซ่อนเป้าหมาย” ทำให้ Hacker ต้องเสียเวลาในการคาดเดาและสแกนหาข้อมูลมากขึ้น ใช้เวลาในการลองผิดลองถูกมากขึ้น
  2. ป้องกันการถูกสแกนจาก Bot อัตโนมัติ ที่จะวิ่งไปทั่ว ๆ เน็ตที่จะหาว่า โปรแกรมเก่า ๆ หรือใหม่ที่ตรงกับ Zero-day (ซีโร่เดย์ หรือ วันศูนย์) หมายถึงช่องโหว่ด้านความปลอดภัยในซอฟต์แวร์หรือฮาร์ดแวร์ที่ผู้พัฒนา ยังไม่รู้ตัวหรือยังไม่มีแพตช์แก้ไข อยู่ที่ไหนบ้าง ก็จะใช้ข้อมูลอย่าง X-Powered-By ในการหาเป้าหมาย ถ้าซ่อนเอาไว้ ก็จะพ้นจากตำบลกระสุนตกไปได้
  3. ภาพลักษณ์ของความเป็นมืออาชีพ (Professionalism)
    • การปล่อยให้ระบบโชว์เทคโนโลยีเบื้องหลังอย่างละเอียดถี่ถ้วน เป็นสัญญาณหนึ่งที่บอกว่า Server นี้อาจไม่ได้ถูกปรับแต่ง (Harden) มาอย่างดีพอ
    • ในมุมมองของนักตรวจสอบความปลอดภัย (Security Auditor) การปิด Header ที่ไม่จำเป็นถือเป็นมาตรฐานพื้นฐาน (Best Practice) ในการตั้งค่าระบบให้ปลอดภัยตามมาตรฐานสากล
  4. ประหยัด Bandwidth (นิดหน่อย)
    • ถึงจะเป็นแค่บรรทัดเดียว แต่ถ้าเว็บมันเป็นเว็บใหญ่ มีแสนรีเควส (Request) ต่อวัน มันก็ประหยัดเน็ตไปได้เป็นล้านไบต์

วิธีปิดอย่างถูกต้องใน php.ini

  1. ค้นหา php version โดย
    php -v
    ได้ข้อความประมาณ
    PHP 5.8.2 (cli) (built: AUG 5 1982 07:00:00) (NTS)
    Copyright (c) The PHP Group
    Built by Debian
    Zend Engine v4.5.1, Copyright (c) Zend Technologies
    with Zend OPcache v5.8.2, Copyright (c), by Zend Technologies
  2. ค้นหาใน folder ของ version นั้น ๆ
    grep -rn "expose_php" /etc/php/5.8/
    จะได้ผลลัพธ์อย่าง
    /etc/php/5.8/fpm/php.ini:395:expose_php = On
    /etc/php/5.8/cli/php.ini:396:expose_php = On
  3. แก้ค่า expose_php จาก On เป็น Off
  4. reload php ใหม่
    sudo systemctl reload php5.8-fpm
    หรือ
    sudo systemctl restart php5.8-fpm
  5. reload nginx
    sudo systemctl reload nginx

การทดสอบ

  1. เปิดเว็บอย่าง https://pitt.plusmagi.com
  2. กด F12 หรือคลิกขวาแล้วเลือก inspect
  3. ไปที่ tab Network
  4. คลิกที่ Doc
  5. กด reload page
  6. คลิกดูซักไฟล์
  7. คลิกเท็บ Headers
  8. ใน Response Headers ไม่ควรจะมี X-Powered-By: PHP/

ถ้าทำทุกอย่างแล้วยังมี X-Powered-By: PHP/ ทั้ง ๆ ที่แก้ครบแล้ว อาจจะเป็นที่ CDN อย่าง Cloudflare หรือ proxy จำเอาไว้ ให้ลอง clear cache ดู

About the author

phunsanit administrator