Cách bảo vệ /api path cho website
Hiện tại em có đang sử dụng docker và hosting server để chạy thử thì có phát hiện ra 1 lỗ hổng là khi client gõ tay /api/.... thì nó có thể access đến backend và trả về data của web do e có cấu hình nginx như sau
location /api/ { rewrite ^/api(/[^/]+)$ $1/ break; rewrite ^/api/(.*)$ /$1 break; proxy_pass http://backendserver/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
Bây giờ em muốn tìm cách mà chỉ FE access được đến và block với client. Mọi người cho em xin ý kiến về trường hợp này với ạ, và tiện cho em hỏi là bình thường có những cách nào thông dụng mà các web hay sử dụng để tránh client access BE.
3 CÂU TRẢ LỜI
CORS chỉ ngăn request cross-origin từ trình duyệt, không chặn được người gõ tay API hay dùng Postman/curl. Muốn bảo vệ API thì phải có cơ chế xác thực (Authorization header + token, JWT, session cookie…). Và nếu BE của bạn đang public port, thì ai cũng có thể thử gọi. Token/Auth chỉ ngăn người chưa login, nhưng API vẫn lộ ra. Giải pháp an toàn hơn là: không expose BE trực tiếp ra Internet. Chạy BE trong private Docker network và chỉ cho Nginx gọi được. Khi đó user không thể gõ thẳng /api trên BE nữa.
Bạn ơi cho mình hỏi là bên BE mình có để trong Dockerfile là
EXPOSE 8000
mà đoạn nginx như trên mà sao nó vẫn giúp client kết nối với BE của mình.
Và cho mình hỏi việc để chung network với nginx có phải là nguyên nhân ko ạ. Minh có để trong docker là
networks:
appnet:
driver: bridge
và toàn bộ container mình đều để trong network này
Phần BE private trong docker network mà chỉ nginx được gọi là như thế nào ạ, em thấy nếu client access được nginx mà nó cùng network bridge với BE thì nó cũng có khả năng kết nối đến BE ấy ạ.
hoạt động như thế là bình thường nha e. dù path path /api có public đi chăng nữa thì api cũng thường được secure bằng authentication/authorization
À tiện cho em hỏi luôn là CORS có giúp chặn api trong trường hợp này không ạ, em có nghe 1 bạn bảo dùng cái này nhưng ko rõ làm kiểu gì ạ, em có thử qua vài kiểu origin thì nó vẫn ko chặn được ạ.
CORS chỉ áp dụng với browser thôi. nên nếu access api bằng client khác ngoài trình duyệt thì không ảnh hưởng gì.
@nphamvn config của em như trên tránh được việc phải config CORS ở backend. anh cũng thường config như của e. Nhưng không hiểu tại sao của e lại có 2 lần rewrite
@nphamvn Dạ thực ra đoạn rewrite đấy là lúc em check repo github để tham khảo xem nên config nginx như nào r hỏi chat tác nên thêm vào thôi ạ, ban đầu là do sau backendserver em ko có / nên có thêm vào để giấu path api, còn h ko cần nữa ạ.
E cảm ơn chia sẻ của anh ạ, em lần đầu làm project web nên cũng muốn tham khảo cách các web khác config và hoạt động thế nào ạ.