带有curl和隐藏值的PHP post请求
我目前正试图通过curl将POST数据发送到URL。数据发送到的URL是表单所在的URL。换句话说,动作的形式就是动作本身 问题是,在表单页面上,每次刷新时都会设置一个随机隐藏的输入值,我需要获取这些值,并将它们与我要发布的其他数据一起使用。这是我目前的代码:带有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
<?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);
}