【问题标题】:PHP post request with curl and hidden values带有 curl 和隐藏值的 PHP 发布请求
【发布时间】:2014-08-12 12:13:55
【问题描述】:

我目前正在尝试通过 curl 将 POST 数据发送到 URL。数据发送到的 URL 是表单所在的 URL。换句话说,“动作”的形式就是它本身。

问题是,在表单页面上,每次刷新都会设置一个随机隐藏输入值,我需要获取这些值,并将它们与我要发布的其他数据一起使用。这是我当前的代码:

<?php
function httpPost($url,$params) {
    $postData = '';
    $proxy = "127.0.0.1";
    $port = "9150";

    // Create name value pairs seperated by &
    foreach($params as $k => $v) { 
        $postData .= $k . '='.urlencode($v).'&'; 
    }
    rtrim($postData, '&');

    $ch = curl_init();  

    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, count($postData));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);    
    curl_setopt ($ch, CURLOPT_PROXYTYPE, 7 );
    curl_setopt ($ch, CURLOPT_PROXY, $proxy.':'.$port );

    $output=curl_exec($ch);

    curl_close($ch);
    return $output;
}

$content = file_get_contents('https://secured.example.com/directory/create'); 

$params = array(
    "name" => "Name",
    "pass" => "password",
    "email" => "email@email.com"
);

echo httpPost("https://secured.example.com/directory/create",$params);
?>

例如,https://secured.example.com/directory/create 有一个隐藏的输入字段,如下所示:

<input type="hidden" name="anon_token" value="ZHvR0DtwB-15Os0qwdVE3IN_ygSHHhllDAkOUwVPtZE" />

但是,该值是每次随机设置的(刷新)。

【问题讨论】:

  • 您需要从 html 页面中提取该字段的值并提交。

标签: php post curl


【解决方案1】:

抓取内容后,需要抓取anon_token的值。

这基本上将 HTML 页面的内容用作新的 DOMDocument。 然后获取所有输入标签,以找到包含“anon_token”的一个输入标签。 从此标签中,您需要值(即令牌)。 令牌需要插入到 POST 数据数组中。

旁注:一个简单的 preg_match 也可能有效。但是,无论如何,让我们使用 Dom 函数来确保安全。

$content = file_get_contents('https://secured.example.com/directory/create');

$doc = new DOMDocument();
$doc->loadHTML($content);

$tags = $doc->getElementsByTagName('input');

foreach ($tags as $tag) {
    if($tag->getAttribute('name') === 'anon_token') {
         $token = $tag->getAttribute('value');
    }
}

$params = array(
    "name" => "Name",
    "pass" => "password",
    "email" => "email@email.com",
    "anon_token" => $token
);

使用 preg_match()..

preg_match('/name="anon_token"\svalue="(.*)"/', $content, $matches)
$token = $matches[0];

【讨论】:

  • 但是,就像我说的,每次访问页面时,隐藏输入的值都会发生变化。所以即使我可以获取anon_token 的值,当我发送cURL 请求时它不会改变吗?表单动作就是页面本身。我已经用过类似这样的东西和 preg_match。
  • 你每次都在重新获取$content,所以你总是会得到一个有效的令牌。通常,您将手动填写表单并提交(生成 POST 请求)。在这里,您通过 cURL 生成 POST 请求。试一试..
【解决方案2】:

希望这可行:

$content = file_get_contents("https://secured.example.com/directory/create");
$pattern  = "/hidden.*name=[\s|'|\"]anon_token.*value=.*[\"']/";
preg_match( $pattern , $content  , $matches);
$pattern_value  = "/hidden.*name=[\s|'|\"]anon_token.*value=/";

foreach($matches as $match){
echo preg_replace(array($pattern_value, "/'/" , '/"/')  , array( "", "" , "") , $match);
}

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2021-02-10
    • 1970-01-01
    • 2015-12-06
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-21
    • 1970-01-01
    相关资源
    最近更新 更多