2013-10-31 4 views
3

저는 CodeIgniter 2.1.4 버전을 Ion Auth과 함께 사용하고 있으며 모든 것이 훌륭하게 작동했습니다. 어제, Ion Auth를 최신 버전으로 업데이트했는데 사용자 프로필을 "편집"하려고 할 때마다 CSRF 오류가 발생합니다.CodeIgniter 2, Ion Auth가 프로파일 편집시 CSRF 오류 메시지를 표시합니다.

"이 양식 게시물은 보안 검사를 통과하지 못했습니다."

controllers/auth.php 파일을 수정 한 후이 오류가 발생하여 다양한 이온 인증보기가 내 자신의 템플릿에로드됩니다. 결국, 내 사이트 디자인에 그것을 통합 할 수 없다면 무슨 소용이 있겠습니까? 그러나인데, auth.php 컨트롤러가 전혀 수정되지 않은 경우에도 Safari의 이전 버전에서이 오류가 발생합니다.

이것은 컨트롤러 파일 auth.php에 대한 간단한 수정입니다.

$view_html = $this->template->load('default', $view, $this->viewdata, $render); 

예, (/libraries/에있는 Template.php 파일에서) 내 load 기능은 처음부터 잘 일하고있다 (많은

:이 라인으로

$view_html = $this->load->view($view, $this->viewdata, $render); 

:

이 라인을 대체 몇달 전). 새로운 버전의 이온 인증을 사용하더라도 템플릿로드 기능이 작동하지만 ... 위에서 설명한 보안 오류가 계속 발생합니다.


일부 연구를 수행 한 후 오류의 원인은 Ion Auth의 CSRF 보안 루틴입니다. 이 두 함수는 auth.php 컨트롤러에서 호출되며 _valid_csrf_nonce() 함수가 false을 반환 할 때마다 위의 오류를 표시합니다. 임시 (또는 영구적?) 해결 방법으로


function _get_csrf_nonce() 
{ 
    $this->load->helper('string'); 
    $key = random_string('alnum', 8); 
    $value = random_string('alnum', 20); 
    $this->session->set_flashdata('csrfkey', $key); 
    $this->session->set_flashdata('csrfvalue', $value); 

    return array($key => $value); 
} 

function _valid_csrf_nonce() 
{ 
    if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE && 
     $this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue')) 
    { 
     return TRUE; // <-- no error 
    } 
    else 
    { 
     return FALSE; // <-- error 
    } 
} 

, 나는 CodeIgniter의 config/config.php 파일의 라인 298에 "CSRF 보호"옵션을 활성화했습니다.
$config['csrf_protection'] = TRUE; // enabled CSRF protection 
$config['csrf_token_name'] = 'csrf_test_name'; 
$config['csrf_cookie_name'] = 'csrf_cookie_name'; 
$config['csrf_expire'] = 7200; 

은 그 때 나는 항상 함수에서 true를 반환하여 이온 인증의 CSRF 보호를 억제.

function _valid_csrf_nonce() 
{ 
    return TRUE; 
} 

그러나, 난 정말 여기 근본 원인을 이해하고 싶다. 이전 브라우저를 사용하거나 자신의 템플릿에 Ion Auth 뷰를 넣으려는 이유만으로 이러한 CSRF 오류가 발생하는 이유는 무엇입니까? 모든 것이 동일한 도메인을 사용하는 동일한 서버에 있습니다.

(편집 :.. 예, CI session 라이브러리가 자동으로로드 분명히 모든 후, 로그인을 유지할 수 잘 작동되고있다), 나는 근본 원인에 도착했던 적이

답변

9

그러나 내가 가지고 이 중 일부를 설명 할 수있는 이론 :

이온 인증 CSRF 보호는 flashdata에 따라 달라지며, flashdata은 서버에 대한 "다음"호출에만 적용됩니다.내 사용자 정의 템플릿 로더는 페이지가 생성 된 위치에서 처음으로 로더 기능을 호출 한 후 서버를 두 번 호출 할 수 있으며 CodeIgniter의보기 기능을 호출합니다.

그러나이 이론은 실제로 수정 된 버전의 이온 인증이 여전히 Safari에서 실패하는 이유를 설명하지 않습니다. 이 질문에 실질적이거나 결정적인 사항을 추가 할 수 있다면 언제든지 다른 대답을 게시하십시오. CI는 이렇게 프레임 워크로 구축하기 전에 벤 에드 먼 즈, 이온 인증의 개발자로부터 개인 응답으로 당


...

는 "우리는 이온 인증 예에 CSRF 보호를 추가 내장 된 CI의 최신 버전을 사용하고 있다면 Ion Auth 예제 컨트롤러에서 제거하고보기 만하면됩니다. "

이미 최신 버전의 CodeIgniter (2.1.4)를 사용하고 있으므로이 경로를 선택했습니다.

내 OP에서 임시 해결 방법은 지금 영구적 :

나는 CodeIgniter의 설정/config.php 파일에서 라인 298에 "CSRF 보호"옵션을 활성화했습니다.

$config['csrf_protection'] = TRUE; // enabled CSRF protection 

은 그 때 나는 항상이 함수에서 true를 반환하여 이온 인증의 CSRF 보호를 억제.

function _valid_csrf_nonce() 
{ 
    return TRUE; // effectively disables Ion Auth's CSRF protection 
} 

그리고 마지막으로, 대신 CodeIgniter의의 CSRF 보호를 사용하여 주석 개발자 : ".이 응용 프로그램 전반에 걸쳐 통합되어 있기 때문에 쿨, 즉 더 나은 솔루션 어쨌든 정말"