2015-01-09 5 views
0

cURL (아래)을 사용하는 PHP 프록시가 있습니다. POST을 얻을 때마다 헤더 X-CSRF 토큰이 null로 설정됩니다. X-CSRF 토큰은 POST 헤더에서 프록시 사용과 그렇지 않은 유일한 차이점입니다.cURL X-CSRF 토큰 문제

그래서 프록시를 사용하지 않고 X-CSRF 토큰이 올바르게 설정되도록 수정하는 방법을 궁금합니다. 당신은 AJAX를 사용하는

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'); 

$browserRequestHeaders = getallheaders(); 
$curlRequestHeaders = array(); 
foreach ($browserRequestHeaders as $name => $value) { 
    $curlRequestHeaders[] = $name . ": " . $value; 
} 
curl_setopt($ch, CURLOPT_HTTPHEADER, $curlRequestHeaders); 


switch ($_SERVER["REQUEST_METHOD"]) { 
    case "POST": 
    curl_setopt($ch, CURLOPT_POST, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents("php://input")); 
    break; 
    case "PUT": 
    curl_setopt($ch, CURLOPT_PUT, TRUE); 
    curl_setopt($ch, CURLOPT_INFILE, fopen("php://input")); 
    break; 
} 

//Other cURL options. 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt ($ch, CURLOPT_FAILONERROR, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, 0); 

// Cookie cURL options. 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); 

//handle other cookies cookies 
foreach ($_COOKIE as $k=>$v) { 
    if(is_array($v)){ 
    $v = serialize($v); 
    } 
    curl_setopt($ch,CURLOPT_COOKIE,"$k=$v; domain=.$cookiedomain ; path=/"); 
    } 

// Set the request URL. 
curl_setopt($ch, CURLOPT_URL, $url); 

// Make the request. 
$response = curl_exec($ch); 
curl_setopt($ch, CURLOPT_POST, 0); 
$responseInfo = curl_getinfo($ch); 
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
curl_close($ch); 

이미지 보여주는 헤더 http://i.stack.imgur.com/78fVV.jpg

답변

0

클라이언트와 서버 간의 $_SESSION ID를 php에 프록시해야했습니다.

1

호출하고 사진에서 볼 수 있듯이 X-CSRF-Token 헤더는 이러한 호출에 설정되지 않습니다. Adding X-CSRF-Token header globally to all instances of XMLHttpRequest();에 설명 된대로 명시 적으로 설정해야합니다. with (거기에서 복사) :

따라서 수정 사항은 PHP가 아니라 AJAX 호출 코드에 있습니다. token = $('meta[name=csrf-token]').attr('content');을 HTML에서 CSRF 토큰을 얻는 코드로 바꿉니다.

+0

$ ('meta [name = csrf-token]'). attr ('content'); 또한 null을 포함합니다. – Beep

+0

예, 수정 사항에서 제안하는대로 : 실제 HTML에서 작동하는 코드로 대체해야합니다. 웹 사이트에서 반환 된 HTML 소스 코드를보고 유스 케이스에 맞는 요소를 찾아야한다. – user4416936

+0

일반적으로 'CSRF'토큰을 포함하는 meta 요소는 html에서 프록시를 통해 null이다. 일반적으로 프록시를 사용하지 않을 때 설정되지만, 어떤 이유로 'CSRF'가 설정되지 않습니다. 게시물이 null 값을 반환하지 않으면 제공된 'JS'만 반환됩니다. '' 은 이 아닙니다. name = "csrf-token"content = "asldkfh">' – Beep