Cách an toàn duy nhất để làm điều này
Tất cả các câu trả lời khác trên trang này đều có ý nghĩa bảo mật mà bạn cần phải biết.
Phương pháp bảo mật an toàn duy nhất để truy xuất tên miền hiện tại
là để 𝓼𝓽𝓸𝓻𝓮 𝓲𝓽.
Hầu hết các khung làm việc lưu trữ tên miền cho bạn, vì vậy bạn sẽ muốn tham khảo tài liệu cho khung cụ thể của mình. Nếu bạn không sử dụng khung, hãy xem xét việc lưu trữ tên miền ở một trong những nơi sau:
+ ------------------------------------------------- --- + ----------------------------------- +
| Phương pháp lưu trữ an toàn tên miền | Được sử dụng bởi |
+ ------------------------------------------------- --- + ----------------------------------- +
| Một tập tin cấu hình | Joomla, Drupal / Symfony |
| Cơ sở dữ liệu | WordPress |
| Một biến môi trường | Ấu trùng |
| Đăng ký dịch vụ | Kubernetes DNS |
+ ------------------------------------------------- --- + ----------------------------------- +
Bạn có thể sử dụng những điều sau đây ... nhưng chúng không an toàn
Tin tặc có thể làm cho các biến này xuất ra bất cứ tên miền nào chúng muốn. Điều này có thể dẫn đến ngộ độc bộ nhớ cache và các cuộc tấn công lừa đảo hầu như không đáng chú ý.
$_SERVER['HTTP_HOST']
Điều này nhận được tên miền từ các tiêu đề yêu cầu được mở để thao túng bởi tin tặc . Giống với:
$_SERVER['SERVER_NAME']
Điều này có thể được thực hiện tốt hơn nếu thiết lập Apache usecanonicalname bị tắt; trong trường hợp đó $_SERVER['SERVER_NAME']
sẽ không còn được phép cư trú với các giá trị tùy ý và sẽ được bảo mật. Tuy nhiên, đây không phải là mặc định và không phổ biến trong thiết lập.
Trong các hệ thống phổ biến
Dưới đây là cách bạn có thể nhận được tên miền hiện tại trong các khung / hệ thống sau:
WordPress
$urlparts = parse_url(home_url());
$domain = $urlparts['host'];
Nếu bạn đang xây dựng một URL trong WordPress, chỉ cần sử dụng home_url hoặc site_url hoặc bất kỳ chức năng URL nào khác .
Ấu trùng
request()->getHost()
Các request()->getHost
chức năng được thừa hưởng từ Symfony, và đã được an toàn kể từ năm 2013 CVE-2013-4752 đã được vá.
Drupal
Trình cài đặt chưa quan tâm đến việc bảo mật này ( vấn đề # 2404259 ). Nhưng trong Drupal 8 có tài liệu bạn có thể theo dõi tại Cài đặt máy chủ đáng tin cậy để bảo mật cài đặt Drupal của bạn sau đó có thể sử dụng các mục sau:
\Drupal::request()->getHost();
Các khung khác
Vui lòng chỉnh sửa câu trả lời này để bao gồm cách lấy tên miền hiện tại trong khung yêu thích của bạn. Khi làm như vậy, vui lòng bao gồm một liên kết đến mã nguồn có liên quan hoặc bất kỳ điều gì khác có thể giúp tôi xác minh rằng khung đang thực hiện mọi thứ một cách an toàn.
Phụ lục
Ví dụ khai thác:
Ngộ độc bộ nhớ cache có thể xảy ra nếu botnet liên tục yêu cầu một trang sử dụng tiêu đề máy chủ sai. HTML kết quả sau đó sẽ bao gồm các liên kết đến trang web của kẻ tấn công nơi họ có thể lừa đảo người dùng của bạn. Lúc đầu, các liên kết độc hại sẽ chỉ được gửi lại cho tin tặc, nhưng nếu tin tặc thực hiện đủ yêu cầu, phiên bản độc hại của trang sẽ kết thúc trong bộ đệm của bạn, nơi nó sẽ được phân phối cho người dùng khác.
Một cuộc tấn công lừa đảo có thể xảy ra nếu bạn lưu trữ các liên kết trong cơ sở dữ liệu dựa trên tiêu đề máy chủ. Ví dụ: giả sử bạn lưu trữ URL tuyệt đối vào hồ sơ của người dùng trên diễn đàn. Bằng cách sử dụng tiêu đề sai, tin tặc có thể khiến bất cứ ai nhấp vào liên kết hồ sơ của họ được gửi một trang web lừa đảo.
Ngộ độc đặt lại mật khẩu có thể xảy ra nếu tin tặc sử dụng tiêu đề máy chủ độc hại khi điền vào biểu mẫu đặt lại mật khẩu cho một người dùng khác. Người dùng đó sau đó sẽ nhận được email chứa liên kết đặt lại mật khẩu dẫn đến trang web lừa đảo.
Dưới đây là một số ví dụ độc hại
Hãy cẩn thận và ghi chú:
- Khi tắt usecanonicalname ,
$_SERVER['SERVER_NAME']
được điền cùng tiêu đề$_SERVER['HTTP_HOST']
sẽ sử dụng mọi cách (cộng với cổng). Đây là thiết lập mặc định của Apache. Nếu bạn hoặc người hâm mộ bật cái này lên thì bạn vẫn ổn - ish - nhưng bạn có thực sự muốn dựa vào một nhóm riêng biệt hay chính bạn trong ba năm tới, để giữ cho cấu hình không phải là cấu hình nhỏ ở mức không -giá trị mặc định? Mặc dù điều này làm cho mọi thứ an toàn, tôi sẽ thận trọng không dựa vào thiết lập này.
- Tuy nhiên, Redhat không bật usecanonical theo mặc định [ nguồn ].
- Nếu serverAlias được sử dụng trong mục nhập máy chủ ảo và tên miền bí danh được yêu cầu,
$_SERVER['SERVER_NAME']
sẽ không trả về tên miền hiện tại, nhưng sẽ trả về giá trị của lệnh serverName.
- Nếu tên máy chủ không thể được giải quyết, lệnh tên máy chủ của hệ điều hành được sử dụng ở vị trí [nguồn] .
- Nếu tiêu đề máy chủ bị bỏ qua, máy chủ sẽ hoạt động như thể thông thường là trên [nguồn] .
- Cuối cùng, tôi chỉ thử khai thác điều này trên máy chủ cục bộ của mình và không thể giả mạo tiêu đề máy chủ. Tôi không chắc có bản cập nhật nào cho Apache giải quyết vấn đề này không, hoặc nếu tôi đang làm gì đó sai. Bất kể, tiêu đề này vẫn có thể khai thác được trong các môi trường không sử dụng máy chủ ảo.
Little Rant:
Câu hỏi này đã nhận được hàng trăm ngàn lượt xem mà không có một đề cập nào về các vấn đề bảo mật trong tầm tay! Không nên theo cách này, nhưng chỉ vì câu trả lời Stack Overflow là phổ biến, điều đó không có nghĩa là nó an toàn.