Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng
Từ sự kiện F8 2015, Jonathan Gross và Brent Dorman đã xem xét những cách tăng cường bảo mật cho tiện ích tích hợp Đăng nhập bằng Facebook. Khóa bí mật của ứng dụng được dùng trong một số quy trình Đăng nhập nhằm tạo mã truy cập. Bản thân Khóa bí mật cũng được dùng để đảm bảo chỉ những người được tin cậy mới có thể dùng Ứng dụng của bạn. Khóa bí mật có thể được dùng để dễ dàng tạo Mã truy cập ứng dụng. Mã này có thể gửi yêu cầu API thay cho bất kỳ người dùng ứng dụng nào, cho nên đảm bảo Khóa bí mật của ứng dụng không bị xâm phạm là việc cực kỳ quan trọng. Do đó, Khóa bí mật của ứng dụng hoặc Mã truy cập ứng dụng không được nằm trong mã nào. Bạn chỉ nên dùng trực tiếp Mã truy cập ứng dụng từ máy chủ của ứng dụng để cung cấp phương thức bảo mật tốt nhất. Đối với ứng dụng gốc, bạn chỉ nên kết nối ứng dụng với máy chủ của chính mình, sau đó máy chủ gửi yêu cầu API đến Facebook bằng Mã truy cập ứng dụng. Vì lý do này, nếu "Loại ứng dụng" trong phần Cài đặt nâng cao của Bảng điều khiển ứng dụng được đặt thành Native/Desktop, chúng tôi sẽ giả định rằng ứng dụng gốc của bạn chứa Khóa bí mật của ứng dụng hoặc Mã truy cập ứng dụng trong file nhị phân, đồng thời không cho phép các lệnh gọi được ký bằng Mã truy cập ứng dụng tiếp tục. API sẽ hoạt động như thể không được cung cấp mã truy cập. Nếu Khóa bí mật của ứng dụng bị xâm phạm, bạn nên đặt lại khóa bí mật ngay trong phần Cài đặt cơ bản của Bảng điều khiển ứng dụng. Khi bắt đầu quy trình đặt lại, bạn có thể chỉ định số giờ mà khóa bí mật bị xâm phạm sẽ tiếp tục hoạt động khi gửi yêu cầu. Tuy nhiên, mọi nội dung được gửi từ Facebook (chẳng hạn như yêu cầu đã ký) sẽ dùng ngay khóa bí mật mới, nên bạn phải điều chỉnh mã để điều này xảy ra sớm nhất có thể. Bạn có thể giảm khả năng bị spam và nhiễm phần mềm độc hại bằng cách yêu cầu lệnh gọi giữa các máy chủ đến API của Facebook phải được ký bằng thông số appsecret_proof. Bằng chứng khóa bí mật của ứng dụng là một hash sha256 của mã truy cập, sử dụng khóa bí mật của ứng dụng làm khóa. Bạn có thể tìm thấy khóa bí mật của ứng dụng trong bảng điều khiển ứng dụng ở phần Cài đặt > Cơ bản. Lệnh gọi trong PHP sẽ có dạng như mã mẫu dưới đây: Bạn hãy thêm kết quả làm thông số appsecret_proof cho từng lệnh gọi mình thực hiện: Trong phần Cài đặt > Nâng cao của bảng điều khiển ứng dụng ở phần Bảo mật, bạn hãy bật cài đặt Yêu cầu khóa ứng dụng. Khi bạn bật cài đặt này, chúng tôi sẽ chỉ cho phép các lệnh gọi API có chứa appsecret_proof. Trong một số cấu hình, các ứng dụng sẽ tái sử dụng mã dài hạn trên nhiều ứng dụng. Bạn không nên làm điều này. Thay vào đó, hãy dùng mã ngắn hạn được tạo bằng quy trình lấy mã như mô tả trong tài liệu về mã truy cập của chúng tôi. Để hiểu cách vấn đề này xảy ra, hãy tưởng tượng một ứng dụng gốc chạy trên iOS muốn thực hiện lệnh gọi API, nhưng thay vì gọi trực tiếp lại kết nối với máy chủ thuộc sở hữu của chính ứng dụng đó và chuyển cho máy chủ đó một mã được tạo bằng iOS SDK. Sau đó, máy chủ sẽ dùng mã này để thực hiện lệnh gọi API. Điểm cuối mà máy chủ dùng để nhận mã có thể bị xâm phạm và người khác có thể chuyển mã truy cập cho ứng dụng hoàn toàn khác vào điểm cuối đó. Điều này rõ ràng là không an toàn, nhưng có một cách để tránh, đó là tuyệt đối không giả định rằng mã truy cập đến từ ứng dụng đang dùng mã đó. Thay vào đó, bạn nên kiểm tra bằng cách sử dụng điểm cuối gỡ lỗi. Nếu bạn không dùng Facebook SDK, hãy thường xuyên kiểm tra xem mã truy cập có hợp lệ không. Mặc dù mã truy cập hết hạn theo lịch, nhưng các mã có thể bị hết hạn sớm vì các lý do bảo mật. Nếu không sử dụng Facebook SDK trong ứng dụng, bạn nên thường xuyên kiểm tra tính hợp lệ của mã theo cách thủ công – ít nhất là hàng ngày – để đảm bảo rằng ứng dụng của bạn không dựa vào một mã đã hết hạn sớm vì lý do bảo mật. Chế độ nghiêm ngặt giữ an toàn cho các ứng dụng bằng cách ngăn chặn kẻ xấu tấn công quá trình chuyển hướng của bạn. Mọi ứng dụng đều phải bật Chế độ nghiêm ngặt. Trước khi bật Chế độ nghiêm ngặt trong Bảng điều khiển ứng dụng, hãy đảm bảo lưu lượng truy cập chuyển hướng hiện tại của bạn vẫn hoạt động bằng cách thực hiện các hành động sau trong phần cài đặt phương thức Đăng nhập bằng Facebook:
Sau khi thực hiện những hành động này, bạn hãy nhớ bật chế độ nghiêm ngặt. Cách thức hoạt động của Chế độ nghiêm ngặtChế độ nghiêm ngặt ngăn chặn việc tấn công URI chuyển hướng của bạn bằng cách yêu cầu khớp chính xác trong danh sách URI chuyển hướng OAuth hợp lệ. Ví dụ: nếu danh sách của bạn chứa www.example.com, Chế độ nghiêm ngặt sẽ không cho phép www.example.com/token là chuyển hướng hợp lệ. Chế độ này cũng sẽ không cho phép bất kỳ thông số truy vấn bổ sung nào không có trong danh sách URI chuyển hướng OAuth hợp lệ. Sử dụng HTTPS – thay cho HTTP – làm giao thức Internet, vì giao thức này sử dụng phương thức mã hóa. HTTPS giữ sự riêng tư cho dữ liệu được truyền tải và bảo vệ khỏi các hành vi nghe trộm. Giao thức này cũng ngăn chặn việc giả mạo dữ liệu trong quá trình truyền tải bằng cách thêm quảng cáo hoặc mã độc hại chẳng hạn. Kể từ ngày 06/10/2018, tất cả ứng dụng đều phải sử dụng HTTPS. Khi cho biết rằng bạn sẽ dùng JavaScript SDK để đăng nhập bằng cách đặt nút chuyển Đăng nhập bằng JavaScript SDK thành "có", miền của trang lưu trữ SDK phải khớp với một trong các mục trong danh sách Miền được phép cho JavaScript SDK. Điều này đảm bảo rằng mã truy cập chỉ được trả về cho những lệnh gọi lại trong các miền được ủy quyền. Chỉ hỗ trợ các trang https cho những hành động xác thực với Facebook JavaScript SDK. Đối với các tiện ích tích hợp JSSDK hiện có được tạo cho đến ngày 10/08/2021, danh sách này sẽ lấy các giá trị dự phòng dựa trên việc sử dụng hiện tại. Bạn không cần phải hành động gì thêm. Đối với các tiện ích tích hợp mới được tạo sau ngày 10/08/2021, bạn phải thêm các giá trị vào danh sách này. Nếu bạn thấy trường miền JSSDK của Ứng dụng chứa các url bắt đầu bằng *., vui lòng thay đổi sao cho trường đó được thay thế bằng các url miền tuyệt đối để tăng cường bảo mật. Các cuộc tấn công chuyển hướng mở xảy ra khi kẻ xấu cung cấp thông số redirect_uri trái phép trong yêu cầu đăng nhập, dẫn đến khả năng thông tin nhạy cảm như mã truy cập bị rò rỉ qua chuỗi truy vấn hoặc phân đoạn trong URI chuyển hướng. Đối với tiện ích tích hợp web tùy chỉnh, bạn nên cung cấp URI chuyển hướng được ủy quyền trong phần cài đặt ứng dụng để ngăn chặn các cuộc tấn công như vậy. Trong khi thực hiện yêu cầu đăng nhập, thông số redirect_uri sẽ được kiểm tra với các mục trong danh sách này. URI đầy đủ phải khớp chính xác, bao gồm tất cả các thông số, ngoại trừ thông số state không bắt buộc, giá trị của thông số này bị bỏ qua. Trình duyệt trong ứng dụng và JavaScript SDKJavaScript SDK thường dựa vào cửa sổ bật lên và lệnh gọi lại để hoàn tất Đăng nhập. Đối với một số trình duyệt trong ứng dụng chặn cửa sổ bật lên, cách này có thể không thành công. Khi điều này xảy ra, SDK sẽ tự động cố gắng chuyển hướng đến trang đã gọi với mã truy cập. SDK chỉ có thể thực hiện chuyển hướng an toàn nếu URI đầy đủ của trang có trong danh sách URI chuyển hướng OAuth hợp lệ. Nếu các tình huống trình duyệt trong ứng dụng quan trọng với ứng dụng web của bạn, bạn nên thêm miền của trang đăng nhập vào Miền được phép, đồng thời thêm URI đầy đủ của trang đăng nhập (bao gồm thông số đường dẫn và truy vấn) vào URI chuyển hướng OAuth hợp lệ. Nếu có nhiều biến thể trong các URI nơi diễn ra hoạt động Đăng nhập cho ứng dụng, bạn có thể tự mình chỉ định fallback_redirect_uri làm tùy chọn trong lệnh gọi FB.login(). Nhờ vậy, bạn chỉ cần thêm một mục đó vào danh sách URI chuyển hướng OAuth hợp lệ của mình. Bật và/hoặc tắt mọi quy trình xác thực mà ứng dụng không dùng để giảm thiểu khu vực bề mặt tấn công.
Với nhiều cài đặt bổ sung trong Bảng điều khiển ứng dụng, nhà phát triển có thể tắt các khu vực bị tấn công, nếu không có thể dẫn đến vấn đề bảo mật:
|