Phần tải trước của HSTS trên .htaccess


7

Gần đây khi đã chuyển một trang web sang SSL, tôi đã xem xét việc thực thi HSTS để tải trước cuối cùng. Cú pháp được phê duyệt và Danh sách Chrome cho phép nó ổn. Tuy nhiên, không phải là một lập trình viên, một vấn đề nhỏ phát sinh.

Tôi có:

php_value upload_tmp_dir "/tmp"

# Force SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Redirect to www
RewriteCond %{HTTP_HOST} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

# End Force SSL'

Điều này có vẻ ổn, nhưng một số trang web trên web --- Tôi sẽ không làm phiền điều này với trích dẫn --- khuyên RewriteCond %{HTTPS} offvà những người khác thì cóRewriteCond %{HTTPS} on

Về mặt logic có vẻ đúng, nhưng tôi cần biết điều gì là đúng. Không đưa ra lỗi.

Câu trả lời:


3

... khuyên RewriteCond %{HTTPS} offvà những người khác cóRewriteCond %{HTTPS} on

Điều đó sẽ không có ý nghĩa trong bối cảnh được đưa ra vì đây rõ ràng là những điều đối lập (tôi sẽ thấy thú vị khi xem các ví dụ đầy đủ mà bạn đang trích dẫn từ đây).

Tuy nhiên, có lẽ bạn có ý offvs !on? Đây là tương đương trong bối cảnh này. Các !tiền tố phủ nhận regex, do đó hiệu quả có nghĩa không "on" (tức. Nó phải là "off").

Vì vậy, trong ngữ cảnh của các chỉ thị của bạn ở trên, nơi bạn đang kiểm tra xem HTTPS không hoạt động hay không, thì những điều sau đây là tương đương:

# Does the HTTPS server variable contain "off"?
RewriteCond %{HTTPS} off

# Does the HTTPS server variable not contain "on"?
RewriteCond %{HTTPS} !on

Biến máy chủ HTTPS được đặt thành "bật" hoặc "tắt". (Hoặc, nó hoàn toàn không được thiết lập - nhưng điều đó phụ thuộc vào thiết lập máy chủ / SSL của bạn và bạn sẽ phát hiện ra điều đó ngay bây giờ.)

Mà bạn sử dụng thực sự chỉ là một vấn đề ưu tiên.


Các ghi chú khác về HSTS và .htaccess

# Redirect to www
RewriteCond %{HTTP_HOST} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

(Tôi cho rằng phần thêm .comvào ^example.com\.comchỉ là một lỗi đánh máy? Điều đó chỉ nên ^example\.com.)

E=HTTPS- Việc cài đặt biến môi trường HTTPS trên RewriteRule chuyển hướng dường như được yêu cầu để đặt Strict-Transport-Securitytiêu đề phản hồi HTTP trên chuyển hướng chính tắc (chỉ HTTPS) không chuyển hướng www sang www [* 1] (tức là https://example.comsang https://www.example.com), được đặt theo điều kiện dựa trên env=HTTPSkiểm tra Headerchỉ thị Tuy nhiên, để tiêu đề này được đặt trên chuyển hướng , bạn cũng cần sử dụng alwaystừ khóa trên Headerchỉ thị, như vậy:

Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Như đã lưu ý trong các tài liệu Apache , liên quan đến việc sử dụng alwayslệnh Headernày khi đặt tiêu đề trên các chuyển hướng :

  • Bạn đang thêm tiêu đề vào phản hồi không thành công (không phải 2xx) được tạo cục bộ, chẳng hạn như chuyển hướng, trong trường hợp đó chỉ có bảng tương ứng alwaysđược sử dụng trong phản hồi cuối cùng.

[* 1] Tiêu đề này phải được đặt trên chuyển hướng để đáp ứng điểm 4.1 của các yêu cầu gửi tải trước HSTS :

Nếu bạn đang phục vụ một chuyển hướng bổ sung từ trang web HTTPS của mình, chuyển hướng đó vẫn phải có tiêu đề HSTS (chứ không phải là trang mà nó chuyển hướng đến).


Chỉ cần một nhận xét bổ sung về bài viết được liên kết trong các bình luận bên dưới, nói rằng:

Biến env=HTTPSmôi trường không hoạt động như mong đợi. Vì vậy, tôi đã sử dụng E=HTTPScờ trên chuyển hướng www để đặt env=HTTPSbiến môi trường cho yêu cầu tiếp theo .

Bit cuối cùng về việc thiết lập " env=HTTPSbiến môi trường cho yêu cầu tiếp theo" không hoàn toàn chính xác. Đó là thiết lập HTTPSbiến môi trường trên phản hồi (chuyển hướng) hiện tại . Vào thời điểm "yêu cầu tiếp theo" xuất hiện (tức là trình duyệt đã phản hồi chuyển hướng), biến môi trường này (đã được đặt ở trên) đã bị lãng quên từ lâu. nhưng điều này không yêu cầu alwaystừ khóa được sử dụng trong Headerchỉ thị (như đã đề cập ở trên).


Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Chỉ là một điểm nhỏ, và có lẽ điều này không thực sự quan trọng, nhưng ... tôi sẽ bao gồm preloadchỉ thị ở cuối danh sách các chỉ thị. Ví dụ:

 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS

Lệnh preloadnày không thực sự là một phần của đặc tả kỹ thuật bảo mật giao thông nghiêm ngặt HTTP (HSTS) . Nó chỉ được yêu cầu bởi danh sách tải trước. Các tác nhân / trình duyệt khác không sử dụng cái này và thậm chí có thể không hiểu điều này, vì vậy sẽ hợp lý hơn nếu đặt cái này ở cuối danh sách. Một số phân tích có thể dừng ngay khi chúng đạt được chỉ thị "không hợp lệ"?



Xin lỗi, nhấn enter chỉ đóng bình luận.
Claverhouse

1
E = HTTPS đến từ đây theo như tôi nhớ --- Tôi đã xem xét rất nhiều ví dụ tẻ nhạt! --- forum.cpanel.net/threads/htaccess-header-set-doesnt-set.613111
Claverhouse

@Claverhouse Cảm ơn các liên kết. Ngẫu nhiên, !=oncó hiệu quả tương tự như !ontrong bối cảnh này (kết quả là giống nhau ở đây). Tuy nhiên, có một sự khác biệt. Các =tiền tố làm cho nó một chuỗi so sánh chính xác, trong khi không có =, đó là một regex và do đó kiểm tra cho "trên" bất cứ nơi nào bên trong TestString . Nó chỉ có thể là "bật" hoặc "tắt", vì vậy kết quả là như nhau. Rất thú vị về việc sử dụng E=HTTPStrên chuyển hướng - nhận xét ban đầu của tôi trên đó là sai. Tuy nhiên, bạn sẽ cần thêm alwaystừ khóa vào Headerchỉ thị để nó hoạt động tốt. Tôi đã cập nhật câu trả lời của mình.
MrWhite

Nếu điều này trả lời câu hỏi của bạn thì vui lòng đánh dấu nó là được chấp nhận (đánh dấu bên trái bên dưới mũi tên biểu quyết) để xóa câu hỏi khỏi hàng đợi câu hỏi chưa được trả lời. Bạn cũng có thể upvote câu trả lời bạn thấy hữu ích. Cảm ơn, đánh giá cao :)
MrWhite

0
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Kiểm tra xem HTTPS không bật

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Kiểm tra xem HTTPS có tắt không

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Kiểm tra xem kết nối có chạy KHÔNG trên cổng https an toàn 443 không

Nhưng tất cả đều làm như vậy: kiểm tra nếu không có https và chuyển hướng sang https.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"
</IfModule>

Bạn đã biết những gì nó làm.


Các <IfModule>wrapper là không cần thiết ở đây. Trong thực tế, nếu bạn đang dùng "danh sách tải trước HSTS" thì trình bao bọc sẽ bị xóa vì tiêu đề này là bắt buộc . Bạn cũng đang thiếu env=HTTPSđiều kiện được đề nghị .
MrWhite

IfModuletrình bao bọc là dành cho mục đích kiểm tra, cho dù mô-đun địa chỉ đã được cài đặt chưa. Về env=HTTPStôi không chắc chắn - có một loạt các ví dụ hoạt động có và không có nó.
Evgeniy

"Trình IfModulebao bọc là dành cho mục đích kiểm tra ..." - Vâng, nhưng đó là vấn đề. Nếu mod_headers không được cài đặt thì chỉ đơn giản là không âm thầm và tiêu đề không được đặt. Tiêu đề này phải được đặt để HSTS thành công. Điều này sẽ phá vỡ nếu mod_headers không có sẵn vì tiêu đề này không phải là tùy chọn. Xem câu hỏi liên quan này liên quan đến mod_rewrite (cùng ý tưởng): webmasters.stackexchange.com/questions/112600/
mẹo

Cảm ơn cả hai người. Diễn đàn bây giờ kết hợp các đề xuất của bạn. Ngẫu nhiên (tôi không yêu cầu tư vấn thêm), trên WordPress, phần hackrepair tuyệt vời phải đi đầu tiên trên .htaccess. hackrepair.com/articles/website-security/ Từ Chỉ cần lưu ý, điều tải trước dường như không thích điều đó!
Claverhouse

Đã thêm ở trên dưới dạng nhận xét thay vì đặt sai vị trí. Tình cờ trả lời, tôi đã rời khỏi hackrepair và không bận tâm đến việc tải trước WordPress ...
Claverhouse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.