我正在维护由其他人开发的一些页面。我注意到,表单由某种图像验证码保护,每次用户进入页面时都会生成该验证码。CAPTCHA 存储在名为 的隐藏输入中check
,用户输入的值在提交表单后与隐藏输入的值进行比较。
我尝试使用 cURL从隐藏的输入中读取页面并解析CAPTHA。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://example.com/form/");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($curl);
$html = str_get_html($result);
$captcha = $html->find('input[name=check]');
var_dump($captcha[0]->value);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, array(
"name" => "Joe",
"telephone" => "1423456789",
"message" => "Lorem ipsum",
"auth" => $captcha[0]->value,
"check" => $captcha[0]->value,
"submit_f1" => "Send"
));
$result = curl_exec($curl);
curl_close ($curl);
运行上面的脚本会导致正确的表单提交。更重要的是,我注意到,我可以简单地覆盖post 数组中的值auth
:check
"auth" => 123,
"check" => 123,
并且表单也被正确提交。
我意识到没有 100% 安全的方法来保护表单,但是我怎样才能更多地保护我的表单并使自动提交变得更加困难。