有没有办法通过php打开页面内容,使用存储在浏览器中的cookie?

时间:2010-07-02 15:35:01

标签: php cookies curl

我有一个基于PHP的网站,我想添加一个仅限会员的区域。而不是创建我自己的注册/登录页面,我想制作一段代码,看看用户是否登录了特定网站(为简单起见,我们可以假设这个网站是Facebook),如果是,请允许他在我的网站上导航如果不是,请告诉他登录该网站并在此之后回来。

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

我试图通过使用CURL来实现这一点(参见下面的代码),但没有成功,因为即使用户通过同一浏览器登录该网站,打开我的网站时也显示出来不是。我想这个问题出现在cookies中,因为我在某处读到了这个问题,而在发送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);

5 个答案:

答案 0 :(得分:3)

您的用户的浏览器不会向您发送他们的Facebook Cookie。没有这些,您就无法实施计划。如果你可以获得它们,你就会有效地攻击了你不想做的人的facebook帐户,对吗?

尝试使用stackoverflow.com等网站使用的OpenID

答案 1 :(得分:3)

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

其次,如果它实际上是您想要使用的Facebook,那么他们可以通过API查看您的用户是否已登录。

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

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

答案 2 :(得分:1)

您无法获取未经您的网站设置的Cookie(或同一域中的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

答案 3 :(得分:1)

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

首先,明确设计cookie不允许这种情况发生。想想看:当你从家里去facebook.com时,那就太棒了 - fbook使用cookies来跟踪你的登录状态,那个cookie被绑定到你的浏览器会话。从他们的办公室检查Facebook的其他人将不知道您的登录 - 因为它只是来自不同计算机上具有不同IP地址和不同cookie集的不同浏览器的完全不同的请求。到目前为止一切都很好。

所以想一想:你从电脑上登录facebook。现在你打开这个特殊的网页 - 它试图使用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来帮助解决这个问题。然后,您可以让您的Web表单获取fbook用户名/密码,然后使用cURL“模仿”使用该信息的登录过程。这可能违反了facebook的政策。 (当然,将“facebook”替换为您感兴趣的任何网站。对于Facebook,这明确违反了他们的政策。)

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

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

答案 4 :(得分:0)

这里有很多不错的答案,但我以为我会把我的两分钱扔进去。

大多数尺寸合适的登录网站都可以通过API提供您所要求的内容。它通常需要与特定域之间的某些OAuth。只需查看您正在使用的任何域名的“单点登录”。

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

相关问题