【问题标题】:cURL X-CSRF Token IssuecURL X-CSRF 令牌问题
【发布时间】:2015-01-23 04:22:09
【问题描述】:

我有这个 PHP 代理使用 cURL(下)。每当它获得POST 时,标头X-CSRF 标记设置为空。 X-CSRF 标记是 POST 标头中使用代理和不使用代理之间的唯一区别。

所以我想知道如何修复它,以便在不使用代理的情况下正确设置 X-CSRF 令牌?

$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

【问题讨论】:

    标签: php curl proxy csrf


    【解决方案1】:

    您正在使用 AJAX 调用,如图所示,X-CSRF-Token 标头未在这些调用上设置。您需要按照Adding X-CSRF-Token header globally to all instances of XMLHttpRequest(); 中的说明明确设置它,例如与(从那里复制):

    (function() {
    var send = XMLHttpRequest.prototype.send,
        token = $('meta[name=csrf-token]').attr('content');
    XMLHttpRequest.prototype.send = function(data) {
        this.setRequestHeader('X-CSRF-Token', token);
        return send.apply(this, arguments);
    };
    }());
    

    所以修复不是在 PHP 中,而是在您的 AJAX 调用代码中。将 token = $('meta[name=csrf-token]').attr('content'); 替换为从 HTML 中获取 CSRF 令牌的代码。

    【讨论】:

    • $('meta[name=csrf-token]').attr('content');还包含 null。
    • 是的,正如编辑中所建议的那样:您需要将其替换为适用于您拥有的实际 HTML 的代码;您需要查看从网站返回的 HTML 源代码,以找到适合您用例的元素
    • 通常包含CSRF标记的元元素通过代理在html中为空。通常它在不使用代理时被设置,但由于某种原因,CSRF 没有被设置。如果帖子没有返回 null 值,您提供的 JS 只会返回 null 以外的值。 <meta id="csrf-token-meta-tag" name="csrf-token" content=""> 不会变成 <meta id="csrf-token-meta-tag" name="csrf-token" content="asldkfh">
    【解决方案2】:

    必须在php 中的客户端和服务器之间代理$_SESSION id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-28
      • 2014-10-06
      • 2011-07-19
      • 2014-09-25
      • 2018-04-07
      • 2018-03-15
      • 1970-01-01
      • 2018-12-31
      相关资源
      最近更新 更多