Việc kiểm tra mod_write có thực sự cần thiết không?


7

Gần đây tôi nhận thấy rằng nhiều người đăng .htaccesscác tập tin ở đây với:

<IfModule mod_rewrite.c>

Đôi khi điều này thậm chí xuất hiện nhiều lần trong tập tin! Nó rõ ràng kiểm tra xem mod_writetrên thực tế có được kích hoạt hay không nhưng các tuyên bố mà nó bảo vệ là không cần thiết đối với các trang web đó. Vì vậy, nếu IfModulethất bại, trang web bị hỏng dù sao.

Có một lợi thế trong việc <IfModule mod_rewrite.c>thất bại hơn là những RewriteRuletuyên bố dưới đây không?

mod_writebây giờ rất cần thiết và có mặt khắp nơi mà tôi không kiểm tra nó nữa. Điều này có thể gây ra một lỗ hổng của một số loại?

Câu trả lời:


6

Không, hầu hết thời gian, việc kiểm tra mod_rewrite là không cần thiết. Trong thực tế, thường là tốt hơn để loại bỏ kiểm tra này.

Nếu các chỉ thị mod_rewrite được yêu cầu bởi trang web của bạn thì bạn không nên bọc chúng trong một <IfModule mod_rewrite.c>thùng chứa. Bởi vì nếu họ đang cần và mod_rewrite không có sẵn thì chỉ đơn giản là thất bại âm thầm và trang web của bạn vẫn tiếp tục phá vỡ trong một số cách khác (mặt nạ nguyên nhân cơ bản) và có thể phơi bày một cái gì đó bạn không mong muốn. Nếu không có <IfModule>trình bao bọc thì trang web sẽ bị hỏng ngay lập tức (và hoàn toàn) với một lỗi dễ nhận biết và không có gì bất ngờ được phơi bày.

Lần duy nhất khi <IfModule mod_rewrite.c>sử dụng trình bao bọc là:

  1. Trang web được thiết kế để hoạt động có hoặc không có mod_rewrite. Đây là trường hợp với WordPress. Nếu không có mod_rewrite, trang web vẫn "hoạt động", bạn sẽ không nhận được các URL "đẹp".

Hoặc là

  1. Bạn có các lệnh từ một mô-đun khác phụ thuộc vào mod_rewrite đã thực hiện thành công. Vì vậy, trong trường hợp này, bạn sẽ bọc các chỉ thị khác trong một <IfModule mod_rewrite.c>gói. Ví dụ: đặt tiêu đề phản hồi HTTP (với mod_headers) dựa trên một số thuộc tính của yêu cầu mà bạn đã xác định bằng mod_rewrite. Trong trường hợp này, bạn có thể gói lệnh Headerstrong một <IfModule mod_rewrite.c>container.

Hầu hết thời gian, nếu bạn biết máy chủ của mình, thì bạn không cần <IfModule mod_rewrite.c>kiểm tra - vì bạn đã biết liệu mod_rewrite có được bật hay không. Lần duy nhất khi bạn cần là nếu bạn đang viết mã di động để làm việc trên nhiều máy chủ và điều kiện # 1 và / hoặc # 2 ở trên được đáp ứng.

Đôi khi điều này thậm chí xuất hiện nhiều lần trong tập tin!

Và hầu hết thời gian này là hoàn toàn không cần thiết. Tuy nhiên, để bảo vệ hành vi này, điều này thường xảy ra khi bạn có các plugin khác nhau .htaccesstự động chỉnh sửa và độc lập. Điều này cũng đúng cho nhiều RewriteEngineRewriteBasechỉ thị.

Đối với mã viết tay, bạn sẽ không bao giờ thấy điều này. Đối với mã viết tay, điều này thường xảy ra thông qua sao chép / dán vô tâm (điều không may dường như xảy ra rất nhiều với các .htaccesschỉ thị).

Có một lợi thế trong việc <IfModule mod_rewrite.c>thất bại thay vì các câu lệnh RewriteRule bên dưới nó không?

Chỉ trong trường hợp # 1 hoặc # 2 ở trên. Hầu hết thời gian, không.

mod_write bây giờ rất cần thiết và có mặt khắp nơi mà tôi không kiểm tra nó nữa. Điều này có thể gây ra một lỗ hổng của một số loại?

Nếu nó cần thiết cho trang web của bạn thì không cần phải kiểm tra nó. Không có lỗ hổng.

Trên thực tế, điều ngược lại thậm chí có thể đúng ... nếu các chỉ thị mod_rewrite là thiết yếu thì việc kiểm tra sự hiện diện của mod_rewrite thậm chí có thể gây ra cho bạn nhiều vấn đề hơn nếu mod_rewrite đột nhiên không khả dụng vì bất kỳ lý do gì. Như đã đề cập ở trên, các lệnh mod_rewrite của bạn bây giờ sẽ âm thầm thất bại (nhấn mạnh "im lặng" - không có lỗi), nhưng trang web vẫn có thể tiếp tục hoạt động mà không có lỗi máy chủ được kích hoạt nhưng trả lại vô nghĩa cho người dùng (và bot công cụ tìm kiếm) với 200 Tình trạng OK. Nếu <IfModule>trình bao bọc bị bỏ qua thì bạn sẽ được thông báo ngay lập tức về vấn đề. Tuy nhiên, nếu lỗi này bị tắt tiếng thì có thể mất một thời gian trước khi sự cố được phát hiện, đến lúc đó, thiệt hại nghiêm trọng hơn có thể đã được thực hiện.


1

Nó chủ yếu được sử dụng bởi Hệ thống quản lý nội dung như WordPress, vì chúng có thể hoạt động với PHP viết lại hoặc mod_rewrite , nếu mod_rewrite không được hỗ trợ và bạn không sử dụng IfModule thì một số trang web sẽ dẫn đến lỗi 500 .

Mọi cài đặt của WordPress sẽ cố gắng sử dụng .htaccess và trong quá trình nâng cấp lớn, nó có thể kích hoạt kiểm tra xem mã này có tồn tại không:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Đôi khi tôi đã chứng kiến ​​WordPress thêm mã LẠI nếu mã của họ đã bị sửa đổi. Đây là lý do tại sao người dùng WordPress nói chung sẽ để mã đó không thay đổi hoặc sử dụng chmod để ngăn WordPress thêm vào nó, thực sự là một ý tưởng tốt từ quan điểm bảo mật để đặt .htaccess của bạn thành 0444 .

Đây là lý do tại sao tôi quyết định để nó một mình khi trả lời một trong những câu hỏi của tôi liên quan đến WordPress HTTP sang HTTPS mà không có dấu gạch chéo dẫn đến chuyển hướng kép

Tóm lược

Sử dụng <IfModule mod_rewrite.c>hay không sẽ không tạo ra bất kỳ sự khác biệt có thể đo lường nào về hiệu suất cho trang web thông thường, nếu bạn có thể loại bỏ nó thì bằng mọi cách, nó sẽ không tạo ra sự khác biệt nếu bạn làm hay không, chỉ cần cuộn với những gì hoạt động tốt nhất cho thiết lập của bạn.

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.