Не могу залогиниться с fsockopen

Discussion in 'PHP' started by Voronin, 23 Jan 2018.

  1. Voronin

    Voronin New Member

    Joined:
    23 Jan 2018
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Привет. Пытаюсь залогиниться на форуме под управлением FluxBB.

    Но при выполнении кода получаю ошибку.

    Error 2: Нам кажется, что вы робот. Доступ запрещен.

    Подскажите, плиз, что не так с кодом, или хотя бы куда копать.

    PHP:
    $hostname "site.net";
    $site "/login.php";

     
    // Устанавливаем соединение
      
    $fp fsockopen($hostname80$errno$errstr30);
      
    // Проверяем успешность установки соединения
    if (!$fp) {
    echo 
    "$errstr ($errno)<br>\n";
    } else {
        
    $out 'GET '.$site.' HTTP/1.1'."\r\n";
        
    $out .= 'Host:'.$hostname."\r\n";
        
    $out .= 'Connection: Close'."\r\n\r\n";
    fwrite($fp$out);
    while (!
    feof($fp)) {
    $content .= fgets ($fp,128);
    }
    //echo $content;
    $pos stripos ($content"csrf_token");
    $token substr ($content$pos+1940);

    $pos_time stripos ($content"cr\" value=");
    $time substr ($content$pos_time+1110);
    //echo $token."<br>";
    //echo "<br>".$time;
    fclose ($fp);
    }

    $data "form_sent=1&redirect_url=https://site.net/index.php&csrf_token=".urlencode($token)."&req_username=".urlencode($username)."&req_password=".urlencode($password)."&cr=".urlencode($time)."&login=".urlencode("Вход");
    sleep(1);
     
    // Устанавливаем соединение
      
    $fp fsockopen($hostname80$errno$errstr30);
      
    // Проверяем успешность установки соединения
    if (!$fp) {
    echo 
    "$errstr ($errno)<br>\n";
    } else {
        
    $out "POST /login.php?action=in HTTP/1.1\r\n";
        
    $out .= "Host: site.net\r\n";
        
    $out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)\r\n";
        
    $out .= "Connection: keep-alive\r\n";
        
    $out .= "Content-type: application/x-www-form-urlencoded\r\n";
        
    $out .= "Content-length: ".strlen($data)."\r\n";
        
    $out .= "Connection: close\r\n\r\n";
        
    $out .= $data."\r\n\r\n";
    fwrite($fp$out);
    while (!
    feof($fp)) {
    $content_enter .= fgets ($fp,128);
    }
    echo 
    $content_enter;
    fclose ($fp);
    }

    ?>
     
  2. pas9x

    pas9x Elder - Старейшина

    Joined:
    13 Oct 2012
    Messages:
    423
    Likes Received:
    585
    Reputations:
    52
    Скидывай ссылку на рабочий форум. Ставить форум на локалхост влом.
    Ну и если там рекапча то без гемора не обойтись.
     
  3. Voronin

    Voronin New Member

    Joined:
    23 Jan 2018
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Там рекапчи нет, вообще, никакой капчи при логине нет.

    Вот форум holywarsoo.net
     
  4. pas9x

    pas9x Elder - Старейшина

    Joined:
    13 Oct 2012
    Messages:
    423
    Likes Received:
    585
    Reputations:
    52
    Нужно точно повторять хттп-запрос со всеми нормальными заголовками браузера.

    PHP:
    <?php

    $loginPageUrl 
    'http://holywarsoo.net/login.php';
    $welcomePageUrl 'http://holywarsoo.net/index.php';
    $authUrl 'http://holywarsoo.net/login.php?action=in';
    $userAgent 'Opera/9.80 (Windows NT 6.1; Win64; x64) Presto/2.12.388 Version/12.18';

    $username 'deleteme';
    $password 'mW7cTWpgtNG6';

    function 
    httpGet($url, array $curlOptions = [])
    {
       
    $ch curl_init($url);
       
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
       
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
       if (!empty(
    $curlOptions)) {
          
    curl_setopt_array($ch$curlOptions);
       }
       
    $result curl_exec($ch);
       return 
    $result;
    }

    function 
    httpPost($url$postdata null, array $curlOptions = [])
    {
       
    $ch curl_init($url);
       
    curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
       
    curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
       
    curl_setopt($chCURLOPT_POSTtrue);
       if (!
    is_null($postdata)) {
          
    curl_setopt($chCURLOPT_POSTFIELDS$postdata);
       }
       if (!empty(
    $curlOptions)) {
          
    curl_setopt_array($ch$curlOptions);
       }
       
    $result curl_exec($ch);
       return 
    $result;
    }

    $cookieFile __DIR__ '/cookies.txt';
    if (
    file_exists($cookieFile)) {
       
    unlink($cookieFile);
    }

    $curlOptions = [
       
    CURLOPT_USERAGENT => $userAgent,
       
    CURLOPT_COOKIEFILE => $cookieFile,
       
    CURLOPT_COOKIEJAR => $cookieFile,
       
    //CURLOPT_VERBOSE => true,
       
    CURLOPT_HTTPHEADER => [
          
    'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1',
          
    'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8',
          
    //'Expect:',
       
    ],
    ];

    $loginPageHtml httpGet($loginPageUrl$curlOptions);
    if (!
    preg_match('/csrf_token[^\<\>]+value\=\"([a-f0-9]{40})\"/'$loginPageHtml$matches)) {
       throw new 
    Exception('No csrf-token found');
    }
    $csrfToken $matches[1];
    if (!
    preg_match('/cr[^\<\>]+value\=\"([0-9]+)\"/'$loginPageHtml$matches)) {
       throw new 
    Exception('No timestamp found');
    }
    $timestamp $matches[1];

    echo 
    "CSRF-token: $csrfToken\n";
    echo 
    "Timestamp: $timestamp\n";

    $postdata = [
       
    'form_sent' => '1',
       
    'redirect_url' => $welcomePageUrl,
       
    'csrf_token' => $csrfToken,
       
    'req_username' => 'deleteme',
       
    'req_password' => $password,
       
    'cr' => $timestamp,
       
    'login' => 'Вход',
    ];
    $welcomePageHtml httpPost($authUrl$postdata$curlOptions + [CURLOPT_REFERER => $loginPageUrl]);
    file_put_contents(__DIR__ '/auth.html'$welcomePageHtml);
    if (
    preg_match('/http-equiv="refresh"/'$welcomePageHtml)) {
       echo 
    "Welcome\n";
    } else {
       echo 
    "Something shitty happened\n";
    }

    ?>
     
    Voronin, t0ma5 and crlf like this.