用PHP如何通过POST方式发送数据,完全模拟表单提交?

3
我的问题是:我有一个在线服务,托管着我的客户目录。
这项服务需要身份验证,但是我只有一个用户名/密码。
我的客户希望单独管理每个用户的用户名/密码和访问统计信息。所以我建立了自己的账户管理系统,目前为止很好。
现在我需要添加一个登录表单,让用户填写他们自己的凭据;一旦提交,脚本应该进行身份验证,并且如果一切正常,增加访问计数,通过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提交的隐藏表单。
谢谢!


那么你最终是如何解决这个问题的? - Moha the almighty camel
2个回答

2

使用 CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);

来自手册:

TRUE表示将传输作为curl_exec()返回值的字符串返回,而不是直接输出。


1
一切都按照预期运行,唯一需要的是将浏览器重定向到目标页面,就像表单提交后一样,但实际上它将目标页面加载到我的页面中。 - Lucius
@Lucius cURL在服务器端运行,它不会重定向浏览器。你可能需要使用JavaScript来实现。 - Wayne Whitty
使用JS太不安全了,因为这意味着暴露用户名和密码,这是出于明显的原因不应该透露。除了cUrl,难道没有其他的办法吗? - Lucius
1
@Lucius,你找到解决方案了吗?我也遇到了同样的问题,需要使用cURL提交表单数据,其中包含不能暴露的隐藏用户名和密码。 - Chris

2
我认为你没有完全了解你所要做的事情的整个情况。基本上,重定向不会对你有帮助,因为身份验证不是基于URL的,而是基于cookie或会话的。换句话说,你无法为自己进行身份验证(当你在该网站上模拟表单提交时隐藏凭据时发生),并使你的访问者获得身份验证。重定向在这里没有帮助。即使你重定向了他,他也没有被认证。你的服务器被认证了,因为它提交了表单,而不是用户本身。
我不理解的是,你可以使用隐藏的凭据对用户进行身份验证,然后让他完全访问统计数据,为什么不直接给他访问权限?你提供了他所有的访问权限,但没有给他登录名和密码?
顺便说一下,POST重定向是不可能的,所以你不能用伪造的POST数据在表单提交时重定向他。所有POST数据都会在重定向时丢失。
作为一个丑陋的解决方法,我建议以下操作:你可以像现在这样对自己进行身份验证,然后让用户从你的网站浏览统计数据,类似于代理所做的。然后,你可以将页面上的所有链接更改为类似于 yoursite.com/viewstats/?page=URL 的内容,其中 URL 是用户想要查看的统计网站的页面。你抓取那个页面并展示给用户。你需要更改相对路径以保持他们的设计,并且你还需要更改所有类似于这样的内部网站链接 "/viewstats/?page=" . urlencode($old_url),使它们指向你的代理门户。

好的,现在情况更清晰了,谢谢! 至于您的疑问,该服务是一个需要身份验证的在线目录,但不提供用户管理系统。 经过身份验证的用户只能访问远程目录。使用统计和用户管理由网站所有者保留,托管在我们自己的服务器上,并需要他们自己的单独身份验证。 - Lucius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接