---
title: "Sử dụng Nonces để tăng cường bảo mật cho WordPress"
author: "Trung Hiếu"
date: "2015-05-09"
lastmod: "2022-06-19"
url: "https://wpcanban.com/wordpress/thu-thuat-wordpress/su-dung-nonces-de-tang-cuong-bao-mat-cho-wordpress.html"
---

# Sử dụng Nonces để tăng cường bảo mật cho WordPress

Sử dụng Nonces để tăng cường bảo mật cho WordPress.

![su-dung-nonces-de-tang-cuong-bao-mat-cho-wordpress](https://wpcanban.com/wp-content/uploads/2015/05/su-dung-nonces-de-tang-cuong-bao-mat-cho-wordpress.jpg)

*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](https://wpcanban.com/wordpress/thu-thuat-wordpress/gioi-thieu-serie-videos-bao-mat-wordpress-tu-wpmudev.html)*
- *[Bảo mật blog WordPress của bạn với 5 bước đơn giản](https://wpcanban.com/wordpress/thu-thuat-wordpress/bao-mat-blog-wordpress-cua-ban-voi-5-buoc-don-gian.html)*
- *[Bảo mật WordPress bằng file .htaccess](https://wpcanban.com/wordpress/thu-thuat-wordpress/bao-mat-wordpress-bang-file-htaccess.html)*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](https://wpcanban.com/category/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](http://codex.wordpress.org/WordPress_Nonces).

*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.* :)
