【问题标题】:Is there a way to open the content of a page via php, using the cookies stored in the browser?有没有办法通过 php 使用存储在浏览器中的 cookie 打开页面内容?
【发布时间】:2010-07-02 15:35:01
【问题描述】:

我有一个基于 PHP 的网站,我想在其中添加一个会员专区。我不想创建自己的注册/登录页面,而是想编写一段代码来查看用户是否登录了特定站点(为简单起见,我们可以假设该站点是 Facebook),如果是,允许他在我的网站上导航。如果不是,请告诉他登录该网站,然后再回来。

我想通过让我的网站在该网站上打开一个页面来实现这一点,如果用户已登录,则该页面有一个欢迎屏幕,否则需要用户名/密码。通过分析该页面的内容,我将能够查看用户是否已登录。

我尝试通过使用 CURL(参见下面的代码)来实现这一点,但没有成功,因为即使用户通过相同的浏览器登录该站点,在打开我的站点时它也显示为好像他不是。我想问题出在 cookie 中,因为我在某处读到过,在发出 CURL 请求时,保存在浏览器中的 cookie 不可用。

有没有办法让 PHP 脚本使用浏览器中存储的 cookie(cookie 之前由该站点创建)从另一个站点打开页面?

Here is the PHP code from my site:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.my-site.com');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'User agent');
$data = curl_exec($ch);
echo($data);

【问题讨论】:

  • “有没有办法让 PHP 脚本打开另一个站点的页面,使用浏览器中存储的 cookie(cookie 之前由该站点创建)?”。不,这将是一个巨大的安全问题。

标签: php cookies curl


【解决方案1】:

您用户的浏览器不会向您发送他们的 Facebook cookie。没有这些,您将无法实施您的计划。如果您可以得到它们,那么您实际上已经入侵了此人的 Facebook 帐户,而您不想这样做,对吧?

试试OpenID,被stackoverflow.com等网站使用。

【讨论】:

  • 其实我不需要cookies,我只需要查看那个页面的内容(打开它浏览器必须使用存储在客户端机器上的cookies)
  • 如果浏览器使用它的 cookie 打开它,您将无法以任何形式或形式访问请求。如果您的 PHP 打开该页面,您不会获得浏览器的 cookie。
【解决方案2】:

首先,这是处理网站登录的一种绝对可怕的方式。

其次,如果您要使用的实际上是 Facebook,他们有一个 API,您可以查看您的用户是否已登录。

第三,CURL 只能存储和使用运行代码的机器上的 cookie - 那是您的服务器,而不是您用户的计算机。

如果您确实只能为在其他站点注册的用户提供服务,请尝试以某种方式与该站点合作。否则,您可以向您的用户询问他们在其他站点的用户名和密码,然后尝试从您的服务器使用 CURL 登录以查看用户名和密码是否有效。

【讨论】:

  • 实际上它不是 Facebook,它是一个具有封闭会员资格的网站,我需要只允许在该封闭会员网站上拥有帐户的用户访问我的网站。好的,但是有没有其他方法可以使用 PHP 或通过其他基于 Web 的编程语言来完成此任务?
  • 您可以向您的用户询问他们在其他站点的用户名和密码,然后尝试从您的服务器使用 CURL 登录以查看用户名和密码是否有效。
  • 该评论看起来是迄今为止最有帮助的答案。您应该将其添加到您的答案中。
【解决方案3】:

我实际上认为这是一个非常好的问题。所以这里有一些想法。

首先,cookie 明确设计为不允许这种情况发生。想一想:当您在家中访问 facebook.com 时,这很棒 - fbook 使用 cookie 来跟踪您的登录状态,并且该 cookie 绑定到您的浏览器会话。从他们的办公室检查 facebook 的其他人不会知道您的登录信息 - 因为这只是来自不同计算机上不同浏览器的完全不同的请求,具有不同的 IP 地址和不同的 cookie 集。到目前为止一切顺利。

所以想一想:你从电脑上登录 Facebook。现在你打开这个特殊的网页——它试图使用 cURL 来查看关于你的会话的信息(无论你是否登录。)

好吧,“打开一个 curl 会话”相当于“打开一个浏览器会话”——对吧?只有您的“网络浏览器”具有不同的界面 - 命令行与 gui。

这意味着 cURL 实际上是一个独立于打开 facebook 域的独立实体,就像检查他们页面的办公室工作人员完全独立于你的页面一样。

此外,cookie 是在浏览器中实现的,因此不允许一个域 (user382155.com) 访问另一个域 (facebook.com) 的 cookie。这是出于安全原因。

那么你怎么能做到这一点呢?这里有一些想法。 (其中一些想法很糟糕。但想法是开始考虑解决方案。)

  1. 您可以在与 Web 浏览器相同的计算机上运行 cURL 脚本。你知道,在本地运行一个 Web 服务器。然后您可以使用 apache/php 设置,以便您的 PHP 脚本可以访问浏览器的 cookie 文件。然后您的脚本可以使用该 cookie 信息来确定是否让您登录。或者将您重定向到您自己域上的网站(坏主意)。什么的。

  2. 您可以使用一些聪明的 firefox 扩展程序或greasemonkey 脚本来为您执行此“跨站点脚本” - 检查 facebook cookie 的状态并使用它来验证您自己的网站。这与之前的建议一致。问题是您需要客户端安装某种脚本。您也许可以用 javascript 做一些聪明的事情,但我对此表示怀疑——这正是“XSS”攻击。

  3. 您可以监控 facebook 的登录过程并尝试对其进行逆向工程。我会推荐LiveHTTPHeaders 来帮助解决这个问题。然后,您可以让您的网络表单获取 fbook 用户名/密码,然后使用 cURL 使用该信息“模仿”登录过程。这可能违反了 Facebook 的政策。 (当然,将“facebook”替换为您感兴趣的任何网站。对于 Facebook,这明确违反了他们的政策。)

这些都不是很好的解决方案(而且它们不安全,可能违反 ToS,blahblahblah)。您正在尝试做一些网络明确设计不做的事情。

毕竟,要回答您的问题:不,没有办法让一个域访问另一个域的 cookie。 (但你一定可以试试!)

【讨论】:

  • 谢谢你的回答,真的让我明白了情况。
【解决方案4】:

您无法获取不是由您的网站(或同一域中的一个)设置的 cookie。

来自http://en.wikipedia.org/wiki/HTTP_cookie#Privacy_and_third-party_cookies

“Cookie 对 Web 用户的隐私和匿名性有一些重要影响。虽然 Cookie 仅发送到设置它们的服务器或同一 Internet 域中的服务器,但网页可能包含存储在服务器上的图像或其他组件其他域。在检索这些组件期间设置的 Cookie 称为第三方 Cookie。这包括来自不需要的弹出广告的 Cookie。"

OpenID 是处理这个问题的好方法。 Zend 应该有一个不错的库来执行此操作(尽管我自己没有尝试过):http://devzone.zend.com/article/3581

更新:这是我使用 cURL 找到的一篇文章,因为您说您已经在使用它:http://www.110mb.com/forum/tip-how-to-use-simple-openid-t30219.0.html

【讨论】:

  • 好的,但是我可以使用我网站上的一些代码以某种方式从该网站打开一个页面(它不支持 OpenId,因为它是一个封闭式会员)?我不需要查看 cookie 的值,我只需要该页面的内容(需要从客户端计算机的浏览器中打开 cookie)
【解决方案5】:

这里有很多不错的答案,但我想我会投入两分钱。

大多数规模适中的带有登录名的网站都允许通过 API 满足您的要求。它通常需要一些 OAuth 进出特定域。只需为您正在使用的任何域寻找“单点登录”。

如果您对相关域具有控制权,并且没有单点登录,那么您可以自己滚动。正如许多人所说,出于安全原因,不同的域无法访问其他 cookie。通常为了解决这个问题,人们使用嵌入在另一个域页面中的一个域的 iframe。外框仍然无法访问内部内容,但您可以在加载时发出 GET 请求。通常会发生什么是 iframe 将被加载,用户可以单击 iframe,然后在框架域中进行一些验证。一切正常后,它将使用 OAuth 令牌将浏览器重定向回您的域,然后您可以使用该令牌在每个页面导航时针对 API 进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    相关资源
    最近更新 更多