Sử dụng Nonces để tăng cường bảo mật cho WordPress.
Nonces là một trong những cách tốt nhất để bảo vệ người dùng khỏi các mối đe dọa có thể xảy ra. Chúng được sử dụng để bảo đảm hoạt động người dùng được khởi xướng bởi các plugin, chẳng hạn như việc tạo một biểu mẫu (form), xóa bài viết hoặc bất cứ điều gì khác mà có thể làm phơi bày các cơ sở dữ liệu. Trong bài viết này, tôi sẽ mô tả cho các bạn những vấn đề liên quan đến nonces và cách mà bạn có thể sử dụng chúng để làm cho blog/website của mình trở nên an toàn hơn.
Tham khảo thêm:
- Giới thiệu serie videos bảo mật WordPress từ WPMUDEV
- Bảo mật blog WordPress của bạn với 5 bước đơn giản
- Bảo mật WordPress bằng file .htaccess
Tại sao chúng ta cần Nonces?
Hãy tưởng tượng bạn đang viết một plugin cho phép người dùng xóa một bài viết từ front-end. Hiểu một cách đơn giản, cơ chế để xóa một bài viết là chuyển nó đến một liên kết có dạng http://mysite.com/2015/02/12/my-article/?delete=true. Nói cách khác, liên kết đến bài viết này có một chuỗi truy vấn kèm theo.
Đoạn mã của bạn sẽ thực hiện việc kiểm tra trên trang web. Nếu người dùng là Admin, bài viết này sẽ bị xóa và người dùng sẽ được chuyển hướng trở lại trang chính. Điều này có vẻ rất an toàn phải không? Đáng buồn thay, nó là không đủ. Có hai điều bạn cần phải kiểm tra trước khi mỗi hành động được thực hiện: cho phép và ý định. Bạn đã kiểm tra và xác nhận người dùng được phép làm điều đó, nhưng bạn không thể chắc chắn rằng người dùng có thực sự muốn xóa bài viết hay không?
Hãy tưởng tượng, tôi gửi cho bạn một email nói rằng tôi tìm thấy lỗi đánh máy trong một số bài viết của bạn và tôi đã liên kết nó trong nội dung email. Nếu tôi tạo ra một liên kết trong một email, bạn sẽ không thấy mục tiêu thật sự mà liên kết đó hướng tới (nếu không để ý), chỉ thấy phần văn bản có thể click vào. Vì vậy, nếu tôi gắn thêm vào đó một truy vấn có dạng ?delete=true, bạn sẽ vô tình hoàn tất việc xóa một bài viết, mặc dù bạn không muốn làm điều đó.
Đây chính là lúc bạn cần đến nonces. Một nonce là một mã số đặc biệt, được tạo ra ở nguồn của hành động. Khi sử dụng nonces, liên kết có thể có dạng như thế này: http://mysite.com/2015/02/12/my-article/?delete=true&_wpnonce=234283223. Các nonce sẽ luôn luôn khác nhau và tôi sẽ không thể để gửi cho bạn một liên kết đơn giản giống như bên trên, bởi vì quá trình xóa sẽ không diễn ra nếu không có nonce đúng.
Vậy Nonces là gì?
Nonce là từ viết tắt của “number used once” (số được sử dụng một lần). Nonces được sử dụng trong bảo mật dữ liệu bằng cách đính kèm mã số sử dụng một lần vào bên cạnh chúng.
WordPress thực hiện nonces có một chút khác biệt. Bởi vì chúng không phải là những con số và được sử dụng không chỉ một lần, nhưng mục đích và cách sử dụng thì cũng tương tự như vậy. WordPress sử dụng một hash và nonces đôi khi có thể được sử dụng nhiều hơn một lần, nhưng chúng có thời gian hết hạn rất ngắn.
Sử dụng WordPress Nonces như thế nào?
Quá trình này là một công việc gồm hai bước khá đơn giản: bạn tạo một nonce ở nguồn gốc của một hành động (đặt nó vào một liên kết hoặc như là một lĩnh vực ẩn trong một biểu mẫu) và xác nhận nó vào mục tiêu. Bạn sẽ chỉ cần biết một vài chức năng ở đây:
1. Thêm Nonces và Forms:
Để thêm một nonce vào biểu mẫu, bạn sẽ cần phải thêm một lĩnh vực (field) ẩn (gồm một tên và một giá trị). WordPress của bạn sẽ được bảo vệ với chức năng wp_nonce_field ().
Trong hình thức đơn giản nhất, bạn có thể sử dụng nó chỉ với một tham số:
wp_nonce_field( 'delete-post-' . get_the_ID() );
Nó sẽ tạo ra hai trường (hay lĩnh vực) cho bạn, một cho các nonce và một cho referrer:
<input type="hidden" id="_wpnonce" name="_wpnonce" value="37b392c8a0" />
<input type="hidden" name="_wp_http_referer" value="/2015/02/13/my-article/" />
Chức năng này cho phép bạn tinh chỉnh 4 tham số. Tham số đầu tiên xác định các hành động được thực hiện với các nonces. Nó không hiển thị trong trường này, thay vào đó được chứa trong hash. Tham số thứ hai có thể đổi tên, nó là _wpnonce theo mặc định. Tham số thứ ba là một giá trị boolean kiểm soát việc có kiểm tra referrer hay không (giữ nguyên theo mặc định). Cuối cùng, thứ tư là một boolean quyết định các trường có được lặp lại hay không? – nó được giữ nguyên theo mặc định.
Một nguyên tắc quan trọng mà bạn cần phải chú ý: luôn luôn làm cho tên hành động (các tham số đầu tiên) càng cụ thể càng tốt. Đừng chỉ đặt tên cho nó là “delete-post“, hãy sửa thành “delete-post-[post_ID]“.
Ở đầu bên kia của hành động, bạn sẽ cần phải xác minh các nonce. Đây là nơi tham số hành động của form được tạo ra cho bạn. Để xác minh các nonce, hãy sử dụng đoạn mã đơn giản này:
if ( ! isset( $_POST['field_name'] ) || ! wp_verify_nonce( $_POST['field_name'], 'action_name' )
) {
// Do something if the nonce does not verify
exit();
}
// Process your form
2. Thêm Nonces vào URL
Đôi khi bạn muốn bắt đầu một hành động thông qua một liên kết, đặc biệt là ở khu vực Admin. Kể từ khi các liên kết cơ bản hoạt động thông qua các thông số truy vấn, bạn có thể dễ dàng chèn nonce vào các liên kết.
Bạn có thể sử dụng wp_nonce_url () để thực hiện việc này. Dưới đây là cách làm:
$delete_link = wp_get_shortlink( get_the_ID() ) . '&delete=true';
$nonced_link = wp_nonce_url( $delete_link, 'delete-post-' . get_the_ID(), '_mynonce' );
Kết quả cuối cùng sẽ là một URL có dạng như: http://mysite.com?p=553&_mynonce=7278c82a8f3. Bạn có thể thấy điều này tương tự như những gì chúng ta đã làm với các biểu mẫu (form), sự khác biệt duy nhất là các nonce được chuyển vào trong URL như các tham số GET.
Bạn có thể xác minh các nonce bằng cách sử dụng các phương pháp tương tự như trước. Lần này chúng ta sẽ thêm tên hành động thích hợp với các ID và sử dụng biến GET.
if ( ! isset( $_GET['_mynonce'] ) || ! wp_verify_nonce( $_GET['_mynonce'], 'delete-post-' . $_GET['p'] )
) {
// Do something if the nonce does not verify
exit();
}
// Process your form
Tổng quan
Nonces thực sự nên được sử dụng bất cứ lúc nào bạn muốn bắt đầu một hành động người dùng nếu không blog/website của bạn sẽ dễ bị tổn thương bởi các cuộc tấn công, đặc biệt là CSRF (Cross Site Request Forgery). Đừng quên rằng nonces chỉ kiểm tra ý định và bạn sẽ cần phải chắc chắn rằng người dùng có quyền thực hiện hành động đó.
Để hiểu rõ hơn, các bạn có thể tham khảo thêm về Nonces tại đây.
Nếu bạn thích bài viết này, hãy subscribe blog của tôi để thường xuyên cập nhật những bài viết hay nhất, mới nhất qua email nhé. Cảm ơn rất nhiều. :)
Mình bình luận trên Ngọc đến rồi và nhận được thông báo Nonce không hợp lệ
Chắc website bên đó bị lỗi cache hay gì rồi. 😅
Cảm ơn ad, mình đang sử dụng tại gudiebo.com hiện tại tính bảo mật rất ổn, chạy 3 năm chưa thấy bị hack lúc nào cả.
Cảm ơn bài viết hữu ích của bạn. Truy cập https://thuyduong.info để có thêm nhiều kiến thức về tài chính nhé!