2012-04-27 31 views
6

Tôi đang sử dụng hàm PHP getLoginUrl() của PHP hoạt động hoàn hảo để đăng nhập người dùng. Khi người dùng được chuyển hướng trở lại trang của tôi, URL có thể có hai dạng, xem trong phần phụ của liên kết sau đây 3: http://developers.facebook.com/docs/authentication/server-side/Facebook PHP SDK - getLoginUrl() - giá trị trạng thái

Một phần của URL trả về là một trạng thái = giá trị. Giá trị này là nghĩa vụ phải được sử dụng để ngăn chặn trang web Hội Chữ thập Yêu cầu giả mạo: http://developers.facebook.com/docs/reference/dialogs/oauth/

Mặc dù, sử dụng phương pháp getLoginUrl() Tôi không bao giờ có thể thiết lập một giá trị nhà nước vì nó không phải là một trong những thông số: http://developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

Vậy làm thế nào thế nào tôi có thể sử dụng giá trị nhà nước để đăng nhập một người dùng vào facebook và ngăn chặn CSRF?

+0

Tôi đã tự hỏi này quá. Một cái gì đó tôi đang làm bây giờ đi một cái gì đó như thế này: (Tôi chắc chắn theres một cách tốt hơn chính xác hơn) '$ loginUrl = $ facebook-> getLoginUrl (mảng ('scope' => 'email', 'redirect_uri' => FACEBOOK_REDIRECT_URL)); $ _SESSION ['state'] = $ _SESSION ['fb _'. FACEBOOK_APP_ID .'_ state ']; '. Sau đó, khi xác thực sau khi chuyển hướng quay lại trang web của bạn: 'if ($ _ SESSION ['state'] == $ _REQUEST ['state']) {// not CSRF}' – uguMark

Trả lời

3

Vậy làm cách nào tôi có thể sử dụng giá trị trạng thái để đăng nhập người dùng vào facebook và ngăn CSRF?

Điều này đang được xử lý tự động bởi Facebook PHP SDK. Nếu bạn sắp viết số điện thoại riêng của mình API tới Facebook, bạn cần phải gửi số state theo cách thủ công (nếu muốn) theo tài liệu OAuth của Facebook.

Khi bạn tạo một url đăng nhập với BaseFacebook::getLoginUrl(), điều đầu tiên các chức năng thực hiện là thiết lập CSRF trạng thái thẻ , mà tạo ra một băm sử dụng PHP của lõi mt_rand(), uniqid()md5() chức năng và cũng lưu trữ các giá trị như một phiên biến.

Khi người dùng được chuyển hướng trở lại trang của bạn, FBSDK sẽ kiểm tra xem số state đã gửi có khớp với giá trị state trong phiên không. Nếu các giá trị thực sự khớp, thì state sẽ bị xóa khỏi đối tượng Facebook và từ phiên, do đó, tất cả các yêu cầu getLoginUrl() tiếp theo sẽ nhận được biến số state mới.

Về mặt lý thuyết bạn có thể sử dụng giá trị state của riêng bạn với FBSDK bằng cách viết nó để fb_<your_app_id>_state biến phiên trước khi xây dựng Facebook -object, như xây dựng các 's BaseFacebookestablishCSRFTokenState() cả kiểm tra xem state đã tồn tại trong phiên.

Nhưng điều đó có lẽ sẽ giới thiệu sự phức tạp hơn mức cần thiết.

 


  1. thấy BaseFacebook::establishCSRFTokenState()
  2. thấy BaseFacebook::getCode()
Các vấn đề liên quan