2016-07-22 2 views
-1

다른 웹 사이트 (CSRF 공격) 보낸 게시물 요청을 해제하고 싶습니다 : (내가 csrf 토큰을 설정 싶지 않아 입력에 대한 내 양식)세션 (PHP 보안)

사용자 로그인 후 csrf 토큰을 설정하면 허용됩니까? 감사합니다.

+0

양식에 CSRF 토큰을 사용하지 않는 이유는 무엇입니까? 아무것도 없기 때문에 양식이 많아서 –

+0

@ClaudioPinto가 없습니다! –

+0

글쎄, 그럼 안전하지 않은 시스템이 생길거야. 그런 종류의 리팩토링을하는 것은 어렵지 않습니다. 일종의 프레임 워크와 MVC 방식을 사용하면 1 시간 내에 100 개의 폼을 수행 할 수 있습니다. CSRF는 임시 토큰입니다. 그게 바로 –

답변

0

CRSF를 피하려면 좋은 옵션이 없습니다. $_SERVER['HTTP_REFERER'] 변수는 종종 설정되며 일반적으로 요청이 발생한 웹 사이트에 해당하므로 일부 외국어 요청을 개 차단할 수 있습니다. 그러나 브라우저에서 오는 모든 데이터와 마찬가지로 검증 없이는 신뢰할 수 없으므로 안전한 것으로 간주해서는 안됩니다. The docs say :

이것은 사용자 에이전트가 설정합니다. 모든 사용자 에이전트가이를 설정하는 것은 아니며 일부는 HTTP_REFERER를 기능으로 수정할 수있는 기능을 제공합니다. 짧은, 그것은 정말로 신뢰할 수 없습니다.

CSRF 검사는 외부 도메인이 요청하지 못하게하는 가장 좋은 옵션입니다. 원하지 않는다면 양식에 입력 할 필요가 없습니다.

1. 사용자가 로그인하면 PHP의 setcookie을 사용하여 쿠키에 토큰을 저장할 수 있습니다. 만료 날짜와 함께, 사용자 세션에 일치하는 토큰을 저장 사이트가 요청을

$token = '...'; //<- look up how to generate a good random token 
$expire = time()+1800; //expire in 30 minutes 
setcookie("XSRF-TOKEN", $token, $expire); /* expire in 1 hour */ 
$_SESSION['XSRF-TOKEN'] = ['token'=>$token, 'exp'=>$expire]; 

2, document.cookie에서 토큰을 읽고 동일한 값으로 아래의 헤더를 설정하는 자바 스크립트를 사용하여 :

X-XSRF-TOKEN: 43b7acd76d6.... 

큰 웹 사이트를 업데이트해야하는 걱정이 있다면 가장 좋은 방법입니다. HTTP 요청을 할 때마다 Javascript 기능을 실행하도록 브라우저에 지시 할 수 있습니다. 이 함수는 쿠키를 읽고 헤더를 설정할 수 있습니다. 많은 프레임 워크가이 작업을 수행하지만 바닐라 JS의 경우 this resource을 확인하십시오.

3. PHP 스크립트가 요청을받을 때마다 먼저이 헤더의 값을 찾아 사용자 세션에 저장 한 값과 비교하십시오. 만료를 확인하는 것을 잊지 마십시오! XSRF-TOKEN 쿠키를 읽을 수

$request_token = apache_request_headers()['X-XSRF-TOKEN']? : null; 
$session_token = $_SESSION['XSRF-TOKEN']; 
if($request_token===null) die('Token is missing'); 
if($session_token['exp'] < time()) die('Token has expired'); 
if($session_token['token']!==$request_token) die('Token is invalid'); 
//safe to continue. Repeat step 1 to set a fresh token 

만 도메인은 헤더에 설정 할 값을 알 수 있습니다. 브라우저는 한 도메인이 다른 도메인의 쿠키를 읽을 수 없도록하기 때문에이 메커니즘은 잘못된 원본 요청으로부터 사용자를 보호합니다. 그리고 물어 보면 csrf 비트가 양식에서 제외됩니다.

+0

덕분에 그냥 세션 변수입니다. 하지만 XSS 공격에서 이런 식으로 안전합니다 : ? –

+0

아니요. 'XSS'는 (는) 다른 공격 클래스이며 사용자가 요청한 것과 완전히 다른 주제입니다. "* 외국 웹 사이트 및 앱의 게시물 요청 사용 안 함 *"은 'CSRF'에 관한 것입니다. 폼에 토큰을 두는 것은'XSS'로부터 당신을 보호하지 못합니다. – BeetleJuice

+0

나는 xss에 대한 자바 스크립트에서 액세스 쿠키를 사용하지 못하게하고 싶다. 하지만 당신은 (귀하의 사이트가 요청할 때 document.cookie에서 토큰을 읽고 Javascript를 사용하여 정확한 값으로 머리글을 설정하십시오 :) 만약 내가 주니어 인 경우 @ BeetleJuice –