Проанализируйте страницу, чтобы получить ввод, а затем отправьте сообщение, включающее это значение ввода - PullRequest
0 голосов
/ 30 мая 2019

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

это код curl, который я использовал до того, как они добавили ввод токена

$username = @$_POST['user'];
$password = @$_POST['password'];
$to = @$_POST['to'];
$text = @$_POST['text'];    
$loginUrl = '';
$sendUrl = '';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, "user=$username&password=$password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name');  
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch)."/n";
}
//sending
curl_setopt($ch, CURLOPT_URL, $sendUrl);
curl_setopt($ch, CURLOPT_POSTFIELDS, "recipients=$to&message_body=$text");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie-name-send'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie-send.txt');
$answer = curl_exec($ch);
if (curl_error($ch)) {
    echo curl_error($ch)."/n";
}
echo $answer;

Это страница, которую я хочу проанализировать

<form name="user_action" method="post" action="index.php?page=11&amp;lang=ge">
<input type="hidden" name="csrf_token" value="7e71ea58eaaa55986b0fdc71b2d44c92">    
<input type="text" id="user" name="user" class="round_border medium_box">
<input type="password" id="password" name="password" class="round_border medium_box">
<input type="submit" value="შესვლა" class="btn red_btn round_border medium">
</form>

Нет, я не могу опубликовать без этого токена <input type="hidden" name="csrf_token" value="7e71ea58eaaa55986b0fdc71b2d44c92">

И все, что мне нужно, это проанализировать этосначала получите токен и отправьте сообщение с этим токеном

Ответы [ 2 ]

1 голос
/ 30 мая 2019

Проверьте DOMDocument для разбора HTML. https://www.php.net/manual/en/class.domdocument.php

Вот что я бы попробовал:

<?php
$page = file_get_contents("https://wherever-the-form-is.com");
$dom = new DOMDocument();
$dom->loadHTML( $page );

// Get a list of all inputs
$inputs = $dom->getElementsByTagName( 'input' );
$total = $inputs->length;
$token = false;

// Loop through inputs looking for one with the right name
for( $i = 0; $i < $total; $i++ ) {
    if ( $inputs->item($i)->getAttribute('name') == 'csrf_token' ) {
        // When you find the right name, record the value and break out of the loop
        $token = $inputs->item($i)->getAttribute('value');
        break;
    }
}

if ( $token ) {
    // Your code here
}
0 голосов
/ 31 мая 2019

@ Stevish верен, вы должны использовать DOMDocument, но я предлагаю немного другой подход: вместо этого зацикливайте все входные дочерние элементы формы, например,

$domd=@DOMDocument::loadHTML($answer);
$xp=new DOMXPath($domd);
$inputs=array();
foreach($xp->query("//form[@name='user_action']//input") as $input){
    $inputs[$input->getAttribute("name")]=$input->getAttribute("value");
}

это должно оставить вас с

$inputs=array (
  'csrf_token' => '7e71ea58eaaa55986b0fdc71b2d44c92',
  'user' => '',
  'password' => '',
  '' => 'á¨áá¡ááá',
)

.. также вы кодируете здесь сообщение $ to nor $, что, по вашему мнению, произойдет, если $ message содержит blabla&to=moreblabla? он перезапишет ваш предыдущий $ to и сделает ваш $ to переменным неактуальным, вам нужно url-кодировать это дерьмо, так что либо

curl_setopt($ch, CURLOPT_POSTFIELDS, "recipients=".urlencode($to)."&message_body=".urlencode($text));

или еще лучше, используйте http_build_query,

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(
    array(
        "recipients" => $to,
        "message_body" => $text
    )
));

... или даже лучше,

$domd=@DOMDocument::loadHTML($answer);
$xp=new DOMXPath($domd);
$inputs=array();
foreach($xp->query("//form[@name='user_action']//input") as $input){
    $inputs[$input->getAttribute("name")]=$input->getAttribute("value");
}
$inputs["recipients"]=$to;
$inputs["message_body"]=$text;
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($inputs));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...