Php 文件\u获取\u内容(或curl或fopen)与会话数据有关的问题
我有一个显示会话值的页面,我们称它为www.domain-a.com/master.php,如果我直接从浏览器中键入,它会显示会话值 但是,当我试图从另一个域(如www.domain-b.com/slave.php)下载它时,它并没有检索受会话保护的内容,只是一个空白页面 我知道这是因为服务器b试图检索内容,而不是用户 有人知道如何告诉域a谁是检索信息的用户吗?是否有方法检索会话值 问候,Php 文件\u获取\u内容(或curl或fopen)与会话数据有关的问题,php,session,curl,fopen,file-get-contents,Php,Session,Curl,Fopen,File Get Contents,我有一个显示会话值的页面,我们称它为www.domain-a.com/master.php,如果我直接从浏览器中键入,它会显示会话值 但是,当我试图从另一个域(如www.domain-b.com/slave.php)下载它时,它并没有检索受会话保护的内容,只是一个空白页面 我知道这是因为服务器b试图检索内容,而不是用户 有人知道如何告诉域a谁是检索信息的用户吗?是否有方法检索会话值 问候, josé您的PHP配置可能禁止您通过HTTP检索文件 可能的罪犯: 您应该能够使用curl检索内容
josé您的PHP配置可能禁止您通过HTTP检索文件 可能的罪犯:
file\u get\u contents
功能,必须设置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);
请记住,如果会话代码根据客户端IP地址进行验证,那么您可能仍然存在问题,因为发布到页面的客户端IP将是请求服务器的IP(使用curl或file\u get\u contents),而不是客户端浏览器的IP。如果您可以控制 www.domain-a.com/master.php 然后,您可以对其进行编程,以加密方式向其发送用户名,比如master.php?user=zxcvert2324或其他什么,它将解密并知道谁在发送请求
否则,您需要查看CURL并创建会话,首先让CURL登录到该站点,然后在下一次请求时转到master.php页面。有一个有用的解决方案 将PHPSESSID发送到另一台服务器没有意义,因为会话数据存储在服务器上的一个文件中,这就是为什么file\u get\u内容会阻止http服务的原因。这很简单。客户机使用http连接到服务器,服务器打开包含会话数据的文件,当然可以进行写入。文件获取内容创建另一个连接到同一服务器的连接(另一个线程)。若设置了会话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);
它很好用。是的是的你说的“用户”是谁?但我不知道用户的PHPSESID。。。我怎么知道呢?除了用户提供给你的cookie之外,你无法从其他网站获取用户的cookie。因为cookie是特定于域的,并且只发送到其有效的域。如何在同一会话(而不是新会话)中发布数据?