从页面获取CSRF令牌&发表它

时间:2014-10-30 11:44:55

标签: php

我需要创建一个登录网站的脚本。这样说,我将从登录页面获取 CSRF 令牌并将其发布到登录操作URL。 [接受的数据是json。]

这是登录方式:

public function login()
{
    $login = 'https://XXXXXXXXXXXXXXXXXXX';
    $csrf = $this->token();
    $data = array(
        "email" => 'email@email.com',
        "password"  => '123456',
        "displayType"   => 'json',
        "csrf"  => $csrf
    );
    $json = json_encode($data);
    $ch = curl_init($login);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, true); // For debugging purposes
    curl_setopt($ch, CURLOPT_HTTPHEADER, $this->headers);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $json);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    $result = curl_exec($ch);
    return $result;
}

这里是令牌抓取器方法:

public function token()
{
    $source = $this->get("https://OOOOOOOOOOOOOOOOOOO");
    $dom = new DOMDocument();
    $dom->loadHTML($source);
    $dxp = new DOMXpath($dom);
    $csrf = $dxp->query('//input[@name="csrf"]/@value')->item(0)->value;
    return $csrf;
}

成功提取令牌,但在同一会话中的每次通话中都会更改。的为什么?我正在以这种方式初始化会话:

public function __construct($url)
{
    if(session_status() == PHP_SESSION_NONE)
        session_start();
    ...
}

1 个答案:

答案 0 :(得分:0)

当然$ this-> get(并且您的功能登录在被叫网站上使用不同的"会话" 您需要将Cookie存储在会话中并重新使用它们。您需要使用cURL重写get函数并添加以下行:

$cookie_path = 'mycookie.txt';
curl_setopt( $ch, CURLOPT_COOKIEJAR,  $cookie_path );
curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookie_path );