我目前正在尝试通过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" />
但是,每次(刷新)随机设置该值。
答案 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);
}