Thứ Tư, 7 tháng 10, 2015

CSRF là gì và Cách phòng thủ

CSRF là gì và Cách phòng thủ

CSRF là viết tắt của Cross Site Request Forgery. Nôm na hiểu ra tiếng việt thì có nghĩa là: Mượn quyền trái phép. Đây là 1 lỗi rất thường gặp, khá nguy hiểm :D và rất nhiều coder chưa có kinh nghiệm hầu như ko để ý tới vấn đề này
Độ khó: Trung bình.
Yêu cầu: Kiến thức lập trình và kiến thức về dịch vụ web  cơ bản

Hello, hôm nay là 30/4 :D có dịp rảnh rỗi tý, nhân tiện cũng viết bài mới :( lâu lắm rồi ko xuất hiện.
OK. Giờ vào vấn đề nhé :D mình sẽ nói 1 cách đơn giản và dễ hiểu bằng ví dụ như sau:
Giả sử: Ứng dụng web của bạn, nếu đăng nhập dưới quyền Admin thì sẽ có thể xóa bài viết bằng cách truy cập: http://domain.com/admin.php?xoa_bai_viet=1234
Ok, từ việc này ta sẽ đặt ra vấn đề. Sẽ ra sao, nếu bạn đang đăng nhập dưới quyền admin, mà Hacker gửi cho bạn 1 link rút gọn để dẫn tới link trên (Giả sử bit.ly/link-rut-gon chẳng hạn). Và bạn click vào mà ko biết đó là gì, sau đó vô tình chính bạn đã xóa bài viết 1234 mà ko hề có chủ ý :D
Hoặc ngay cả method http POST cũng có thể bị giả lập 1 cách dễ dàng = javascript.
Ok, từ trên, chúng ta có thể suy nghĩ rộng ra 1 vài trường hợp khác như ăn trộm tài khoản chẳng hạn. Giả sử ứng dụng web cung cấp phương thức để thay đổi email chẳng hạn. Hacker cũng có thể hướng người dùng truy cập vào địa chỉ nào đó mà ở bên trong có thực thi mã độc 1 cách bí mật mà người dùng ko biết để mượn quyền user của người dùng thực hiện hành vi trên ứng dụng web bị hack.
Ngay cả trang mạng xã hội Facebook nổi tiếng cũng đã từng mắc phải lỗi bảo mật CSRF này :D
Vậy chúng ta phải làm thế nào để khắc phục ?
Hãy suy nghĩ về việc làm thế nào để xác minh rằng, người dùng đang thực hiện hành vi chính từ ứng dụng web của bạn và ko có sự giả mạo mượn quyền !
Yes ! Đó là tạo ra 1 mã TOKEN cho mỗi người truy cập vào web của bạn, và sử dụng nó để xác minh cho mỗi hành động người dùng. Token này bạn có thể tạo ngẫu nhiên, hoặc theo quy tắc... tùy theo thuật toán bạn muốn, nhưng nó cần được lưu và gắn vào mỗi hành động của người dùng.
Quay lại việc khắc phục ví dụ đầu tiên. Khi bạn thêm vào 1 tham số GET nữa để xác minh, giả sử gọi là TOKEN, và bạn kiểm tra TOKEN của GET có khớp với TOKEN mà bạn lưu trong ứng dụng cho người dùng này hay ko, trước khi thực hiện hành động xóa.
Khi đó giả sử TOKEN bạn tạo ra cho người dùng này là: TOKEN = ABCDEF1234321 thì link xóa bài hợp lệ lúc này là
http://domain.com/admin.php?xoa_bai_viet=1234&TOKEN=ABCDEF1234321
:D Lúc này hacker sẽ phải bó tay vì hắn hoàn toàn ko thể lấy được tham số TOKEN để mượn quyền trái phép được nữa :)
Đó là cách tốt nhất và phổ biến nhất để khắc phục vấn đề này

Không có nhận xét nào: