Nonce trong WordPress là gì?
WordPress cung cấp một hệ thống nonce dễ tiêu dùng để tạo và xác minh các hàm băm cho các hành động nhất định. Nonce giúp bảo vệ khỏi một số loại tấn công như Cross Site Request Forgery (CSRF)
Nonces là gì?
Theo định nghĩa, nonce là thứ chỉ được tiêu dùng một lần và không lặp lại.
None là những hàm băm được tạo thành từ các con số và chữ cái. Chúng chỉ được tiêu dùng một lần và có vòng đời giới hạn, có nghĩa là sau một khoảng thời gian nhất định chúng sẽ hết hạn tiêu dùng. Trong suốt vòng đời của nó, nonce sẽ vẫn giữ nguyên và sẽ liên quan đến một người dùng và ngữ cảnh cụ thể.
Cách Nonces bảo vệ một trang web
Ví dụ: khi người dùng gửi biểu mẫu, một cuộc tấn công CSRF có thể buộc người dùng thực hiện các hành động không mong muốn. Tùy thuộc vào cấp độ truy cập của người dùng liên quan, thiệt hại có thể từ một địa chỉ email bị thay đổi ngay đến toàn bộ trang web bị xâm phạm.
Để tránh điều này, một nonce được thêm vào URL được gửi tương ứng để được đánh giá và chỉ sau đó cho phép hành động hoàn tất nếu giá trị đó chính xác và chưa hết hạn.
Một ví dụ phổ biến về việc tiêu dùng nonce trong WordPress là khi xóa một bài đăng.
Hành động xóa bài viết này tương ứng với url phía dưới đây nếu không có nonce
https://truongcongthang.com/wp-admin/post.php?post=98&action=trash
Trong trường hợp này, kẻ tấn công có thể tận dụng liên kết không an toàn này khiến bạn vô tình xóa bài đăng của mình khi chỉ cần thay đổi ID của bài viết. Đây được gọi là một cuộc tấn công Cross-Site.
Trong trường hợp trên, nếu bạn thêm nonce vào sẽ dẫn đến phản hồi “403 Forbidden” vì URL của tin tặc sẽ thiếu xác minh bổ sung nonce.
URL mà WordPress thường tạo khi bạn chuẩn bị xóa một bài đăng như sau:
https://truongcongthang.com/wp-admin/post.php?post=98&action=trash&_wpnonce=f29c5da097
_wpnonce=f29c5da097
đảm bảo rằng chỉ bạn mới có thể thực hiện các tác vụ như xóa bài đăng trên trang web của bạn.
Ở mỗi ngữ cảnh cụ thể _wpnonce=f29c5da097
sẽ khác nhau ví dụ, user A sẽ có _wpnonce khác va user B có user khác vì vậy nó đảm bảo website được xác thực và dựa vào quyền có thể thao tác current_user_can()
Nonces và WordPress
Khi quản lý một trang web WordPress, các ký tự không phải do chính WordPress tạo ra để bảo vệ các URL và biểu mẫu của bạn không bị lạm dụng. Vì vậy, trừ khi bạn đang phát triển các chủ đề hoặc plugin, nếu không, bạn sẽ không bao giờ phải lo lắng về các lỗi không cần thiết vì mọi thứ đều do WordPress chăm sóc.
Tuy nhiên, khi xây dựng một chủ đề hoặc plugin với tư cách là một nhà phát triển, bạn nên tự xử lý các nonces bằng cách tiêu dùng các chức năng mà WordPress cung cấp cho mục đích đó.
Để tạo Nonce, bạn có thể tiêu dùng hàm wp_nonce_url()
để thêm nonce vào URL, wp_nonce_field()
để thêm nonce vào biểu mẫu hoặc wp_create_nonce()
nếu bạn muốn tiêu dùng nonce theo cách tùy chỉnh, như trong một đề nghị AJAX.
Khi nói đến việc xác minh các nonces, bạn có thể tiêu dùng hàm check_admin_referer()
để xác minh một nonce đã được chuyển trong URL hoặc một biểu mẫu trong màn hình quản trị, hàm check_ajax_referer()
sẽ đánh giá nonce và nếu nó không thành công thì theo mặc định sẽ chấm dứt thực thi tập lệnh và hàm wp_verify_nonce()
để xác minh một nonce được truyền trong một số ngữ cảnh khác.
Cách tiêu dùng Nonce trong WordPress
Giả sử với link xóa bài như bên trên bằng code thay vì click vào url, mình cần tạo ra 1 nonce, đưa nonce này vào query string, bên trang xử lý sẽ xác nhận nonce thông qua query string.
$nonce = wp_create_nonceundefined' delete_98'); //tạo nonceecho '<a href="http://domain/?action=delete&id=98&_nonce='.$nonce.'">Xóa</a>';
Các bạn thấy đấy, mình đã tạo thêm 1 nonce với $action truyền vào là delete_98. Và mình đã đưa nó vào query string để verify bên trang xử lý. Tên _nonce các bạn có thể đổi lại tùy ý. Lưu ý: với $action các bạn đặt như thế nào thì trang xử lý các bạn phải verify lại như thế đó.
Bên trang xử lý các bạn chỉ cần xác nhận cái nonce này trước khi xử lý. Không hợp lệ thì ngưng xử lý:
ifundefined!wp_verify_nonceundefined$_GET['_nonce'], 'delete_'.$_GET['id'])) exitundefined); //code xử lý ở đây ....
Bên trang xử lý chúng ta verify nonce thông qua hàm wp_verify_nonce. Với $nonce là $_GET[‘_nonce’], và $action là ‘delete_’.$_GET[‘id’]. Vì ở trên nonce được tạo từ ‘delete_1′ nên trang xử lý cần verify đúng $action đó theo dạng delete_{id}.
Thực chất hàm này sẽ tạo ra 1 nonce khác theo $action và so sánh nó với nonce get được.
nonce_field trong form
Trong thực tế code thì form bạn nên tiêu dùng nonce_field cụ thể như ví dụ sau:
<form method="POST"> <?php wp_nonce_field( 'your_nonce_action', 'your_nonce_field' ); ?> ....</form>
Để xác minh tính hợp lệ của nonce, bạn có thể tiêu dùng wp_verify_nonce()
if ( ! isset( $_POST['your_nonce_field'] ) || ! wp_verify_nonce( $_POST['your_nonce_field'], 'your_nonce_action' ) ) { // nonce did not verify.} else { // process form data}
Đơn giản thế thôi, ngoài cách tiêu dùng trên wordpress còn cung cấp các hàm để tạo và đánh giá nonce khác để vận dụng vào từng trường hợp cụ thể.
Kết luận
Cross Site Request Forgery (CSRF) là một lỗ hổng nổi tiếng trong thế giới WordPress và do đó, điều quan trọng là phải tích cực bảo vệ chống lại nó. Nonces rất quan trọng trong việc giúp ngăn chặn cuộc tấn công CSRF và luôn phải được tiêu dùng khi cần thiết.
0 nhận xét:
Post a Comment