การที่ซ่อน 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
- ลดความเสี่ยงจากการถูกโจมตี (Security by Obscurity)
- หากผู้ไม่หวังดี (Hacker) รู้เลขเวอร์ชันที่แน่นอน เช่น
PHP/5.1.0 มันจะสามารถไปค้นหาฐานข้อมูล CVE (Common Vulnerabilities and Exposures) เพื่อหาช่องโหว่เฉพาะของเวอร์ชันนั้นๆ และโจมตีเข้าที่จุดอ่อนได้ทันที
- การตั้งเป็น Off: แม้การปิดข้อมูลนี้จะไม่ใช่การป้องกันช่องโหว่โดยตรง แต่มันคือการ “ซ่อนเป้าหมาย” ทำให้ Hacker ต้องเสียเวลาในการคาดเดาและสแกนหาข้อมูลมากขึ้น ใช้เวลาในการลองผิดลองถูกมากขึ้น
- ป้องกันการถูกสแกนจาก Bot อัตโนมัติ ที่จะวิ่งไปทั่ว ๆ เน็ตที่จะหาว่า โปรแกรมเก่า ๆ หรือใหม่ที่ตรงกับ Zero-day (ซีโร่เดย์ หรือ วันศูนย์) หมายถึงช่องโหว่ด้านความปลอดภัยในซอฟต์แวร์หรือฮาร์ดแวร์ที่ผู้พัฒนา ยังไม่รู้ตัวหรือยังไม่มีแพตช์แก้ไข อยู่ที่ไหนบ้าง ก็จะใช้ข้อมูลอย่าง
X-Powered-By ในการหาเป้าหมาย ถ้าซ่อนเอาไว้ ก็จะพ้นจากตำบลกระสุนตกไปได้
- ภาพลักษณ์ของความเป็นมืออาชีพ (Professionalism)
- การปล่อยให้ระบบโชว์เทคโนโลยีเบื้องหลังอย่างละเอียดถี่ถ้วน เป็นสัญญาณหนึ่งที่บอกว่า Server นี้อาจไม่ได้ถูกปรับแต่ง (Harden) มาอย่างดีพอ
- ในมุมมองของนักตรวจสอบความปลอดภัย (Security Auditor) การปิด Header ที่ไม่จำเป็นถือเป็นมาตรฐานพื้นฐาน (Best Practice) ในการตั้งค่าระบบให้ปลอดภัยตามมาตรฐานสากล
- ประหยัด Bandwidth (นิดหน่อย)
- ถึงจะเป็นแค่บรรทัดเดียว แต่ถ้าเว็บมันเป็นเว็บใหญ่ มีแสนรีเควส (Request) ต่อวัน มันก็ประหยัดเน็ตไปได้เป็นล้านไบต์
วิธีปิดอย่างถูกต้องใน php.ini
- ค้นหา 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
- ค้นหาใน 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
- แก้ค่า expose_php จาก On เป็น Off
- reload php ใหม่
sudo systemctl reload php5.8-fpm
หรือ
sudo systemctl restart php5.8-fpm
- reload nginx
sudo systemctl reload nginx
การทดสอบ
- เปิดเว็บอย่าง https://pitt.plusmagi.com
- กด F12 หรือคลิกขวาแล้วเลือก inspect
- ไปที่ tab Network
- คลิกที่ Doc
- กด reload page
- คลิกดูซักไฟล์
- คลิกเท็บ Headers
- ใน Response Headers ไม่ควรจะมี
X-Powered-By: PHP/
ถ้าทำทุกอย่างแล้วยังมี X-Powered-By: PHP/ ทั้ง ๆ ที่แก้ครบแล้ว อาจจะเป็นที่ CDN อย่าง Cloudflare หรือ proxy จำเอาไว้ ให้ลอง clear cache ดู