2011-10-18 3 views
0

현재 페이스 북 인증을 사용하여 웹 사이트를 구축 중입니다. 로컬에서 실행 중이며 CSRF 오류가 계속 발생합니다. 나는 그들의 CSRF 보호 메커니즘을 이해하려고 노력하고 있어요 :페이스 북 인증 및 CSRF 메커니즘

$code = $_REQUEST["code"]; 

$_SESSION['state']= $_REQUEST['state'];//GETS SITE WORKING BUT UNSAFE!!!/// 

if(empty($code)) { 
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 

$dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
    . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
    . $_SESSION['state']; 

echo("<script> top.location.href='" . $dialog_url . "'</script>"); 
} 

if($_REQUEST['state'] == $_SESSION['state']) { 

은 무엇 발생하면이 설정되어 내 $ _REQUEST [ '상태'] 보이지만 내 $ _SESSION [ '상태']되지 않는 것입니다. 따라서 그것을 얻으려면 나는 둘을 똑같이 설정하는 선을 가지고있다. 내 $ code 변수는 결코 비어있는 것처럼 보이지 않으므로 새로운 $ _SESSION [ 'state'변수가 설정되지 않습니다.

먼저 $ _REQUEST [ 'code']의 역할은 무엇입니까 /이 변수는/set의 어디에서 왔습니까?

내 안전하지 않은 코드 줄을 수정하는 방법에 대한 아이디어가 있으십니까?

p.s 나는 FB sdk를 사용해야한다고 알고 있지만 웹 디자인/보안을 배우기 때문에 이것이 어떻게 작동 하는지를 배우기위한 좋은 연습입니다 !!

많은 감사 샘 관심 누구에게도


, 나는 여전히 작동 방법을 일하지만, 한 어쨌든

CSFR 보호 시스템에 의해 작동 ... 내 문제를 해결하지 않은 $ _SESSION [ 'state']에서 서버 측에 State ID를 저장하면 $ _REQUEST [ 'state'] 내에도 동일한 ID가 저장되므로 클라이언트 측에서도 마찬가지입니다. 따라서 CSRF 공격이 발생하면 CSRF 공격 (클라이언트 측)의 상태 값이 $ _SESSION [ 'state']의 상태 값과 일치하지 않으므로 코드가 진행되지 않고 공격이 차단됩니다.

내가 잘못하면 저를 교정하십시오!

답변

0

설명은 기본적으로 정확합니다. 사이트 ($ _REQUEST [ 'state'])로 리디렉션 된 URL의 상태 값은 Facebook에 처음 리디렉션 될 때 할당 된 상태 값과 일치해야합니다 ($ _SESSION [ 'state']). 일치하지 않으면 일부 "조작"이 발생하여 진행하지 않아야합니다.

$ 코드가 비어 있지 않으므로 $ _SESSION [ 'state']이 설정되지 않았다고합니다. 그렇다면 Facebook으로의 리디렉션은 어떻게 발생합니까?

일반적으로 세션 값이 유지되지 않는 것 같습니다. 이 사이트가 세션을 사용하는 유일한 장소입니까?

문제가있는 세션은 필요하지 않습니다. 데이터베이스를 설정했다면 쉽게 사용할 수 있습니다. 또는 수신 한 상태 값이 실제로 의도 한 시퀀스의 일부로 코드에 의해 생성되었다고 합리적으로 확신 할 수있는 방법을 생각한다면 로컬 저장소를 완전히 피할 수 있습니다. 예를 들어 상태 값을 타임 스탬프의 md5와 비밀 문자열을 더한 값으로 연결 한 현재 타임 스탬프로 설정할 수 있습니다. 상태 값이 돌아 오면 먼저 타임 스탬프 부분을 확인하여 마지막 순간에 생성 된 부분인지 확인한 다음 md5가 다른 사람이 생성하지 않았는지 확인합니다. 그렇게하면 미리 추측 할 수없고 재사용 할 수없는 간단한 토큰을 갖게됩니다. 이는 CSRF 예방을위한 두 가지 기본 요구 사항입니다.

+0

네, 맞습니다. $ _SESSIONs이 (가) 제대로 작동하지 않아 다른 사용자 페이지를 통합했다는 것을 알았습니다. 내 쿠키가 제대로 작동하지 않는 것 같지만 문제가 해결되어 해결되었습니다. 나는 이것을 로컬 서버에서 실행하는 어색함에 맡기고있다. –

+0

세션이 달리 작동하지만 여기에서 문제가 발생하는 경우이 목적을 위해 너무 많은 시간을 할애하지 않아도됩니다.나는 당신이 고려할지도 모르는 몇 가지 다른 옵션으로 나의 대답을 약간 편집했다. –