2017-02-13 17 views
0

N.B: Я просмотрел Login with PHP curl and CSRF token и cURL CSRF Token, Login with CURL php and CSRF token, а затем некоторые перед публикацией.PHP: cURL с маркером CSRF

Я создаю систему, которая имеет функцию (если она работает) для анализа данных с другого сайта. Этот сайт требует входа с пользователем, пароль & csrf token. См. Ниже код.

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $response = curl_exec($ch); 
    if (curl_errno($ch)) die(curl_error($ch)); 

    $doc = new DOMDocument(); 
    $doc->loadHTML($response); 
    $token = $doc->getElementsByTagName("csrf")->attributes->getNamedItem("value")->value[0]; 



    echo "TOKEN: {$token} "; 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 

    $params = array(
    'username' => $username, 
    'password' => $password, 
    'csrf' => $token 
); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); 

    curl_exec($ch); 

    if (curl_errno($ch)) print curl_error($ch); 


    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); 
    $html = curl_exec($ch); 
    print("<br />HTML: ".$html); 
if (curl_errno($ch)) print curl_error($ch); 
    curl_close($ch); 

Я слегка модифицировал сценарии из приведенных выше вопросов, но я получать эти ошибки:

Предупреждения: DOMDocument :: loadHTML(): htmlParseEntityRef: ожидающие ';' в Entity, строка: 24 в /home/dlip/subdomains$/eportaltest.website.com/public_html/ticket_load.php на линии 18

Внимание: DOMDocument :: loadHTML(): Неожиданный конечный тег: формы в Сущности, линия: 76 в /home/dlip/subdomains$/eportaltest.website.com/public_html/ticket_load.php на линии 18

Внимание: DOMDocument :: loadHTML(): Tag нав недействительным в Entity , строка: 124 в /home/dlip/subdomains$/eportaltest.website.com/public_html/ticket_load.php on line 18

Внимание: DOMDocument :: loadHTML(): Метка раздела недействителен в Сущности, строка: 140 в /home/dlip/subdomains$/eportaltest.website.com/public_html/ticket_load.php на линии 18

Предупреждение: DOMDocument :: loadHTML(): имя ошибки синтаксического анализа атрибутов в Entity, строка: 176 в /home/dlip/subdomains$/eportaltest.website.com/public_html/ticket_load.php на линии 18

Следуя инструкциям по вышеуказанным вопросам, я также пробовал использовать

$doc->loadHTML(htmlentities($response)) 

не имеет никакой пользы.

У кого-нибудь есть подсказки, что происходит не так? Я понимаю, что это может быть связано с сайтом, но как мне обойти его?

Спасибо :)

+0

Вы получаете токен csrf? Причина, по которой вы видите эти предупреждения, заключается в том, что на сайте, который вы пытаетесь проанализировать, есть недопустимый HTML. – OptimusCrime

+0

Нет. Считаете ли вы, что просто будет проще взорвать страницу и просто взять бит, который мне нужен в этом случае? – DLipscombe

ответ

0

Немного грязный ответ, но это работает, так что это нормально со мной ...

Используется этот ответ: https://stackoverflow.com/a/21804537/7508539

И свернул его так:

$token = trim(get_string_between($response,'<input type="hidden" name="csrf" value="','" />')); 

Скорее всего, вам придется взорвать нужные мне биты на своем сайте, но, по крайней мере, я знаю, как это сделать сейчас, вместо того, чтобы сидеть, целенаправленно глядя на ошибки, t исправить.

Есть ли какие-либо способы «не-взломать» это?