ไม่มีค่าที่เรียกว่า "ปลอดภัย" หรือ "ไม่ปลอดภัย" เช่นนี้ มีเพียงค่าที่เซิร์ฟเวอร์ควบคุมและค่าที่ผู้ใช้ควบคุมและคุณจำเป็นต้องทราบว่าค่านั้นมาจากไหนและด้วยเหตุนี้จึงสามารถเชื่อถือได้สำหรับวัตถุประสงค์บางอย่างหรือไม่ $_SERVER['HTTP_FOOBAR']
ตัวอย่างเช่นปลอดภัยอย่างยิ่งที่จะจัดเก็บในฐานข้อมูล แต่แน่นอนว่าฉันจะไม่eval
ทำเช่นนั้น
ดังนั้นเรามาแบ่งค่าเหล่านี้ออกเป็นสามประเภท:
ควบคุมเซิร์ฟเวอร์
ตัวแปรเหล่านี้ถูกกำหนดโดยสภาพแวดล้อมของเซิร์ฟเวอร์และขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ทั้งหมด
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
ควบคุมเซิร์ฟเวอร์บางส่วน
ตัวแปรเหล่านี้ขึ้นอยู่กับคำขอเฉพาะที่ไคลเอ็นต์ส่ง แต่สามารถรับค่าที่ถูกต้องได้ในจำนวน จำกัด เนื่องจากเว็บเซิร์ฟเวอร์ควรปฏิเสธค่าที่ไม่ถูกต้องทั้งหมดและไม่ทำให้การเรียกใช้สคริปต์เริ่มต้นด้วย ดังนั้นจึงถือได้ว่าเชื่อถือได้
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* REMOTE_
ค่านี้รับประกันว่าเป็นที่อยู่ที่ถูกต้องของไคลเอนต์ซึ่งตรวจสอบโดยการจับมือ TCP / IP นี่คือที่อยู่ที่จะส่งคำตอบไปที่REMOTE_HOST
ต้องอาศัยการค้นหา DNS แบบย้อนกลับและอาจถูกปลอมแปลงโดยการโจมตี DNS กับเซิร์ฟเวอร์ของคุณ (ซึ่งในกรณีนี้คุณจะมีปัญหาใหญ่กว่า) ค่านี้อาจเป็นพร็อกซีซึ่งเป็นความจริงง่ายๆของโปรโตคอล TCP / IP และคุณไม่สามารถทำอะไรได้เลย
†หากเว็บเซิร์ฟเวอร์ของคุณตอบสนองต่อคำขอใด ๆโดยไม่คำนึงถึงHOST
ส่วนหัวสิ่งนี้ควรได้รับการพิจารณาว่าไม่ปลอดภัยเช่นกัน ดู$ _SERVER [“ HTTP_HOST”] ปลอดภัยแค่ไหน? .
โปรดดูที่http://shiflett.org/blog/2006/mar/server-name-versus-http-host http://shiflett.org/blog/2006/mar/server-name-versus-http-host
‡ดูhttps://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http://httpd.apache org / docs / 2.4 / mod / core.html # comment_999
ค่าที่ผู้ใช้ควบคุมโดยพลการทั้งหมด
ค่าเหล่านี้ไม่ได้รับการตรวจสอบเลยและไม่ขึ้นอยู่กับการกำหนดค่าเซิร์ฟเวอร์ใด ๆ ค่าเหล่านี้เป็นข้อมูลที่ลูกค้าส่งมาโดยพลการ
'argv'
, 'argc'
(ใช้ได้กับการเรียก CLI เท่านั้นโดยปกติแล้วจะไม่เป็นปัญหาสำหรับเว็บเซิร์ฟเวอร์)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖
'PHP_AUTH_DIGEST'
‖
'PHP_AUTH_USER'
‖
'PHP_AUTH_PW'
‖
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(อาจมีข้อมูลที่ปนเปื้อน)
'PHP_SELF'
(อาจมีข้อมูลที่ปนเปื้อน)
'PATH_TRANSLATED'
'HTTP_'
ค่าอื่น ๆ
§อาจได้รับการพิจารณาว่าเชื่อถือได้ตราบเท่าที่เว็บเซิร์ฟเวอร์อนุญาตเฉพาะวิธีการร้องขอบางวิธีเท่านั้น
‖อาจถือว่าเชื่อถือได้หากการตรวจสอบถูกจัดการโดยเว็บเซิร์ฟเวอร์ทั้งหมด
superglobal $_SERVER
ยังรวมถึงตัวแปรสภาพแวดล้อมต่างๆ สิ่งเหล่านี้ "ปลอดภัย" หรือไม่ขึ้นอยู่กับวิธีการกำหนด (และที่ใด) สามารถมีตั้งแต่เซิร์ฟเวอร์ที่ควบคุมอย่างสมบูรณ์ไปจนถึงควบคุมโดยผู้ใช้ทั้งหมด