在php中,如何通过POST模拟以完整的表单提交发送数据?

在php中,如何通过POST模拟以完整的表单提交发送数据?,php,curl,Php,Curl,我的问题是:我有一个在线服务,上面有我客户的目录。 此服务需要身份验证,但我只有一个用户名/pwd。 相反,我的客户希望使用他们自己的用户/pwd和访问统计信息分别管理每个用户。因此,我所做的是建立自己的帐户管理,目前为止效果良好。 我现在需要做的是添加一个登录表单,用户应该用自己的凭据填写该表单;发送后,脚本应继续进行身份验证,如果一切正常,则增加访问计数,通过POST发送远程系统的登录数据,并将浏览器重定向到响应页面,具体方式与正常表单相同。 我试着这样使用curl: if (authent

我的问题是:我有一个在线服务,上面有我客户的目录。
此服务需要身份验证,但我只有一个用户名/pwd。
相反,我的客户希望使用他们自己的用户/pwd和访问统计信息分别管理每个用户。因此,我所做的是建立自己的帐户管理,目前为止效果良好。
我现在需要做的是添加一个登录表单,用户应该用自己的凭据填写该表单;发送后,脚本应继续进行身份验证,如果一切正常,则增加访问计数,通过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提交的隐藏表单。
谢谢

使用:

从手册中:

如果为TRUE,则将传输作为返回值的字符串返回 curl_exec()而不是直接输出


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

我不明白的是,你可以用隐藏的凭证对用户进行身份验证,然后让他完全访问统计数据,为什么不让他访问?你为他提供了对一切的完全访问权限,但不给他登录名和密码

另一方面,POST重定向是不可能的,所以您不能在表单提交时使用伪造的POST数据重定向他。所有POST数据在重定向时丢失


作为一个难看的解决办法,我建议如下:你可以像现在一样对自己进行身份验证,然后让用户从你的网站浏览统计数据,就像代理所做的那样。然后,您可以将页面上的所有链接更改为类似于
yoursite.com/viewstats/?page=URL
,其中
URL
是用户想要查看的统计站点的页面。您抓取该页面并将其显示给用户。您需要更改css/js文件的相对路径以保持其设计,还需要更改网站内的所有链接,如以下
“/viewstats/?page=”。urlencode($old_url)
因此它们指向您的代理类门。

一切正常,但我需要的是浏览器重定向到目标页面,例如表单提交后,它会将目标页面加载到mine@LuciuscURL是服务器端。它不会重定向浏览器。您可能需要使用JavaScript来实现这一点。使用JS太不安全了,因为这意味着要公开用户名和密码,而出于明显的原因,不应公开用户名和密码。。那么,除了卷曲,没有别的办法吗?@卢修斯,你找到解决办法了吗?我遇到了同样的问题,我需要使用cURL提交带有隐藏用户名和密码的表单数据,不能公开。好的,现在图片更清晰了,谢谢!至于您的疑问,该服务是一个在线目录,需要认证,但不提供用户管理系统。经过身份验证的用户只能访问远程目录。使用率统计和用户管理由网站所有者保留,托管在我们自己的服务器上,并且需要他们自己单独的身份验证。那么您最终是如何解决这个问题的呢?
curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);