使用php,我如何通过POST模拟完整的表单提交数据?

时间:2012-12-06 12:18:57

标签: php curl

我的问题是:我有一个在线服务,托管我客户的目录 此服务需要身份验证,但我只有一个用户名/密码 相反,我的客户希望使用自己的用户/密码和访问统计信息单独管理每个用户。所以我所做的就是建立自己的账户管理,到目前为止一直很好 我现在需要做的是添加一个登录表单,用户应该使用自己的凭据填写;一旦发送,脚本应继续进行身份验证,如果一切正常,则增加访问次数,通过POST发送远程系统的登录数据,并将浏览器重定向到响应页面,这与普通表单的方式完全相同。登记/> 我尝试以这种方式使用curl

if (authenticate($_POST['usr'],$_POST['pwd'])) {
    $url = "http://www.foo.com/login.php";
    $postdata = http_build_query(array('username'=>"foo",'password'=>"bar"));
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_exec($curl);
    curl_close($curl);
}

但我最终将目标网页的数据加载到我自己的页面中,而不是重定向到网站。
我该怎么办? 附:如果可能的话,我会避免诉诸通过JS提交的隐藏表格 谢谢!

2 个答案:

答案 0 :(得分:2)

使用CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);

从手册:

  

TRUE以将返回值作为字符串返回   curl_exec()而不是直接输出。

答案 1 :(得分:2)

我认为你没有看到你想要做的事情的全貌。基本上,重定向对您没有帮助,因为身份验证不是基于URL的,而是基于cookie或会话。换句话说,您无法对自己进行身份验证(当您使用隐藏凭据模拟该网站上的表单提交时会发生这种情况)并让您的访问者为自己获得身份验证。重定向不会帮助你。即使你重定向他,他也没有经过身份验证。你的服务器是,因为它提交了表单,而不是用户本人。

我没有得到的是您可以使用隐藏凭据对用户进行身份验证,然后让他完全访问统计信息,为什么不给他访问权限呢?您正在向他提供对所有内容的完全访问权限,但是不要给他登录名和密码吗?

另一方面,不能进行POST重定向,因此您无法使用伪造的POST数据重定向表单提交。重定向时丢失所有POST数据。

作为一个丑陋的解决方法,我会建议以下内容:您可以像现在一样对自己进行身份验证,然后让用户浏览您网站上的统计信息,类似于代理服务器。然后,您可以将页面上的所有链接更改为yoursite.com/viewstats/?page=URL,其中URL是用户想要查看的统计网站的页面。您抓住该页面并将其显示给用户。您需要更改css / js文件的相对路径以保持其设计,并且您还需要更改所有内部网站链接,例如此"/viewstats/?page=" . urlencode($old_url),以便它们指向类似代理的门。