Tôi có cần một trường nonce cho mỗi hộp meta tôi thêm vào quản trị viên loại bài đăng tùy chỉnh của mình không?


16

Tôi hiện đang làm việc trên trang quản trị của loại bài đăng tùy chỉnh của mình và tôi gặp khó khăn trong việc quyết định có nên thêm trường nonce lần nữa cho metabox thứ hai hay không. Tôi rất mới với các loại bài đăng tùy chỉnh và tìm kiếm trực tuyến về điều này không thực sự mang lại nhiều kết quả.

Có suy nghĩ gì không? Cảm ơn.

Câu trả lời:


13

Tôi muốn giới thiệu như vậy.

Bạn có (và nên) có thông tin riêng để kiểm tra nguồn gốc của dữ liệu và mục đích của người dùng. Nếu bạn chỉ có một lần mở cho metabox - thì bạn sẽ gặp vấn đề nếu metabox đó bị xóa (không giống như ẩn). Nếu loại bỏ metabox thứ hai, (hoặc ít nhất nên) sẽ không bao giờ lưu vì nonce được gửi lâu hơn.

Tất nhiên, từ quan điểm bảo mật, không có gì được thêm vào bởi một nonce thứ hai - trừ khi bạn chỉ muốn cập nhật một metabox chứ không phải là khác: nonces nên là duy nhất cho hành động .


Biên tập

Như chỉ ra rằng chỉ có một hình thức cho màn hình chỉnh sửa bài. Vì vậy, về mặt lý thuyết, bạn chỉ cần một trường nonce để xác thực hành động và nguồn gốc của dữ liệu. Tuy nhiên, vì metaboxes có thể được loại bỏ - bằng cách có một trường nonce chỉ trong một metabox, không có gì đảm bảo rằng nonce sẽ ở đó. Bằng cách đặt một trường nonce trong mỗi metabox, bạn có thể kiểm tra xem dữ liệu từ metabox đó đã được gửi chưa (và thực tế là từ nơi bạn nghĩ là nó) trước khi xử lý bất kỳ dữ liệu nào. Ví dụ:

save_post_call_back($post_id){

  //Check this is not an auto-save route

  if(nonce of metabox1 present and valid){
     //Process data from metabox1
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

  if(nonce of metabox2 present and valid){
     //Process data from metabox2
  }else{
    //Either metabox removed - or invalid nonce. Take no action.
  }

}

Các tên của trường nonce phải là duy nhất đến Metabox (và không xung đột với bất kỳ nonces khác có mặt trên các hình thức từ các plug-in khác).

Giá trị nonce phải là duy nhất cho hành động (và điều này thường bao gồm nguồn gốc của dữ liệu (ví dụ: bài đăng chỉnh sửa thay vì chỉnh sửa nhanh)). Tôi thường bao gồm ID bài viết quá.


hmm nhưng chỉ có một <form>thẻ trên trang quản trị. trường nonce có phải là duy nhất cho hình thức hay không? tia, @Stephen
Ana Ban

Có, vì vậy tên nonce phải là duy nhất cho metabox để bạn có thể kiểm tra tên của từng metabox. Giá trị nonce phải là duy nhất cho hành động được thực hiện và nguồn gốc của dữ liệu (ví dụ: 'chỉnh sửa nhanh' và màn hình chỉnh sửa bình thường đều kích hoạt save_posthành động).
Stephen Harris

cập nhật câu trả lời để hy vọng làm rõ những gì tôi đang nói :)
Stephen Harris

Vấn đề là 1) vì chỉ có một thẻ Form cho toàn bộ màn hình chỉnh sửa và 2) nó tự động có một nonce được thêm vào nó. Tại sao bạn phải thêm nhiều hơn? Nó sẽ luôn luôn có bất kể điều gì ... Tôi đã chỉ ra điều này trong câu trả lời của mình và bị từ chối, cảm ơn mọi người ... Ý định của tôi là chỉnh sửa trang theo nội dung hoặc dữ liệu meta, vd. một trường nonce ... Ngoài ra, khi tôi cố gắng thêm nhiều hơn, nó thậm chí không hoạt động với nhiều hộp meta !!
OZZIE

1
Xem câu trả lời của tôi. save_postcó thể được gọi từ các bối cảnh khác nhau, vì vậy một nonce không được đảm bảo. Đây cũng là một cách thuận tiện để kiểm tra xem cuộc gọi lại của bạn có thực sự phải làm gì không. Khi thêm nhiều nonces, sử dụng tên duy nhất. Nó không hoạt động.
Stephen Harris

5

Bạn cũng có thể móc hộp gửi mà không bao giờ biến mất thêm trường nonce vào nó

add_action( 'post_submitbox_start', 'theme_submitdiv_extra' );
function theme_submitdiv_extra()
{
  wp_nonce_field( 'theme_meta_box_nonce', 'meta_box_nonce' );
}

Sau đó, trong hành động save_post của bạn:

if( !isset( $_POST['meta_box_nonce'] ) || !wp_verify_nonce( $_POST['meta_box_nonce'], 'theme_meta_box_nonce' ) ) return;

1

Trường nonce được sử dụng để xác thực rằng nội dung của biểu mẫu đến từ vị trí trên trang web hiện tại chứ không phải nơi nào khác.

mật mã: wp_nonce_field

chỉ có một trường nonce cho mỗi hình thức là bắt buộc, sử dụng nhiều hơn một trường không có ý nghĩa đối với tôi.

có lẽ bạn có thể điều tra và sử dụng check_admin_Vferer () để đảm bảo yêu cầu của bạn đến từ trang quản trị


-1

Trong WP 3.5.2 Toàn bộ trang chỉnh sửa được gói trong thẻ biểu mẫu vì vậy bạn KHÔNG nên thêm thẻ biểu mẫu của riêng mình !! Nếu vẫn làm điều đó và cố gắng thêm một hộp meta tùy chỉnh riêng biệt khác, nó sẽ thất bại khi lưu và chỉ dẫn bạn đến nhà wp-admin khi cố gắng lưu !!

Ngoài ra, KHÔNG thêm trường NONCE vì chỉ có một dạng cho mỗi biểu mẫu (điều này cũng có thể khiến nó thất bại !!) Và chỉnh sửa trang đã có trường nonce!

Biên tập:

Vấn đề là 1) vì chỉ có một thẻ Form cho toàn bộ màn hình chỉnh sửa, vì tác giả câu trả lời đúng đã thừa nhận và 2) nó tự động có một nonce được thêm vào nó. Tại sao bạn phải thêm nhiều hơn? Nó sẽ luôn luôn có nonce cho dù ...

Các ý là theo quan điểm của tôi để chỉnh sửa các trang theo nội dung hoặc dữ liệu meta ví dụ. một trường nonce ... Ngoài ra khi tôi cố gắng thêm nhiều hơn, nó thậm chí không hoạt động với nhiều hộp meta !! Một cái sẽ hoạt động và cái còn lại sẽ thất bại và chỉ chuyển hướng người dùng đến wp-admin home!


Bạn đã đăng cùng một câu trả lời cho hai câu hỏi, có phải là vô tình? Bạn muốn trả lời câu nào?
Hết

Xin lỗi tình cờ, cái này. Nếu bạn sử dụng thành phần chế độ xem firebird hoặc chrome của hộp meta được thêm bằng thẻ biểu mẫu trong wp 3.6, nó sẽ tự động xóa một gói trong toàn bộ biểu mẫu cho bài đăng. Vậy điều này thế nào là sai? Tại sao bạn lại thêm một vài trường nonce?
OZZIE

Hãy thử và bạn sẽ thấy
OZZIE
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.