Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 文件\u获取\u内容(或curl或fopen)与会话数据有关的问题_Php_Session_Curl_Fopen_File Get Contents - Fatal编程技术网

Php 文件\u获取\u内容(或curl或fopen)与会话数据有关的问题

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检索内容

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

但是,当我试图从另一个域(如www.domain-b.com/slave.php)下载它时,它并没有检索受会话保护的内容,只是一个空白页面

我知道这是因为服务器b试图检索内容,而不是用户

有人知道如何告诉域a谁是检索信息的用户吗?是否有方法检索会话值

问候,


josé

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

可能的罪犯:


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

您可能需要将用户的会话ID与请求一起发送到cookie中

如果要使用
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是特定于域的,并且只发送到其有效的域。如何在同一会话(而不是新会话)中发布数据?