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

带有curl和隐藏值的PHP post请求,php,post,curl,Php,Post,Curl,我目前正试图通过curl将POST数据发送到URL。数据发送到的URL是表单所在的URL。换句话说,动作的形式就是动作本身 问题是,在表单页面上,每次刷新时都会设置一个随机隐藏的输入值,我需要获取这些值,并将它们与我要发布的其他数据一起使用。这是我目前的代码: <?php function httpPost($url,$params) { $postData = ''; $proxy = "127.0.0.1"; $port = "9150"; // Cr

我目前正试图通过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);
?>

但是,每次刷新时都会随机设置该值。

获取内容后,您需要获取anon_令牌的值

这基本上使用HTML页面的内容作为新文档。 然后获取所有输入标记,以查找包含anon_标记的一个输入标记。 从该标记中,您需要作为标记的值。 需要将令牌插入POST数据数组中

旁注:一个简单的preg_匹配也可能有效。但是,无论如何,让我们通过使用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_匹配

preg_match('/name="anon_token"\svalue="(.*)"/', $content, $matches)
$token = $matches[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);
}

您需要从html页面中提取该字段的值并提交该值。但是,正如我所说,每次访问该页面时,隐藏输入的值都会更改。因此,即使我可以获取anon_令牌的值,当我发送cURL请求时它不会改变吗?表单操作是页面本身。我已经使用过这样的东西和preg_match。您每次都在重新蚀刻$content,因此您将始终获得有效的令牌。通常情况下,您会手动填写表单并提交它以生成POST请求。这里通过cURL生成POST请求。试试看。。
$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);
}