2016-08-19 19 views
7

Thỉnh thoảng khi xử lý lỗi trong sản xuất, sẽ thuận tiện khi có thể nhấn máy chủ REST sản xuất của chúng tôi từ môi trường dev cục bộ của mình. Nhưng tôi lo ngại rằng việc thêm localhost vào nguồn gốc được phép sẽ là một nguy cơ bảo mật. Các tìm kiếm đã mang lại thông tin xung đột. Mối quan tâm của tôi có hợp lệ không? Tại sao hay tại sao không?CORS - localhost như được cho phép xuất xứ trong sản xuất

Trả lời

9

Tôi giả sử bạn có

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: https://localhost 

Rủi ro là bất kỳ dịch vụ đang chạy trên máy tính của người dùng một cách hiệu quả có thể bỏ qua các Same Origin Policy cho trang web của bạn.

Vì vậy, nếu bạn có một URL REST của như

https://example.com/User/GetUserDetails 

Một dịch vụ độc hại hoặc tổn hại chạy trên máy tính của người dùng có thể làm cho rằng yêu cầu thông qua trình duyệt của người dùng và sau đó lấy thông tin chi tiết về người dùng, vì cookie xác thực của họ sẽ được thông qua với yêu cầu.

Bây giờ, bạn có thể tranh luận rằng một dịch vụ độc hại đang chạy trên máy tính của người dùng có thể lấy trực tiếp cookie xác thực từ trình duyệt của họ và sau đó tự thực hiện yêu cầu. Tuy nhiên, nếu dịch vụ có một số lỗi của riêng mình (nói XSS), điều này có thể cho phép một trang web khác xâm phạm người dùng thông qua dịch vụ REST của bạn (evil.example.org --XSS-> localhost -CORS-> example.com/User/GetUserDetails).

Một trường hợp khác có thể khiến bạn gặp rủi ro nếu người dùng đang chạy proxy ngược cục bộ để truy cập nội dung nào đó. Điều này sẽ cho phép trang web mục tiêu xâm phạm người dùng thông qua trang web đích của bạn, nếu trang web mục tiêu đó độc hại hoặc bị xâm phạm. Điều này là do người dùng sẽ truy cập vào trang web mục tiêu với tên miền là localhost.

Nếu bạn thực sự cần làm điều này, tôi khuyên bạn nên có tài khoản nhà phát triển đặc biệt cho dịch vụ REST của bạn khi truy cập thêm tiêu đề Access-Control-Allow-Origin: https://localhost vào yêu cầu của bạn. Bằng cách đó, bạn không đặt người dùng khác có nguy cơ vì bạn biết bạn chỉ đang chạy máy chủ front-end chỉ ở số https://localhost để bạn không thể bị xâm phạm bởi cài đặt CORS mở của mình.

Một cách khác có thể là sử dụng một cái gì đó như noonewouldusethis2859282.localhost cho bản sao cục bộ của bạn của giao diện người dùng. Sau đó, bạn có thể thêm tiêu đề Access-Control-Allow-Origin: https://noonewouldusethis2859282.localhost một cách an toàn vì không ai khác sử dụng điều này và sẽ an toàn khỏi các cuộc tấn công của CORS.

0

Không có mối lo ngại về bảo mật nào khi thêm máy chủ cục bộ vào thiết lập CORS của bạn trong quá trình sản xuất.

Bằng cách thêm vào một cái gì đó như:

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: http://localhost:3000 

Trình duyệt hiện đang cho phép thực hiện cuộc gọi từ localhost: 3000 dịch vụ của bạn, bỏ qua Same Origin Policy. Bất kỳ nhà phát triển web nào cũng có thể tạo một trang web chạy từ máy địa phương của họ để thực hiện cuộc gọi đến API của bạn, điều này rất hữu ích cho nhóm của bạn. Tuy nhiên, localhost không phải là publicly routable address - Bạn không thể chia sẻ liên kết đến http://localhost:3000. Hãy nhớ rằng, CORS chỉ là biện pháp bảo mật cho các trình duyệt web thực hiện cuộc gọi đến trang web của bạn. Bất kỳ ai cũng có thể gọi điểm cuối của bạn qua máy chủ đến các cuộc gọi máy chủ (hoặc tập lệnh). Tuy nhiên, bạn nên tránh :

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Origin: * 

Điều này sẽ làm cho trang web của bạn có sẵn cho tất cả các website. Thay vào đó, hãy khóa Access-Control-Allow-Origin của bạn xuống các trang web cần.Thật không may, Access-Control-Allow-Origin chỉ mất một giá trị duy nhất, vì vậy bạn phải xử lý phía máy chủ yêu cầu HOST và trả về giá trị hợp lệ (more info).

xác thực khi gọi một thiết bị đầu cuối CORS

Khi bạn thực hiện một yêu cầu CORS mà yêu cầu xác thực, bạn nên thêm một tiêu đề Authorization vào cuộc gọi, và không đi qua cookie - fetch does this by default. Vì vậy, bất kỳ cuộc gọi nào được thực hiện cho một điểm cuối COR sẽ được thực hiện thông qua javascript thêm một mã thông báo vào tiêu đề mà nó chỉ có cho phiên đó. Nếu bạn lưu trữ mã thông báo qua cookie hoặc localstorage, hãy lưu ý rằng mã thông báo chỉ có thể truy cập từ miền đó (more info). Điểm cuối sản xuất và localhost của bạn sẽ không có cùng cookie và shared localhost.

CORS Vô hiệu hóa trong Chrome

Cuối cùng, bạn có thể thực hiện yêu cầu CORS từ Chrome vào trang web bất kỳ bằng cách bắt đầu với Chrome --disable-web-security (more info).

Cuối cùng, Google Chrome chỉ cho phép nhân viên dịch vụ chạy trên các trang web bảo mật và http://localhost. Nếu bạn chọn tạo một local.example.com để phát triển, bạn sẽ cần tạo một chứng chỉ SSL và thực hiện tất cả cấu hình trên máy cục bộ của bạn để chạy nó. Tôi khuyên bạn chỉ nên sử dụng http://localhost:XXXX.

Các vấn đề liên quan