Chào buổi sáng,
Em làm 1 web API, có những API public như xem danh sách sản phẩm, xem dach mục bài viết, … trả về JSON và em không dùng phương thức bảo mật cho mấy API public này. Phần giao diện web em chỉ load JSON từ API này và định dạng CSS. Nhưng chỉ muốn API chỉ được phần front-end truy cập thì em có cần dùng JWT cho mấy API này không ạ (vì nếu người ta muốn cướp content thì chỉ cần vào API không tốn công crawl web).
Em cảm ơn
Hướng dẫn bảo mật API chống lộ Endpoint?
vậy phải dùng JWT cho tất cả API thôi
Mình thấy không ổn. VD mình có API public GET https://shop.com/api/products?page=1
trên server có token phải fix cứng là xxx, client gửi request lên server phải kèm token xxx trong header thì người ta vẫn bắt được request đó rồi tìm ra xxx sau đó giài lập một cái request giống y như vậy. Vậy là web sẽ dễ bị crawl
Hi bạn,
- Bạn cần phải hiểu rõ bản chất JWT là gì trước đã , về phần này thì mình không bàn sâu trong topic này.
- Để trả lời cho câu hỏi của bạn:
- Đó chính là CORS (Cross-Origin Resource Sharing)
https://en.wikipedia.org/wiki/Cross-origin_resource_sharing - Được sử dụng phổ biến ở các trang lớn như FB, INSTAGRAM, …
VD: Nếu bạn từ domain khác như : facebook1.com chẳng hạn.
Bạn sẽ không thể gọi tới bất cứ các API nào từ FB. Ngoài các API public cho developer theo web:https://developers.facebook.com/docs/
Chúc bạn học tốt
Dạ kông phải mọi người ơi. Ý em là khi người ta muốn crawl một website nếu web đó toàn HTML thì tốn công bóc tách, còn nếu web em dùng RESTful API thì dễ crawl hơn vì tìm được link API rồi giải lập ra request thì server sẽ trả về data dạng JSON luôn giống như test trên postMan vậy á, đỡ tốn công tách thẻ HTML. Giống như bài viết này ạ https://medium.com/@geneng/web-crawling-made-easy-with-scrapy-and-rest-api-ed993e84abd3
có một cách đó là xài token bí mật set từ cookie. token này sẽ được init lần đầu tiên khi user vào trang home. nếu user tự nhiên vào 1 trang bất kỳ nào khác home mà ko có cookie, bạn đành chấp nhận cho người dùng giải captcha. hy sinh UX nhưng bảo mật được API
để tránh trường hợp cào liên tục 1 cookie thì bạn set expire cho cookie là xong.
Bác trên kia trả lời dùng CORS là chuẩn rồi, không biết bạn đã tìm hiểu hay chưa.
Hi bạn , qua câu trả lời của bạn. Mình có vài thắc mắc như sau:
- Nếu bạn đã trả lời như vậy thì bạn chưa đọc qua link mình gửi về CORS đúng không ?
- Hay là bạn đọc mà chưa hiểu ?
- Bạn hiểu được bản chất của API chưa ?
- Bạn biết khái niệm crawl là gì chưa?
Mong nhận câu trả lời sớm từ bạn ^^
CORS thì làm gì chặn được crawler. bạn ấy sợ crawler cơ mà. crawler có request trên browser đâu mà CO với chả RS
Mình đã đọc rồi nhưng chưa rõ lắm, domain của mình là abc.com nhưng mình gọi GET method cho api abc.com/api/news/?page=1 trong postman nó vẫn trả về JSON, mình có một project khác là trang báo SPA bằng reactJS xyz.com gọi đến API của abc.com để lấy dữ liệu hiển thị. Nhưng nếu bạn biết được endpoint API abc.com/api/news/?page=1 của mình bạn sẽ viết 1 trang báo fake mà bạn lấy data từ trang của mình hoặc là bạn viết 1 tool gì đó chỉ cần thay ?page=1,2,34,....
là lấy được sạch dữ liệu trong database của mình.
Mình mới học API, web mình thiết kết đơn gian là gọi đến endpoint news/?page=1
thì server trả về list JSON danh sách bài báo. (GET)
crawl là chọc thẳng vào cây DOM của web parse HTML ra để bóc tách dữ liệu. MÌnh không biết trường hợp của mình mô tả thể nào nhưng web chính của mình là xyz.com bật F12 lên là thấy nó gọi đến abc.com/api/news/?page=1 và người ta cũng sẽ làm như vậy với kmn.com, xyzFake.com, …
À mình cũng có làm một app di động (cũng cái web đó nhưng phiên bản mobile app) cũng gọi đến abc.com/api/news/?page=1 và người ta biết được link abc.com/api/news/?page=1 cũng sẽ clone được app của mình. Mình gặp vấn đề là cái link API abc.com/api/news/?page=1 nó đang public ai gọi đến nó cũng trả dữ liệu về, nếu mình chèn token là “xxxyyyzzz” vô thì bạn cũng có thể giải lập 1 cái request y như vậy để bỏ vô tool. Mình làm xong rồi giờ không biết fix sao mong được giúp đỡ
Đọc và hiểu title không vậy ??? Hay là đọc hiểu có vấn đề
API của mình làm giống như này https://jsonplaceholder.typicode.com/posts (link này xem được) chỉ cần gọi tới là “lòi” hết data ra rồi
Mình nghĩ ra cách này, bạn tạo một key bí mật VD “This-is-serect-key” rồi bỏ key này vô app phía client của bạn ( app mobile, trang SPA) mỗi request gửi lên phải kèm theo key bí mật này, server sẽ check key bí mật, nếu key đúng thì là hàng real đang gọi API còn nếu sai thì là hàng fake đang gọi trái phép API. Mà nếu xài tool bắt request VD phần mềm netCapture chắc cũng bị lộ key đó à. Mà nếu cho key này vô header thì càng dễ lộ
Thường thì cậu nên bảo mật tất cả các API public. Có nhiều cách để cậu thực hiện việc này, tùy vào yêu cầu secure của cậu đối với API.
Nếu cậu có yêu cầu cao, cậu có thể cân nhắc cài đặt HMAC authentication xem.
Không phải crawl kiểu crawl HTML ạ, ví dụ như API có Bearer Authentication thì user giải lập ra cái request dùng chính token của mình là giống y như chạy trên web là server response rồi. Mà cái CORS chỉ có tác dụng trên trình duyệt thôi á (Ví dụ domain A mà call api trái phép domain B sẽ bị dính CORS của B, nhưng CORS của B không có tác dụng với tool Postman). cái này gọi crawl thì không đúng lắm, chắc phải gọi là chôm data từ public API
Chắc chỉ còn cách này thôi ạ
Cảm ơn tất cả mọi người nhé
Người ta phản biện đúng rồi, CORS chỉ có tác dụng với browser còn với các tool khác (Postman, curl, …) thì vô dụng vì chỉ có browser là implement CORS policy, ngoài ra mục đích CORS không phải sinh ra để bảo vệ server hay API từ server đó mà là bảo vệ end user nên cách bạn chỉ chủ thớt là vô dụng và nó không giúp ích gì cả