带有curl和隐藏值的PHP post请求

时间:2014-08-12 12:13:56

标签: php post curl

我目前正在尝试通过curl将POST数据发送到网址。发送数据的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" />

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

2 个答案:

答案 0 :(得分:2)

获取内容后,您需要获取anon_token

的值

这基本上使用HTML页面的内容作为新的DOMDocument。 然后获取所有输入标签,以找到包含&#34; anon_token&#34;的一个输入标签。 从此标记中,您需要值(即令牌)。 需要将令牌插入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];

答案 1 :(得分:0)

希望这有效:

$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);
}