会话数据的file_get_contents(或curl或fopen)问题

时间:2009-04-19 21:17:00

标签: php session curl fopen file-get-contents

我有一个显示会话值的页面,我们称之为www.domain-a.com/master.php,如果我直接从浏览器输入,它会显示会话值。

但是当我尝试从另一个域(例如www.domain-b.com/slave.php)下载file_get_contents(或其他方法)时,它不会检索受会话保护的内容,只是一个空白页面。

我知道这是因为server-b正在尝试检索内容,而不是用户...

任何人都知道如何告诉域 - a检索信息的用户是谁?有一种方法可以检索会话值吗?

的问候,

6 个答案:

答案 0 :(得分:18)

有一个有用的解决方案。

将PHPSESSID发送到另一台服务器没有意义,因为会话数据存储在服务器上的文件中,这就是file_get_contents阻止http服务的原因。很简单。客户端使用http连接到服务器,服务器打开文件,其中包含用于写入的会话数据。 file_get_contents创建连接到同一服务器的另一个连接(另一个线程)。如果设置了会话ID,则服务器会打开包含会话数据的相同文件,但此文件已打开。

所以这是防止这种碰撞的好方法:

$opts = array( 'http'=>array( 'method'=>"GET",
              'header'=>"Accept-language: en\r\n" .
               "Cookie: ".session_name()."=".session_id()."\r\n" ) );

$context = stream_context_create($opts);
session_write_close();   // this is the key
$obsah = file_get_contents( 'http://blablabla.cz', false, $context);

它工作正常。是是是

答案 1 :(得分:5)

您可能需要在Cookie中发送用户的会话ID以及请求。

如果您想使用file_get_contents功能,则必须create a context设置Cookie:

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => 'Cookie: PHPSESSID=0123456789abcdef0123456789abcdef'
    )
);
$context = stream_context_create($opts);
echo file_get_contents('http://master.example.com/master.php', 0, $context);

答案 2 :(得分:0)

请记住,如果您的会话代码针对客户端IP地址进行验证,那么您可能仍会遇到问题,因为发布到您页面的客户端IP将是请求服务器的IP(使用curl或file_get_contents)而不是客户端浏览器。

答案 3 :(得分:0)

如果你有控制权 www.domain-a.com/master.php

然后你可以用一种方式编程,你可以用加密方式发送用户名,比如master.php?user = zxcvert2324或者其他什么,它会解密并知道谁在发送请求。

否则你需要查看CURL并通过首先让curl登录到该站点然后在下一个请求转到master.php页面来创建会话。

答案 4 :(得分:-1)

您的PHP配置可能禁止您通过HTTP检索文件。

可能的罪魁祸首:

答案 5 :(得分:-1)

您应该能够使用curl检索内容。请参阅this answer(您可以删除浏览器欺骗选项)。