Có an toàn không khi sử dụng $_SERVER['HTTP_HOST']
cho tất cả các liên kết trên một trang web mà không phải lo lắng về các cuộc tấn công XSS, ngay cả khi được sử dụng trong các biểu mẫu?
Có, nó an toàn để sử dụng $_SERVER['HTTP_HOST']
, (và thậm chí $_GET
và $_POST
) miễn là bạn xác minh chúng trước khi chấp nhận chúng. Đây là những gì tôi làm cho các máy chủ sản xuất an toàn:
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
$reject_request = true;
if(array_key_exists('HTTP_HOST', $_SERVER)){
$host_name = $_SERVER['HTTP_HOST'];
// [ need to cater for `host:port` since some "buggy" SAPI(s) have been known to return the port too, see http://goo.gl/bFrbCO
$strpos = strpos($host_name, ':');
if($strpos !== false){
$host_name = substr($host_name, $strpos);
}
// ]
// [ for dynamic verification, replace this chunk with db/file/curl queries
$reject_request = !array_key_exists($host_name, array(
'a.com' => null,
'a.a.com' => null,
'b.com' => null,
'b.b.com' => null
));
// ]
}
if($reject_request){
// log errors
// display errors (optional)
exit;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
echo 'Hello World!';
// ...
Ưu điểm $_SERVER['HTTP_HOST']
là hành vi của nó được xác định rõ hơn $_SERVER['SERVER_NAME']
. Ngược ➫➫ :
Nội dung của Máy chủ: tiêu đề từ yêu cầu hiện tại, nếu có.
với:
Tên của máy chủ lưu trữ theo đó tập lệnh hiện tại đang thực thi.
Sử dụng một giao diện được xác định tốt hơn như $_SERVER['HTTP_HOST']
có nghĩa là nhiều SAPI sẽ triển khai nó bằng cách sử dụng hành vi được xác định rõ ràng đáng tin cậy . (Không giống như cái khác .) Tuy nhiên, nó vẫn hoàn toàn phụ thuộc vào SAPI ➫➫ :
Không có gì đảm bảo rằng mọi máy chủ web sẽ cung cấp bất kỳ [ $_SERVER
mục] nào; máy chủ có thể bỏ qua một số hoặc cung cấp những cái khác không được liệt kê ở đây.
Để hiểu cách lấy đúng tên máy chủ, trước hết, bạn cần hiểu rằng một máy chủ chỉ chứa mã không có phương tiện để biết (điều kiện tiên quyết để xác minh) tên riêng của nó trên mạng. Nó cần phải giao diện với một thành phần cung cấp cho nó tên riêng của nó. Điều này có thể được thực hiện thông qua:
Thông thường nó được thực hiện thông qua tập tin cấu hình cục bộ (SAPI). Lưu ý rằng bạn đã cấu hình nó một cách chính xác, ví dụ như trong Apache ➫➫ :
Một vài điều cần phải được 'làm giả' để làm cho máy chủ ảo động trông giống như một máy chủ bình thường.
Điều quan trọng nhất là tên máy chủ được Apache sử dụng để tạo các URL tự tham chiếu, v.v. Nó được cấu hình bằng lệnh ServerName
và nó có sẵn cho CGI thông qua SERVER_NAME
biến môi trường.
Giá trị thực được sử dụng trong thời gian chạy được kiểm soát bởi cài đặt UseCanonicalName.
Với UseCanonicalName Off
tên máy chủ xuất phát từ nội dung của Host:
tiêu đề trong yêu cầu. Với UseCanonicalName DNS
nó đến từ một tra cứu DNS ngược của địa chỉ IP của máy chủ ảo. Cài đặt trước được sử dụng cho lưu trữ ảo động dựa trên tên và cài đặt sau được sử dụng cho ** lưu trữ dựa trên IP.
Nếu Apache không thể tìm ra tên máy chủ vì không có Host:
tiêu đề hoặc tra cứu DNS không thành công thì giá trị được cấu hình ServerName
sẽ được sử dụng thay thế.