Nonce trong WordPress là gì?

WordPress cung cấp một hệ thống nonce dễ sử 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 sử 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 sử 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 sử 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ể.

Nonce trong WordPress là gì?

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 kiểm tra 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 sử 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://vutruso.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://vutruso.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 sử dụng các chức năng mà WordPress cung cấp cho mục đích đó.

Để tạo Nonce, bạn có thể sử 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 sử dụng nonce theo cách tùy chỉnh, như trong một yêu cầu AJAX.

Khi nói đến việc xác minh các nonces, bạn có thể sử 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ẽ kiểm tra 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 sử 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 nonce
echo '<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 sử 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ể sử 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 sử dụng trên wordpress còn cung cấp các hàm để tạo và kiểm tra nonce khác để áp 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 sử dụng khi cần thiết.

Nếu bạn thấy bài viết có ích hãy sao chép link và chia sẻ bài viết
daotiendung

Tiến Dũng Đào chuyên quản lý, vận hành các dịch vụ website. Anh có nhiều năm kinh nghiệm về VPS, Hosting, technical SEO, CMS. Đặc biệt yêu thích WordPress với hơn 5 năm phát triển theme và plugin. Sở thích của anh là đọc, viết blog, đi du lịch, tập võ và chia sẻ các kiến thức cho mọi người.

Bài viết liên quan