Sunday, August 2, 2015

Khi bạn Thiết kế website thì vấn đề quan trọng không thể thiếu đó là bảo mật. Có rất nhiều cách để tăng cường tính bảo mật trong WordPress. Đã có nhiều người đưa ra các bài viết về một số cách bảo mật trong WordPress. Hôm nay trong bài viết này mình sẽ chỉ dẫn thêm cho các bạn cách bảo mật với Nonce, một cách hiệu quả để hạn chế việc tấn công theo kỹ thuật Cross Site Request Forgery (CSRF).

Bảo mật website với Nonce trong WordPress
Bảo mật website với Nonce trong WordPress
trước hết ta sẽ tìm hiểu về một vài vấn đề sau:
Nonce là gì?
Hiểu đơn giản nó là 1 chuỗi độc nhất được tạo ra bởi WordPress cho mỗi người dùng. Nó giúp bảo vệ website khỏi những request tự tạo với mục đích xấu.
Để dễ hiểu vấn đề này hơn mình giả tỉ có 1 link dùng để xóa bài viết như thế này:
Khi mình click vào link thì bài viết sẽ được xóa thường ngày và không vấn đề gì. Nhưng vấn đề xảy ra nếu một người dùng khác có chủ tâm xấu. Họ dùng 1số thủ thuật nào đó để phê chuẩn quyền của mình và thực hành việc chạy lại đường link trên với 1 địa chỉ (id)khác thì sao? Bài viết khác có thể bị xóa cho dù mình không click vào nút xóa. Các bạn đã thấy đó vấn đề này rất lớn rồi đó. Ngoài ra thì khi dùng form để submit dữ liệu cũng vẫn bị vấn đề trên.
Vậy làm thế nào để xác định được chuẩn xác 1 request do người dùng thực hành chuẩn y click link hay submit form ?
Việc cần làm là chúng ta phải tạo ra thêm 1 nonce cho request và trang xử lý phải công nhận cái nonce này. Nếu nonce không hợp thức thì không xử lý request. Làm như vậy thì chúng ta mới xác định được chính xác thao tác đấy là do chính người dùng tạo ra không với mục đích xấu.
Các sử dụng Nonce
Như đã nói ở trên nonce là 1 chuỗi vậy chuỗi này được tạo ra như thế nào? Mở file wp_config.php lên và tìm đến 2 hằng NONCE_KEY và AUTH_SALT. WordPress đã dùng dụng 2 hằng này và hash cùng với một số tham số khác sau như action, user id … sau đó cắt ra 1 đoạn để tạo ra nonce.
Cách đơn giản và linh động nhất là các bạn dùng hàm wp_create_nonce($action) để tạo nonce và dùng hàm wp_verify_nonce($nonce, $action) để công nhận.
ví thử với link xóa bài như bên trên, mình cần tạo ra 1 nonce, đưa nonce này vào query string, bên trang xử lý sẽ công nhận nonce ưng chuẩn query string.
$nonce = wp_create_nonce(‘ delete_1′); //tạo nonce
echo ‘Xó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_1. 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 ý. MộtLưu ý với các bạn là: 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ý:
if(!wp_verify_nonce($_GET[‘_nonce’], ‘delete_’.$_GET[‘id’])) exit();
//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.
bản tính hàm này sẽ tạo ra 1 nonce khác theo $action và so sánh nó với nonce get được.
Ngoài cách dùng trên wordpress còn cung cấp các hàm để tạo và thẩm tra nonce khác để vận dụng vào từng trường hợp cụ thể.
Để tạo nonce cho url, ngoài cách trên ra chúng ta có thể dùng thêm hàm wp_nonce_url( $actionurl, $action, $name ) hàm này sẽ trả về cho chúng ta 1 đường dẫn đầy đủ chứa nonce.
một vài tham số cần chú ý:
$actionurl chính là đường dẫn để add nonce vào.
$action hao hao trên.
$name là tên của nonce, mặc định là _wpnonce
Cũng với ví dụ trên mình sử dùng hàm wp_nonce_url() để tạo:
$nonce_url = wp_nonce_url(‘http://domain/?action=delete&id=1′, ‘delete_1′);
echo ‘Xóa';
Khi xem thì các bạn thấy đường dẫn nó cũng tương tự cách trên, _wpnonce chính là tham số $name mặc định, các bạn muốn đổi thành tên khác thì tùy chỉnh tại tham số này.
http://domain/?action=delete&id=1&_wpnonce=e73a52569c
nối để tạo nonce cho 1 form các bạn có thể dùng thêm hàm wp_nonce_field( $action, $name, $referer, $echo ). Các thông số như $action và $name thì tương tự trên. thông số $referer sẽ nhận giá trị true hoặc false, quyết định hiển thị thêm 1 field ẩn chứa đường dẫn hiện tại. $echo cũng nhận giá trị true hoặc false, quyết định hàm wp_nonce_field() sẽ hiển thị hay trả về kết quả.
Khi sử dụng hàm này với $referer là true các bạn sẽ thấy trong form có thêm 2 trường dạng như thế này:
Về cách verify nonce thì WordPress cung cấp thêm cho chúng ta 2 hàm nữa khác là check_admin_referer() và check_ajax_referer().
Hàm check_admin_referer() sẽ dùng để verify nonce trong trang quản lý. Hàm này nhận 2 thông số là $action và $query_arg với $action thì tương tự, $query_arg chính là $name của nonce. Hàm này sẽ trả về true nếu nonce hợp lệ và trái lại là false.
giả như có 1 form dạng như thế này:

    //…….
  

Thì khi verify các bạn làm như sau:
if(!check_admin_referer(‘myaction’, ‘mynonce’)) die();
Hàm check_ajax_referer() sẽ verify nonce duyệt y Ajax. Hàm này nhận 3 tham số, 2 thông số đầu là $action và $query_arg na ná hàm trên, với thông số thứ 3 là $die, nếu nonce không hợp thức, và tham số này set true thì sẽ ngưng xử lý, nếu false thì bỏ qua. Mặc định là true.
Thời gian sống mặc định của 1 nonce là 24 giờ. Các bạn vẫn có thể chỉnh sửa lại duyệt y hook nonce_life.
add_filter( ‘nonce_life’, function () return 4 * HOUR_IN_SECONDS; );
Hằng HOUR_IN_SECONDS sẽ trả về số giây trên giờ (3600).

Mình vừa hướng dẫn xong cho các bạn cách bảo mật WordPress với Nonce để hạn chế việc tiến công theo kỹ thuật CSRF trong khi phát triển theme và plugin. Mong rằng các bạn có thể bảo vệ website của mình một cách tốt hơn với Nonce

0 comments:

Post a Comment