Необходимо войти в ipb board с php и curl - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь войти на IP-плату с помощью CURL и PHP. Это код, который я использую. У кого-нибудь есть идея?

<?php

    $url=stream_get_contents(fopen('https://invisioncommunity.com/login/', "rb"));

    function get_string_between($string, $start, $end){
        $string = ' ' . $string;
        $ini = strpos($string, $start);
        if ($ini == 0) return '';
        $ini += strlen($start);
        $len = strpos($string, $end, $ini) - $ini;
        return substr($string, $ini, $len);
    }

    $csrf_key = get_string_between($url, '" value="', '">');

    $path = "/root/ctemp";

    $postinfo = "csrfKey=".$csrf_key."&auth=____USERNAME_______&password=___PASSWORD____&remember_me=1&_processLogin=usernamepassword&_processLogin=usernamepassword";
    $cookie_file_path = $path."/cookie.txt";

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_NOBODY, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
    //set the cookie the site has for certain features, this is optional
    curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
    curl_setopt($ch, CURLOPT_USERAGENT,
        "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, "https://invisioncommunity.com/login/");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
    curl_exec($ch);

    //page with the content I want to grab
    curl_setopt($ch, CURLOPT_URL, "https://invisioncommunity.com/discover/unread/");

    //do stuff with the info with DomDocument() etc
    $html = curl_exec($ch);

    echo $html;

    curl_close($ch);
    ?>

1 Ответ

0 голосов
/ 08 мая 2018

да, ваш токен csrf привязан к сеансу cookie, указанному в запросе stream_get_contents, без этого cookie ваш токен csrf бесполезен, и вы никогда не извлекаете cookie из stream_get_contents (и я не думаю, что stream_get_contents даже поддерживает это ), перепишите его с помощью curl_ api и убедитесь, что система cookie curl включена (например, установите для CURLOPT_COOKIEFILE значение emptystring, что активирует систему обработки файлов cookie libcurl). также ваш код извлечения csrf ненадежен, он не декодирует html-сущности (например, если токен csrf содержит &, он будет html-кодирован как &amp;, но ваш код не переводит &amp; обратно &.), вместо этого используйте правильный HTML-анализатор, такой как DOMDocument. Кроме того, вы не urlencode csrf_key, так что снова он может быть поврежден, если он содержит специальные символы (например, @, подробнее об этом позже). используйте urlencode () или http_build_query () для правильного urlencode ключа csrf, и вашего имени пользователя, и вашего пароля, потому что вы их тоже не кодируете. Знаете ли вы, что @ в вашем электронном письме должно быть закодировано в %40? Бьюсь об заклад, когда вы жестко закодируете свой адрес электронной почты для входа в систему, вы просто пишете foo@gmail.com, вы не пишете foo%40gmail.com, поэтому вам придется также ввести это код.

попробуйте это, используя http_build_query для кодирования данных поста и DOMDocument для анализа токена csrf:

<?php
declare(strict_types = 1);
$ch = curl_init ();
curl_setopt_array ( $ch, array (
        CURLOPT_COOKIEFILE => '',
        CURLOPT_ENCODING => '',
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_FOLLOWLOCATION => 1,
        CURLOPT_URL => 'https://invisioncommunity.com/login/' 
) );
$html = curl_exec ( $ch );
$domd = @DOMDocument::loadHTML ( $html );
$xp = new DOMXPath ( $domd );
curl_setopt_array ( $ch, array (
        CURLOPT_URL => 'https://invisioncommunity.com/login/',
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => http_build_query ( array (
                'csrfKey' => $xp->query ( '//input[@name="csrfKey"]' )->item ( 0 )->getAttribute ( "value" ),
                'auth' => '____USERNAME_______',
                'password' => '___PASSWORD____',
                'remember_me' => 1,
                '_processLogin' => 'usernamepassword' 

        ) ) 
) );
$html = curl_exec ( $ch );
echo $html;
...