2011-09-07 31 views
5

Tôi đã thực hiện một số tìm kiếm và tôi không tìm thấy bất kỳ điều gì liên quan đến vấn đề của mình.Sự cố với thông tin đăng nhập Facebook không khớp với mã thông báo trạng thái CSRF

Tôi hiện đang cố gắng triển khai đăng nhập Facebook vào trang web của mình và tôi gặp sự cố với xác thực đăng nhập do URL ghi đè htaccess mod?

Mã này hoạt động hoàn hảo và tôi thường xuyên bị thoát trong nếu tôi sử dụng nó mà không cần viết lại quy tắc mod như:

domain.com/view_webhosting.php?webhosting=name 

Nhưng ngay sau khi tôi đi qua để viết lại URL mod

domain.com/webhosting-name/ 

Sau đó, nó không hoạt động và ném một lỗi "mã thông báo trạng thái CSRF không khớp với một cung cấp được cung cấp."

trong file htaccess nó trông giống như

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

Bất cứ này có một giải pháp cho một vấn đề như thế này? Tôi đang sử dụng Facebook SDK v3.1.1

Trả lời

7

Các PHP SDK hy vọng trường 'trạng thái' được trong $ _REQUEST (Tôi tin như một tham số GET) sau khi chuyển hướng trước khi bạn có thể trao đổi 'mã' cho mã thông báo truy cập. Từ base_facebook.php:

protected function getCode() { 
    if (isset($_REQUEST['code'])) { 
    if ($this->state !== null && 
     isset($_REQUEST['state']) && 
     $this->state === $_REQUEST['state']) { 

     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } else { 
     self::errorLog('CSRF state token does not match one provided.'); 
     return false; 
    } 
    } 

    return false; 
} 

RewriteRule của bạn có thể được dẫm vào thông số đó.

2

Tôi cho rằng bạn có nghĩa là SDK PHP?

Có vẻ như bạn không chuyển biến yêu cầu 'trạng thái' sang tập lệnh PHP của mình. Bạn đã đọc số https://developers.facebook.com/docs/authentication/ chưa (cụ thể là các bit và tự bảo vệ mình khỏi CSRF?).

Ngoài ra, tôi cho rằng đây là một lỗi đánh máy trong câu hỏi của bạn, nhưng không nên viết lại quy tắc của bạn là:

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?**webhosting**=$1 [L] 
+0

Xin chào mrtom Vâng xin lỗi thats chỉ là một typ, tôi figured nó sẽ được dễ dàng hơn để đọc khi tôi dịch nó sang tiếng Anh :) Ví dụ im sử dụng là https://github.com/facebook/php-sdk/blob/master/examples/ example.php và không có gì về bảo vệ CSRF? API facebook này rất lạ với các mã khác nhau trên toàn bộ địa điểm. nhưng nó hoạt động đúng khi không sử dụng url viết lại mod ... – John

1

Hãy thử thay đổi RewriteRule của bạn để

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L,QSA] 

QSA = Query String Nối. Điều này đảm bảo bạn không bị mất tham số GET.

7

Cảm ơn bismark.

Bạn đã chính xác; nó không thể có được các thông số GET, và giải pháp là thế này:

Từ

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [L] 

để

RewriteRule ^webhosting-([a-z_0-9-]+)/$ /view_webhosting.php?webhosting=$1 [QSA,L] 

chuỗi truy vấn thêm [QSA]

•'qsappend|QSA' (query string append) 
This flag forces the rewrite engine to append a query string part of the substitution string 
to the existing string, instead of replacing it. Use this when you want to add more data 
to the query string via a rewrite rule. 

Thanks guys , đưa tôi đi đúng hướng!

+1

Nếu bismark là chính xác, nó là tốt đẹp để chấp nhận câu trả lời hoặc ít nhất là bỏ phiếu lên. Tôi đã bỏ phiếu cho câu hỏi của bạn để cung cấp cho bạn một đại diện nhỏ để chơi cùng. – Fionnuala

+0

Xin chào Remou, ur hoàn toàn đúng, im kinda mới vào trang web này vì vậy tôi didnt biết tôi có thể bỏ phiếu hoặc chấp nhận câu trả lời :) – John

0

Nếu ai đó vẫn gặp lỗi này sau tệp .htaccess, tôi sẽ đề nghị thay đổi tham số redirect_uri tại tệp PHP cũng như URL trang web tại cài đặt ứng dụng Facebook.

tôi giải quyết lỗi này thay đổi từ

http:domain.com/folder

để

http:domain.com/folder/index.php

-1

tôi cố định này bằng cách (quên) để phù hợp lên phạm vi/quyền từ một ứng dụng để các điều khoản trên developers.facebook.com/app trang ... (ví dụ: cài đặt ứng dụng, quyền).

+1

Bạn có thể muốn được một chút cụ thể hơn. –

0

Mã SDK của Facebook có lỗi khi kiểm tra mã thông báo hai lần trong cùng một trình xử lý.

Tôi chỉnh sửa các chức năng của getCode facebook.php như thế này:

protected function getCode() { 
    if (!isset($_REQUEST['code']) || !isset($_REQUEST['state']) || $this->state === null) { 
     return false; 
    } 
    if ($this->state === $_REQUEST['state']) { 
     // CSRF state has done its job, so clear it 
     $this->state = null; 
     $this->clearPersistentData('state'); 
     return $_REQUEST['code']; 
    } 
    self::errorLog('CSRF state token does not match one provided.'); 

    return false; 
} 

để được rõ ràng hơn và không nêu một thẻ không hợp lệ nếu gọi là hai lần.

Để được rõ ràng chức năng có thể được gọi hai lần trên xử lý URL tương tự nếu ví dụ:

$facebook->getUser(); và sau đó trong cùng một handler $facebook->getLogoutUrl() thì getCode() được gọi là hai lần như vậy, kết quả vào và thông báo lỗi không hợp lệ

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