Thực tiễn bảo mật tốt nhất cho các plugin và chủ đề WordPress là gì? [đóng cửa]


22

Như được đề xuất trong câu hỏi này , tôi đang thêm chủ đề này như một câu hỏi mới, để thảo luận / bỏ phiếu cộng đồng liên quan đến các thực tiễn tốt nhất cho bảo mật Plugin / Theme.

Dưới đây là danh sách kiểm tra bắt đầu, dựa trên danh sách kiểm tra bảo mật dữ liệu / cài đặt hiện tại (đang thực hiện) của tôi được sử dụng để xem xét Chủ đề (các nguyên tắc không khác nhau đối với các Plugin so với Chủ đề).

Nếu bạn muốn kiểm tra một chủ đề với trang cài đặt chủ đề an toàn và được mã hóa vững chắc, hãy xem chủ đề này:
http://wordpress.org/extend/theme/coraline


Nếu ai đó có đặc quyền phù hợp sẽ không ngại biến đây thành wiki cộng đồng?
Chip Bennett

Để có một câu hỏi trong chế độ wiki, một mod cần gắn thẻ câu hỏi một cách thích hợp , tôi đã gắn cờ nó cho sự chú ý của mod, bây giờ chỉ là vấn đề thời gian .. :)
t31os

Điều gì đặc biệt về coraline? Imo vẫn còn nhiều cách để vào. Tôi đề nghị liên kết anons A insted: wordpress.stackexchange.com/questions/13539/
Kẻ

Có thể không có gì đặc biệt về Coraline. Nó đơn giản là thứ mà chúng tôi hiện đang hướng đến các nhà phát triển Chủ đề, khi xem xét Chủ đề, bởi vì đó là ví dụ được đưa ra bởi Justin Tadlock, người đã thực hiện nhiều đánh giá Chủ đề cụ thể về bảo mật ban đầu. Tôi cũng đưa ra Oenology như một ví dụ điển hình, nhưng tôi không muốn bắt gặp khi cố gắng điều chỉnh Chủ đề của riêng mình. :)
Chip Bennett

Câu trả lời:



12

Vệ sinh, xác nhận và thoát dữ liệu

Vệ sinh bất cứ thứ gì có thể vào và ra (!) Cơ sở dữ liệu cả mặt trước và mặt sau!

Plugin và Chủ đề phải thực hiện xác thực dữ liệu phù hợp:

  1. Xác thựcvệ sinh tất cả dữ liệu không đáng tin cậy trước khi nhập dữ liệu vào cơ sở dữ liệu
  2. Thoát tất cả dữ liệu không đáng tin cậy trước khi xuất ra trong các trường mẫu Cài đặt
  3. Thoát tất cả dữ liệu không đáng tin cậy trước khi xuất ra trong tệp mẫu Theme

Plugin và Chủ đề nên sử dụng esc_attr()cho kiểu nhập văn bản và esc_html()hoặc esc_textarea()cho vùng văn bản.

Cũng có sẵn từ WordPress API là esc_url(), esc_url_raw(), esc_js()wp_filter_kses().

Ví dụ xấu:

<?php $url = 'javascript:pwnd()'; ?>
<a href="<?php echo $url; ?>">anchor</a>

Ví dụ tốt:

<a href="<?php echo esc_url($url); ?>">anchor</a>

Dưới đây là một video tuyệt vời của Mark Jaquith giải thích việc sử dụng các chức năng thoát:


3
Vệ sinh trên đường vào, trốn thoát trên đường ra .. :)
t31os

9

Chỉ sử dụng cẩn thận $ _GET / $ _POST / $ _REQUEST và khi không có API tốt hơn

Plugin và Chủ đề nên sử dụng API Cài đặt để nhận và lưu dữ liệu đầu vào của biểu mẫu thay vì dựa vào $_POST$_REQUESTdữ liệu trực tiếp.


3
Luôn coi $ _POST, $ _REQUEST và $ _GET là không an toàn. Vệ sinh và liệt kê các giá trị từ các mảng đó và đặt chúng vào các biến của riêng bạn. Không bao giờ khử trùng các giá trị đến từ người dùng và đưa chúng trở lại $ _POST.
Goldenapples

2
Luôn kiểm tra xem khóa mà bạn cần sử dụng có được đặt trong mảng thích hợp không. Ngay bây giờ () là bạn của bạn :)
mfields

9

Sử dụng $wpdb->prepare

Khi xây dựng các truy vấn tùy chỉnh thông qua $wpdbđối tượng, luôn luôn sử dụng $wpdb->prepaređể điền vào các giá trị thay thế bằng cách viết các truy vấn với dữ liệu trộn với mã SQL, vì các mysql_*hàm gia đình đã dạy sai mọi người.


$wpdb->preparekhông giống như chuẩn bị phát biểu.
hakre

8

Hãy cẩn thận với các hàm PHP có thể được sử dụng để chạy mã độc

Một cách đọc tuyệt vời cho bất kỳ ai viết PHP: Các hàm PHP có thể khai thác trên StackOverflow.

Sử dụng API sửa đổi chủ đề

Chủ đề nên sử dụng set_theme_mod()và các chức năng liên quan không phải là một sơ đồ tên tự phát minh.
API theme_mod là một lớp chuyên biệt cho API cài đặt; nó đảm bảo các tên duy nhất, đẩy tất cả các tùy chọn thành một mảng và - từ kinh nghiệm của tôi - dễ xử lý hơn nhiều. Thêm vào đó, nó cung cấp các bộ lọc được tiêu chuẩn hóa cho các plugin - rất tốt cho khả năng tương tác.

Tránh kích hoạt register_globals

Đừng dựa vào register_globals = on. Một chủ đề Pro mà khách hàng cuối cùng của tôi đã mua chính xác điều này. Tôi có thể hack bất kỳ trang web nào bằng chủ đề này trong 5 phút,
ThimbThumb cũng đã làm điều này (và vẫn còn?).

Không tạo tệp có quyền truy cập rộng không cần thiết

Đừng tạo tập tin với quyền truy cập quá tự do.

Sử dụng SSL khi có sẵn

Trỏ Chia sẻ của bạn trên Twitter / Facebook / Bất cứ điều gì liên kết đến URI HTTPS nếu có. Bảo mật của người đọc của bạn cũng quan trọng.


2
set_theme_mod()Đặc biệt, bạn có thể giải thích cách kết hợp nó với việc sử dụng API Cài đặt đúng cách không?
Chip Bennett

@Chip Bennett Tôi đã thêm một số thông tin vào câu trả lời của tôi.
fuxia

Bạn có thể chia nhỏ danh sách nhỏ này trong các câu trả lời cụ thể nhỏ hơn không? Dễ dàng hơn để quản lý wiki cộng đồng trong các phần nhỏ hơn. TIA
Rarst

3
Chip: Hệ thống mod Theme không tích hợp quá tốt với API Cài đặt. Tôi sẽ viết một bài giải thích làm thế nào để làm điều đó ngay sau đó.
Otto

7

Lưu dữ liệu trong một mảng

Plugin và Chủ đề nên lưu các tùy chọn trong một mảng, thay vì tạo nhiều tùy chọn cho trang cài đặt. Việc sử dụng API Cài đặt sẽ xử lý việc này.


6

Kiểm tra khả năng phù hợp khi thêm và xuất các trang cài đặt

Các plugin nên sử dụng một khả năng thích hợp (ví dụ manage_options) cho khả năng thêm trang cài đặt.

Chủ đề nên sử dụng edit_theme_optionsnhư khả năng thích hợp để thêm trang cài đặt.


1
Lưu ý nhỏ nhưng quan trọng: Bạn không thể sử dụng edit_theme_optionsvới API cài đặt, việc gửi tùy chọn được mã hóa cứng để yêu cầu manage_optionsgửi bản cập nhật. Vé Trac liên quan có thể được tìm thấy ở đây .
t31os

Đúng, nhưng 1) sẽ chỉ tác động đến các Biên tập viên, không phải Quản trị viên; và 2) hy vọng điều đó sẽ sớm được giải quyết, thông qua vé Trac được liên kết.
Chip Bennett

Luôn có khả năng vai trò tùy chỉnh hoặc vai trò thông thường được trao cho edit_theme_optionsgiới hạn, tôi nghĩ rằng có thể hữu ích khi chỉ ra rằng API cài đặt ở trạng thái hiện tại chỉ có thể sử dụng được bởi các vai trò có manage_optionskhả năng.
t31os

5

Sử dụng thông tin và hướng dẫn cập nhật

Các plugin & Chủ đề nên triển khai cả các trang Tùy chọn và Cài đặt một cách có chủ ý và không dựa vào các hướng dẫn trang web sao chép và dán lỗi thời và không bao gồm bảo mật dữ liệu phù hợp, như các trang được liệt kê bên dưới.

Ví dụ về những điều không nên làm :


1
Tôi đã thêm một chút văn bản nhấn mạnh để chỉ ra các liên kết là ví dụ về những việc không nên làm, vì nó dễ dàng lướt qua thông tin và nhấp vào các liên kết mà không cần đọc đoạn văn có trước chúng. Cũng làm cho câu trả lời đẹp hơn một chút trong khi tôi ở đó ...;)
t31os

2
Điều này có thể sử dụng một chút giải thích chính xác những gì hướng dẫn ví dụ đang làm sai và / hoặc cũ.
Rarst

4

Sử dụng API cài đặt

Plugin và Chủ đề nên sử dụng API Cài đặt, dễ sử dụng hơn, an toàn hơn và chăm sóc rất nhiều công việc khó khăn của các trang cài đặt:

Để có hướng dẫn tốt về cách sử dụng API Cài đặt, hãy xem:


Xem nhận xét của tôi về câu trả lời này liên quan đến các tùy chọn API và chủ đề cài đặt.
t31os

1

Đối với các hộp kiểm và chọn tùy chọn, Plugin và Chủ đề nên sử dụng checked()và các selected()chức năng để xuất ra checked="checked"selected="selected", tương ứng.


Không thực sự là một điều an ninh, trừ khi tôi đang thiếu một cái gì đó. Vẫn rất thuận tiện và tốt để sử dụng. :)
Rarst

Vâng, có lẽ và có lẽ không. Tôi đã thấy RẤT NHIỀU mã tùy chỉnh để thực hiện điều tương tự. Spaghetti mã nhiều hơn = nhiều cơ hội hơn để giới thiệu rủi ro bảo mật. :)
Chip Bennett

Bennet - từ việc gửi thư bằng toscho vài ngày trước - tôi đoán tôi có thể nói điều đó cho cả hai chúng tôi - hầu hết các chức năng đơn giản cho việc đọc và hiểu dễ dàng hơn nhiều so với các chức năng đó. Tôi không thất vọng- nhưng cũng không ủng hộ điều này. Imo đây không phải là một phần của cốt lõi, vì nó không thêm bất kỳ giá trị nào.
kaiser

2
Tôi tò mò không biết những gì các bạn nghĩ ra dễ dàng hơn checked( $theme_options['whatever_option'] )hay checked( 'some_value' == $theme_options['whatever_option'] ). Tôi không biết làm thế nào nó trở nên cô đọng hơn thế?
Chip Bennett

1

Hàm tiền tố và tên biến

Các plugin nên thêm tiền tố vào tất cả các tùy chọn, chức năng tùy chỉnh, biến tùy chỉnh và hằng số tùy chỉnh với plugin-slug.

Chủ đề nên tiền tố tất cả các tùy chọn, chức năng tùy chỉnh, biến tùy chỉnh và hằng số tùy chỉnh với sên chủ đề.


Tôi sẽ mở rộng nó cho tất cả các tên lớp cũng như tên của các đối tượng tùy chỉnh như post_types và phân loại.
Mfield

1

Sử dụng wp_safe_redirect () thay vì gọi hàm tiêu đề () của php trực tiếp khi chuyển hướng đến một trang trên cùng một tên miền.


0

Thêm trang cài đặt vào các phần thích hợp của menu quản trị

Các plugin nên sử dụng add_options_page()chức năng để thêm Trang Cài đặt Plugin vào Settingsmenu, thay vì sử dụng add_menu_page()để thêm menu cấp cao nhất.

Chủ đề nên sử dụng add_theme_page()chức năng để thêm Trang cài đặt chủ đề vào Appearancemenu, thay vì sử dụng add_menu_page()để thêm menu cấp cao nhất.

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.