Я пытаюсь зайти на сайт с помощью PHP-скрипта curl, но не могу из-за генератора представления состояния и проверки событий.Есть ли способ обойти это? - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь зайти на сайт с помощью cUrl и почистить определенные данные с сайта. Это домашнее задание. Но на сайте есть 3 разных данных формы, которые меняются каждый раз, когда я вхожу.

Возможно ли обойти это и войти в систему или это просто невозможно? Если да, может кто-нибудь, пожалуйста, дать мне начать в правильном направлении?

Код cURL, который я пробовал:

<?php
include("simple_html_dom.php");

$cofile = dirname(__FILE__).'/cookie.txt';
$postfield= array(

 "SM"=>"UpPnlLogin|btnLogin",

  "__LASTFOCUS"=>"",
  "__EVENTTARGET"=>"btnLogin",

  "__EVENTARGUMENT"=>"",

  "__VIEWSTATE"=>"hly8ipIDyvfEpBj01vjkB/HmrA
  yIw+UuyvBkGc5NHMexWF+PvAVQZYkSrcwJM4rO9aaz
  93ogQuFxowVMDPueJz5DU3obstDtyl7KuLvZXQ+GJ1
  JKRGEtTTRl5vM2RIi7mwL+j3LRqHgl+ZW1wftsnt2q
  nUy7rrxSC6j0eoqabUM/hpS1hveORvLcEbo+5o1J+r
  W0+UYYnZ/cFQcUNhx5538uRaD8PIxq6GxTrT/qI2ef
  DDLJB5qmmANILYPxsVg++dXFmQFD59MvETq+R3Om0g
  ==",

  "__VIEWSTATEGENERATOR"=>"CADA6983",

  "__EVENTVALIDATION"=>"y2iWoj4pBfE6Ij55U/Hf
  Sq/mWPNVk4Hv4Nvg7IDxuN6KElLeNsq4iUIbHMfGQS
  8s6oProuk3wXUrqQWG6VleouPj+M3LLkKYR8XhLzmw
  e4Cck3tqa/YpGmNLZiNOLkbN4/RhPFq+onAiQ2GDc4
  gHlU5aU94WwONQ9ItyzsH4V111bPhKX3gjr9YXhpPg
  9UiyWwkNXohLJSWRM9jGfHrgMg==",

  "txtCustNo"=>"username",

  "txtPassword"=>"password",

  "__ASYNCPOST"=>"true",

  "btnLogin"=>"Нэвтрэх"

  );

$ch = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, $cofile);
curl_setopt($ch, CURLOPT_URL,"https://e.khanbank.com/");//url that is 
requested when logging in
curl_setopt($ch, 
CURLOPT_REFERER,"https://e.khanbank.com/");//CURLOPT_REFERER
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postfield));


ob_start();      // prevent any output
curl_exec ($ch); // execute the curl command
ob_end_clean();  // stop preventing output

curl_close ($ch);
unset($ch);

$ch = curl_init();
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cofile);
curl_setopt($ch, CURLOPT_URL,"https://e.khanbank.com/pageMain? 
content=ucMain_Welcome");

$result = curl_exec ($ch);

curl_close ($ch);

echo $result;

?>

1 Ответ

1 голос
/ 07 июня 2019

вы не можете жестко закодировать значения, они меняются при каждом входе в систему и привязываются к вашему сеансу cookie, что означает, что EVENTVALIDATION, которую вы получаете из браузера, привязан к сеансу cookie вашего браузера и недопустим для curl,

я напишу пример с библиотекой hhb_curl ,

сначала добавьте эту функцию куда-нибудь, она вам понадобится (она заставляет DOMDocument загружать HTML с utf-8набор символов, который не является значением по умолчанию для DOMDocument, но utf-8 используется khanbank),

function my_dom_loader(string $html): \DOMDocument
{
    $html = trim($html);
    if (empty($html)) {
        //....
    }
    if (false === stripos($html, '<?xml encoding=')) {
        $html = '<?xml encoding="UTF-8">' . $html;
    }
    $ret = new DOMDocument('', 'UTF-8');
    $ret->preserveWhiteSpace = false;
    $ret->formatOutput = true;
    if (!(@$ret->loadHTML($html, LIBXML_NOBLANKS | LIBXML_NONET | LIBXML_BIGLINES))) {
        throw new \Exception("failed to create DOMDocument from input html!");
    }
    $ret->preserveWhiteSpace = false;
    $ret->formatOutput = true;
    return $ret;
}

сначала создайте дескриптор hhb_curl,

<?php
declare (strict_types = 1);
require_once('hhb_.inc.php');
$hc = new hhb_curl('', true);

сейчас, khanbank.com использоватьбелый список браузера, если вы не используете браузер из белого списка, вы не можете войти в систему. Примером браузера из белого списка является Google Chrome 75 X64, поэтому имитируйте этот браузер, установив

$hc->setopt(CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36');

nextизвлеките страницу входа, чтобы получить cookie и материал EVENTVALIDATION,

$html = $hc->exec('https://e.khanbank.com/')->getStdOut();

теперь мы получили материал EVENTVALIDATION в формате html, и нам нужно проанализировать его из html,

$domd = my_dom_loader($html);
$xp = new DOMXPath($domd);
$form = $domd->getElementById("Form1");
$post_data = array();
foreach ($form->getElementsByTagName("input") as $input) {
    $post_data[$input->getAttribute("name")] = $input->getAttribute("value");
}
assert(isset($post_data['txtCustNo']), "ERROR: COULD NOT FIND USERNAME INPUT!");
assert(isset($post_data['txtPassword']), "ERROR: COULD NOT FIND PASSWORD INPUT!");

now $post_data содержит:

array (
  '__VIEWSTATE' => '9GT5O4HrKQJrWbF7PRSXu9RiMlpkqY5hO+sN9H0OXxmwYjWMfr2uf4yIgpHtk9sp56RWot30dvKeuGF3+eoOhpNu5nsuGBjtrpb8g8AGMaDbQ0nxpEKS3HILkqccMwFfn7y0LThLfjm0Ow84RGosJa+/5iM9YfP/HFM5HnyHKGJkM84nGEh7QZfoGYwMOU9SSb5dKmxfnmrIo/xXUUh4DT8+LOFGCQ2H5+nPFudTonwfgX6AKBNhkRijlfrUY+ns7HMq699AU38bsaxgD67KEw==',
  '__VIEWSTATEGENERATOR' => 'CADA6983',
  '__EVENTVALIDATION' => '4FZipDfTouUXBNMfIqlf/SXhPNyW5SBkcH/JIZB/j8kdaJUlMAQzvodpEq2n6WBRvxs6IBGVASOFouDQbqjygKK8+01KbRa9CpEGRiYGdxSIlt0wbZ2wJZeN6kB2ncn2DSd3C3nymCcz1kGHIdR3Dy5l2OlS6JngVCVoXuhpDzsjDQbrRwHST85XOlXdF6jl8/aQPYkSlZkSRQ5BFzdbnw==',
  'txtCustNo' => '',
  'txtPassword' => '',
  'chkRemUser' => '',
)

они связаны с этим конкретным сеансом cookie, поэтому вы должны каждый раз анализировать их из html, вы не можете жестко его кодировать , но естьвсе еще отсутствуют некоторые переменные (потому что ониустановлены с помощью JavaScript, а не с HTML), поэтому добавьте их:

$post_data['SM'] = 'UpPnlLogin|btnLogin';
$post_data['__LASTFOCUS'] = '';
$post_data['__EVENTARGUMENT'] = '';
$post_data['__EVENTTARGET'] = 'btnLogin';
$post_data['__ASYNCPOST'] = 'true';

, теперь задайте имя пользователя и пароль:

$post_data['txtCustNo'] = "username";
$post_data['txtPassword'] = "password";

и, наконец, отправьте фактический запрос на вход:

$html = $hc->setopt_array(array(
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => http_build_query($post_data),
    CURLOPT_URL => 'https://e.khanbank.com/'
))->exec()->getStdOut();

и, наконец, наконец: проверьте наличие ошибок входа в систему:

$domd = my_dom_loader($html);
$xp = new DOMXPath($domd);
$login_errors = array();
//uk-alert uk-alert-warning

foreach ($xp->query("//*[contains(@class,'alert')]") as $login_error) {
    $login_error = trim($login_error->textContent);
    if (!empty($login_error)) {
        $login_errors[] = $login_error;
    }
}
if (!empty($login_errors)) {
    var_dump($login_errors);
    throw new \RuntimeException("login errors: " . json_encode($login_errors, JSON_PRETTY_PRINT));
}
echo "logged in successfully! :)";

, что приводит к:

$ php wtf4.php
array(1) {
  [0]=>
  string(69) "Нэвтрэх нэр эсвэл нууц үг буруу байна!"
}
PHP Fatal error:  Uncaught RuntimeException: login errors: [
    "\u041d\u044d\u0432\u0442\u0440\u044d\u0445 \u043d\u044d\u0440 \u044d\u0441\u0432\u044d\u043b \u043d\u0443\u0443\u0446 \u04af\u0433 \u0431\u0443\u0440\u0443\u0443 \u0431\u0430\u0439\u043d\u0430!"
] in /cygdrive/c/projects/misc/wtf4.php:63
Stack trace:
#0 {main}
  thrown in /cygdrive/c/projects/misc/wtf4.php on line 63
  • , поскольку "username" и "password" этоневерные учетные данные для входа.также странные вещи \u0431\u0430\u0439\u043d\u0430 заключаются в том, что сообщение об исключении в PHP не поддерживает символы Unicode, кажется, и сообщение об ошибке написано в Unicode-символах (русский может быть?)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...