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
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.
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.
- 1. $ .get - Không được phép xuất xứ
- 2. $ .ajax(): Xuất xứ rỗng không được phép
- 3. Nginx - Cho phép xuất xứ IP
- 4. Yêu cầu xuất xứ không được phép: http: // localhost: 3001 khi sử dụng Rails5 và ActionCable
- 5. Truy cập-điều khiển-cho phép-xuất xứ angular.js chrome
- 6. Cho phép các yêu cầu xuất xứ chéo trong Yesod
- 7. Chính sách xuất xứ tương tự XMLHttpRequest
- 8. ConcurrentQueue cho phép tôi đợi một nhà sản xuất
- 9. Yêu cầu xuất xứ bị chặn: Chính sách xuất xứ giống nhau không cho phép đọc tài nguyên từ xa tại
- 10. Làm cách nào để nắm bắt lỗi Không có quyền truy cập-cho phép-xuất xứ?
- 11. XMLHttpRequest không thể tải Xuất xứ không được phép bởi Access-Control-Allow-Origin
- 12. Không cho phép xuất xứ null bởi Access-Control-Allow-Origin
- 13. Cách đặt điều khiển truy cập cho phép xuất xứ trên tệp cụ thể web.config
- 14. Lỗi 'Không cho phép xuất xứ' do lỗi Access-Control-Allow-Origin '
- 15. yêu cầu xuất xứ chéo bị chặn trong tomcat 8
- 16. CouchDB trong sản xuất
- 17. LAMP, XAMPP cho sản xuất
- 18. Bảng ar_internal_metadata được tạo trong sản xuất?
- 19. Xuất xứ của ": //" trong nhiều cú pháp URI
- 20. Không thể cài đặt Hồ sơ cấp phép sản xuất
- 21. Docker soạn trong sản xuất?
- 22. Lỗi 'Truy cập-Kiểm soát-Cho phép-Xuất xứ' ngay cả sau khi làm theo 2 cách tiếp cận
- 23. Lỗi Truy cập-Kiểm soát-Cho phép-Xuất xứ khi nhận các bài đăng Wordpress trong ứng dụng Phonegap
- 24. Xác thực xuất xứ của FORM POST để đảm bảo xuất xứ từ cùng một máy chủ/ứng dụng
- 25. Chạy Django-Celery trong Sản xuất
- 26. Cách lấy tiêu đề yêu cầu "Xuất xứ" trong Rails
- 27. .htaccess cho phép localhost problem
- 28. Lỗi được sản xuất từ mysql chọn
- 29. System.Diagnostics.Debug.WriteLine trong mã sản xuất
- 30. HtmlUnit + Selenium trong Sản xuất