Wordpress Password

Nonce – bảo mật cho các form của bạn trên WordPress

Nonce là từ viết tắt của “Number Used Once”, tuy nhiên nó không chỉ là số đâu nhé, nó có cả mã chữ cái nữa, đây là một đoạn mã dùng để kiểm tra form của người dùng và dùng để chống lại một số kiểu tấn công trong đó có Cross-site request forgery cực kì nguy hiểm !

Cross-site request forgery được hiểu như một dạng “one click attack” – nghĩa là tấn công dạng một lần click: Khi người dùng click vào đường dẫn kiểu như domain.com/chuyentien?id=123&soluong=12000&target=user2_id thì tiền của người thứ nhất sẽ chuyển sang túi người thứ hai, chỉ cần lừa người dùng click vào link là được.

Để chống lại CSRF nêu trên, WordPress cho thêm mã Nonce vào để chứng thực sự hoạt động của người dùng, mã này chỉ sinh ra và valid duy nhất 1 lần nên nếu người dùng có click vào đường dẫn trên nhưng mã Nonce sai thì WordPress sẽ cảnh báo người dùng.

Ví dụ:

http://example.com/wp-admin/post.php?post=123&action=trash&_wpnonce=b192fc4204

Bạn sẽ thấy một mã Nonce ở cuối đường dẫn, giúp người dùng không bị tấn công hoặc vô tình bấm vào link đã hết hạn từ trước, mã này thay đổi liên tục !

#1, Thêm mã Nounce vào đường dẫn

Để sử dụng mã Nonce vào đường dẫn mỗi khi bạn thực hiện lệnh GET hoặc form, hãy làm theo cú pháp sau:

$complete_url = wp_nonce_url( $bare_url, 'action=a', $name = 'forexample' );

Trong đó $base_url chính là URL mà bạn muốn thêm mã Nonce vào, ACTION là biến bạn có thể cho thêm vào, ví dụ như “addfriend=2”, và $name chính là tên bạn muốn đặt cho mã Nonce này !

Đường dẫn $complete_url có thể là:

http://jamviet.com/?action=delete&postid=2&my_nonce=akfgyli77t7

#2, Nonce trong Form

Để sử dụng mã Nonce trong form, bạn cần sử dụng hàm sau:

<?php wp_nonce_field( $action, $name, $referer, $echo ) ?>

Mặc định nếu bạn gọi hàm này trống, thì nó sẽ echo theo mặc định và có dạng kiểu như:

<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />

Như vậy, bạn có thể gọi hàm này ở cuối form bất kì mà bạn tạo trong gói giao diện để có thể chống lại một vài cuộc tấn công như CFRS tôi đã nêu, lúc này form có thể là:

<form action="" method="post">
    <input type="text" name="user_input" value="">
    <?php wp_nonce_field( 'my_form' ) ?>
</form>

Cách khác:

Các bạn có thể chỉ cần giá trị của Nonce để kiểm tra thôi, các bạn chỉ cần gọi hàm như sau:

wp_create_nonce( $NAME );

Trong đó $NAME là tùy chọn, bạn có thể đặt tên thế nào cũng được !

#3, Kiểm tra mã

1. Nếu bạn sử dụng mã Nonce trong admin, bạn cần phải sử dụng hàm sau để kiểm tra đường dẫn giới thiệu:

check_admin_referer( $action, $name_nonce );

$Action là bạn đã sử dụng nó trong wp_nonce_field ( $action, $name_nonce ) bên trên để sinh mã Nonce !

2. Cách đơn giản hơn

<?php wp_verify_nonce( $nonce, $action ); ?>

Hàm trên trả về True và False, và phải khớp cái mã $action bạn đã tạo trước, còn $nonce chính là cái mã bạn đang cần kiểm tra, tổng quát nó thế này:

$nonce = wp_create_nonce( $action ); // create nó
wp_verify_nonce( $nonce, $action ); // kiểm tra nó !

Nếu trả về đúng, thì người dùng sẽ được thực thi, nếu bạn kiểm tra mà trả về sai, thì ngừng thực thi !

3. Can thiệp vào thời gian hết hạn của mã Nonce

add_filter( 'nonce_life', function () { return 2 * HOUR_IN_SECONDS; } );

Filter trên có thể đặt vào trong functions.php của giao diện hoặc đặt vào trong plugin, trong ví dụ trên, tôi để 2 tiếng đồng hồ, nếu không thì mã Nonce sẽ hết hạn !

Tổng kết

Nếu bạn là lập trình, hãy chú ý bảo vệ các form của mình bằng cách tạo mã Nonce này và nhớ check chúng trước khi cho người dùng hành động, vì đây là cách bảo mật tương đối mạnh với các loại hacker thông thường, trong admin của WordPress đâu đâu cũng sử dụng mã này !

Xin mời xem thêm các cách đơn giản nhất để bảo mật WordPress, xem thêm các plugin giúp bảo mật nữa nhé !

Chúc các bạn thành công !

TÁC GIẢ:

Tôi là Jam, thâm niên 7 năm thiết kế website và làm SEO. Hãy theo dõi blog của tôi để nhận được nhiều chia sẻ thú vị xung quanh chủ đề công nghệ.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *