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.

Tạo bằng chứng

Lệnh gọi trong PHP sẽ có dạng như mã mẫu dưới đây:

$appsecret_proof= hash_hmac('sha256', $access_token, $app_secret);

Thêm bằng chứng

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:

curl \ -F 'access_token=ACCESS-TOKEN' \ -F 'appsecret_proof=APP-SECRET-PROOF' \ -F 'batch=[{"method":"GET", "relative_url":"me"},{"method":"GET", "relative_url":"me/accounts"}]' \ https://graph.facebook.com

Yêu cầu bằng chứng

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:

  • Đối với các ứng dụng có URI chuyển hướng động, hãy dùng thông số state để chuyển thông tin động trở lại một số URI chuyển hướng giới hạn. Sau đó, thêm từng URI chuyển hướng giới hạn vào danh sách URI chuyển hướng OAuth hợp lệ.

  • Đối với các ứng dụng có một số URI chuyển hướng giới hạn, hãy thêm từng URI đó vào danh sách URI chuyển hướng OAuth hợp lệ.

Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng
  • Đối với các ứng dụng chỉ dùng Facebook JavaScript SDK, lưu lượng truy cập chuyển hướng đã được bảo vệ. Bạn không cần hành động gì thêm.

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.

Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng

Cách thức hoạt động của Chế độ nghiêm ngặt

Chế độ 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 SDK

JavaScript 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.

  • Sử dụng mã truy cập ngắn hạn do mã tạo cho ứng dụng thay vì mã do ứng dụng tạo hoặc mã dài hạn do máy chủ cung cấp. Quy trình lấy mã truy cập ngắn hạn do mã tạo yêu cầu máy chủ ứng dụng đổi mã lấy mã truy cập. Điều đó an toàn hơn lấy mã truy cập trong trình duyệt. Ứng dụng nên ưu tiên sử dụng quy trình này bất cứ khi nào có thể để an toàn hơn. Nếu một ứng dụng chỉ bật quy trình này, phần mềm độc hại chạy trên máy tính của người dùng sẽ không thể lấy mã truy cập để sử dụng sai mục đích. Hãy tìm hiểu thêm trong tài liệu về mã truy cập của chúng tôi.

  • Tắt phương thức Đăng nhập OAuth ứng dụng nếu ứng dụng của bạn không dùng. Đăng nhập OAuth ứng dụng là nút chuyển bật tắt chung để dùng quy trình lấy mã ứng dụng OAuth. Nếu ứng dụng của bạn không dùng bất kỳ quy trình OAuth ứng dụng nào, bao gồm SDK Đăng nhập bằng Facebook, bạn nên tắt quy trình này. Tuy nhiên, lưu ý rằng bạn không thể yêu cầu quyền cho mã truy cập nếu đã tắt phương thức Đăng nhập OAuth ứng dụng. Cài đặt này nằm trong phần Sản phẩm > Đăng nhập bằng Facebook > Cài đặt của Bảng điều khiển ứng dụng.

    Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng

  • Tắt quy trình OAuth trên web hoặc chỉ định danh sách cho phép chuyển hướng. Với cài đặt phương thức Đăng nhập bằng OAuth trên web, bất kỳ quy trình lấy mã ứng dụng OAuth nào dùng hộp thoại đăng nhập trên web của Facebook đều có thể trả về mã cho trang web của riêng bạn. Cài đặt này nằm trong phần Sản phẩm > Đăng nhập bằng Facebook > Cài đặt của Bảng điều khiển ứng dụng. Hãy tắt cài đặt này nếu bạn không tạo quy trình đăng nhập tùy chỉnh trên web hoặc sử dụng SDK Đăng nhập bằng Facebook trên web.

    Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng

  • Thực thi HTTPS. Cài đặt này yêu cầu HTTPS đối với Chuyển hướng OAuth, đồng thời yêu cầu lệnh gọi Facebook JavaScript SDK trả về hoặc yêu cầu mã truy cập chỉ từ các trang HTTPS. Tất cả các ứng dụng mới được tạo kể từ tháng 03/2018 đều có cài đặt này theo mặc định. Bạn nên có kế hoạch chuyển mọi ứng dụng hiện có sang chỉ dùng URL HTTPS chậm nhất vào ngày 06/10/2018. Hầu hết các máy chủ ứng dụng đám mây lớn đều cung cấp cấu hình của chứng chỉ TLS tự động và miễn phí cho ứng dụng của bạn. Nếu tự lưu trữ ứng dụng hoặc dịch vụ lưu trữ của bạn không cung cấp HTTPS theo mặc định, bạn có thể lấy chứng chỉ miễn phí cho (các) miền của mình từ Let's Encrypt.

    Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng

  • Tắt quy trình OAuth trên trình duyệt đã nhúng nếu ứng dụng của bạn không dùng. Một số ứng dụng gốc trên máy tính và di động xác thực người dùng bằng cách thực hiện quy trình ứng dụng OAuth trong chế độ xem web được nhúng. Nếu ứng dụng của bạn không làm vậy, hãy tắt cài đặt này trong phần Sản phẩm > Đăng nhập bằng Facebook > Cài đặt trong Bảng điều khiển ứng dụng.

    Vô hiệu hóa tính năng đăng nhập Facebook từ trình duyệt được nhúng

  • Tắt quy trình đăng nhập một lần trên di động nếu ứng dụng không dùng. Nếu ứng dụng của bạn không sử dụng phương thức Đăng nhập bằng iOS hoặc Android, hãy tắt cài đặt "Đăng nhập một lần" trong phần iOS và Android của Cài đặt > Cơ bản.

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:

  • Cơ bản > Khóa bí mật của ứng dụng nếu khóa bí mật của ứng dụng bị xâm phạm, bạn có thể đặt lại tại đây.

  • Cơ bản > Miền ứng dụng sử dụng tùy chọn này để khóa các miền và miền con có thể được dùng để thực hiện phương thức Đăng nhập bằng Facebook thay cho ứng dụng của bạn.

  • Nâng cao > Loại ứng dụng khi bạn tạo ứng dụng gốc cho di động hoặc máy tính và đưa khóa bí mật của ứng dụng vào, hãy đặt tùy chọn này thành Native/Desktop để bảo vệ ứng dụng khỏi bị giải mã và khóa bí mật của ứng dụng khỏi bị đánh cắp.

  • Nâng cao > Danh sách IP máy chủ cho phép chỉ định một danh sách cho các địa chỉ IP mà từ đó có thể thực hiện lệnh gọi API Đồ thị bằng khóa bí mật của ứng dụng. Lệnh gọi API Đồ thị được thực hiện bằng khóa bí mật của ứng dụng từ ngoài phạm vi này sẽ không thành công. Lệnh gọi được thực hiện bằng mã truy cập của người dùng không chịu ảnh hưởng của cài đặt này.

  • Nâng cao > Cập nhật danh sách IP cài đặt cho phép khóa các địa chỉ IP mà từ đó một người có thể sửa đổi những cài đặt ứng dụng này thành một phạm vi cụ thể. Hãy thận trọng khi thiết lập danh sách IP cho phép bằng băng thông rộng cho khu dân cư. Nếu địa chỉ IP thay đổi, bạn sẽ mất khả năng chỉnh sửa cài đặt của ứng dụng.

  • Nâng cao > Cập nhật email thông báo thông báo cho một địa chỉ email mỗi khi có thay đổi về cài đặt ứng dụng trong Bảng điều khiển ứng dụng.

  • Nâng cao > Bảo mật URL bài viết trong luồng tùy chọn này sẽ ngăn ứng dụng đăng bất kỳ URL nào không hướng về miền mà ứng dụng đó sở hữu. Không phải lúc nào điều này cũng hữu ích, đặc biệt nếu bạn biết ứng dụng của mình sẽ đăng liên kết đến các trang web khác.