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);
}

但我最终将目标页面的数据加载到我自己的页面中,而不是被重定向到该站点。
我应该怎么办?
PS 如果可能的话,我会避免使用通过 JS 提交的隐藏表单。
谢谢!

4

2 回答 2

2

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

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

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

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

于 2012-12-06T14:13:23.940 回答
2

使用CURLOPT_RETURNTRANSFER

curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);

从手册:

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

于 2012-12-06T12:21:33.303 回答