Không có cái gọi là giá trị "an toàn" hoặc "không an toàn" như vậy. Chỉ có các giá trị mà máy chủ kiểm soát và các giá trị mà người dùng kiểm soát và bạn cần biết giá trị đến từ đâu và do đó liệu nó có thể được tin cậy cho một mục đích nhất định hay không. $_SERVER['HTTP_FOOBAR']
ví dụ: hoàn toàn an toàn để lưu trữ trong cơ sở dữ liệu, nhưng tôi chắc chắn sẽ không eval
.
Như vậy, hãy chia các giá trị đó thành ba loại:
Máy chủ kiểm soát
Các biến này được thiết lập bởi môi trường máy chủ và phụ thuộc hoàn toàn vào cấu hình máy chủ.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Máy chủ được kiểm soát một phần
Các biến này phụ thuộc vào yêu cầu cụ thể mà khách hàng đã gửi, nhưng chỉ có thể nhận một số giá trị hợp lệ giới hạn, vì tất cả các giá trị không hợp lệ sẽ bị máy chủ web từ chối và không khiến lệnh bắt đầu của tập lệnh. Do đó chúng có thể được coi là đáng tin cậy .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Các REMOTE_
giá trị được đảm bảo là địa chỉ hợp lệ của ứng dụng khách, như được xác minh bằng bắt tay TCP / IP. Đây là địa chỉ mà mọi phản hồi sẽ được gửi đến. REMOTE_HOST
Tuy nhiên, dựa vào tra cứu DNS ngược và do đó có thể bị giả mạo bởi các cuộc tấn công DNS vào máy chủ của bạn (trong trường hợp đó, bạn vẫn gặp sự cố lớn hơn). Giá trị này có thể là một proxy, đây là một thực tế đơn giản của giao thức TCP / IP và bạn không thể làm gì cả.
† Nếu máy chủ web của bạn phản hồi bất kỳ yêu cầu nào bất kể HOST
tiêu đề, điều này cũng nên được coi là không an toàn. Xem $ _SERVER [“HTTP_HOST”] an toàn như thế nào? .
Cũng xem http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Xem 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
Các giá trị do người dùng kiểm soát hoàn toàn tùy ý
Các giá trị này hoàn toàn không được kiểm tra và không phụ thuộc vào bất kỳ cấu hình máy chủ nào, chúng hoàn toàn là thông tin tùy ý do máy khách gửi.
'argv'
, 'argc'
(chỉ áp dụng cho lệnh gọi CLI, thường không phải là mối quan tâm đối với máy chủ web)
'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'
(có thể chứa dữ liệu bị ô nhiễm)
'PHP_SELF'
(có thể chứa dữ liệu bị ô nhiễm)
'PATH_TRANSLATED'
- bất kỳ
'HTTP_'
giá trị nào khác
§ Có thể được coi là đáng tin cậy miễn là máy chủ web chỉ cho phép một số phương thức yêu cầu nhất định.
‖ Có thể được coi là đáng tin cậy nếu quá trình xác thực được xử lý hoàn toàn bởi máy chủ web.
Siêu cầu $_SERVER
cũng bao gồm một số biến môi trường. Những điều này có "an toàn" hay không phụ thuộc vào cách (và vị trí) chúng được xác định. Chúng có thể bao gồm từ hoàn toàn do máy chủ kiểm soát đến hoàn toàn do người dùng kiểm soát.