Hash Id là gì? Vì sao lại dùng Hash Id? Cách bảo mật hệ thống API
Last updated
Last updated
Trước khi đi đến việc HashId là gì? Thì chúng ta phải hiểu nó, nó vận hành ra sao và vì sao phải dùng nó? Thì để muốn biết vì sao phải dùng nó là một điều cực kỳ quan trong trước khi tiếp cận 1 kiến thức nào đó trong lập trình.
Đối với RestAPI thì có đề cập đến việc convention, thì mình ví dụ như sau:
GET
api/users/{id} - api/users/25
PUT
api/users/{id} - api/users/25
DELETE
api/users/{id} - api/users/25
Thì dùng id như thế nào sẽ sinh ra vấn đề là dễ kiểm tra và dễ dự đoán, thí dụ có thể dò được với các user khác có id như 30, 50, 60, 100... Trong code chỉ cần loop từ 0 đến 99999 là xong. Chạy 1 cái vèo lấy hết data. Ở đây mình chỉ nói về vấn đề dự đoán, chứ còn việc bảo mật thì tính sau.
Phần này cũng là một lỗi lỗ hổng mà OWASP đã đề cập đến trong phần BOLA. ()
Như vậy, vấn đề ở đây là dự đoán, dễ khai thác từ các hacker. Thì vấn đề này cũng có 1 cách giải quyết là dùng 1 biến code hoặc thêm 1 cột Code trong bảng của Database.
Nhưng vấn đề ở đây lại phát sinh ra thêm là vấn đề lưu trữ và truy vấn. Như bạn biết thì truy vấn theo chuỗi sẽ chậm hơn truy vấn theo number. Và vấn đề lưu trữ thì phần lưu trữ text sẽ nặng hơn là lưu trữ number. Những điều này là mình sẽ không chứng minh ở đây, vì nó hiển nhiên và có thểm tìm hiểu.
Chính vì vấn đề đó, nên HashId được sinh ra để giải quyết vấn đề này, và cách HashId này là 1 cách tối ưu và tốt nhất cho đến thời điểm hiện tại.
HashId là 1 text được mã hóa với đầu vào là id và đầu ra là 1 chuỗi đã được mã hóa, và phần hashId này sẽ được trả về cho phía client request đến. Mọi request đều dùng hashId này và BE cũng dùng HashId này để xử lý trong hệ thống.
Trong lập trình thì HashId thì vấn đề triển khai cũng rất dễ. Và các ngôn ngữ lập trình lớn trên thế giới cũng đều có support phần này. Mình sẽ để list các nguồn và hướng dẫn đề tham khảo:
Ví dụ về cách triển khai trên API.
Đi lại ví dụ đã đề cập ở trước, thì bắt buộc bên phía BE phải trả về HashId của các biến như id, userId, ...
Và bên phía FE sẽ dùng các hashId này để truy xuất và sử dụng thông tin. Khi bên phía BE nhận vào thì sẽ nhận các hashId mà FE gửi đến và sẽ giải mã ID để truy xuất vào service và repository bằng ID thật.
GET
api/users/{id} - api/users/O2axkdlwx9
PUT
api/users/{id} - api/users/O2axkdlwx9
DELETE
api/users/{id} - api/users/O2axkdlwx9
Thêm 1 phần recommend nữa là trong khi xử lý code thì bạn nên để phần hashId này ở phần xử lý layer presentation.
Python:
C#:
Java:
JS: