我有一个显示会话值的页面,我们称之为www.domain-a.com/master.php,如果我直接从浏览器输入,它会显示会话值。
但是当我尝试从另一个域(例如www.domain-b.com/slave.php)下载file_get_contents(或其他方法)时,它不会检索受会话保护的内容,只是一个空白页面。
我知道这是因为server-b正在尝试检索内容,而不是用户...
任何人都知道如何告诉域 - a检索信息的用户是谁?有一种方法可以检索会话值吗?
的问候,
何
答案 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)
答案 5 :(得分:-1)
您应该能够使用curl检索内容。请参阅this answer(您可以删除浏览器欺骗选项)。