file_get_contents (или curl, или fopen) проблема с данными сеанса - PullRequest
2 голосов
/ 20 апреля 2009

У меня есть страница, которая показывает значение из сеанса, давайте назовем его www.domain-a.com/master.php, и если я наберу его прямо из браузера, он покажет мне значение сеанса.

но когда я пытаюсь загрузить его с помощью file_get_contents (или другого метода) из другого домена, например www.domain-b.com/slave.php, он не получает содержимое, защищенное сеансом, а просто пустую страницу.

я знаю, это потому, что сервер-b пытается получить контент, а не пользователя ...

Кто-нибудь знает, как сообщить домену, что пользователь, который извлекает информацию? есть способ получить значение сеанса?

С уважением,

josé

Ответы [ 6 ]

18 голосов
/ 04 июня 2013

Есть одно полезное решение.

Отправка PHPSESSID на другой сервер не имеет смысла, поскольку данные сеанса хранятся в файле на сервере, и именно поэтому file_get_contents блокирует службу http. Это просто. Клиент подключается к серверу, используя http, и сервер, конечно, открывает файл с данными сеанса для записи. file_get_contents создает другое соединение (другой поток), которое соединяется с тем же сервером. Если идентификатор сеанса установлен, то сервер открывает тот же файл с данными сеанса, но этот файл уже открыт.

так что вот хорошее решение, которое предотвращает это столкновение:

$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);

работает нормально. Да да да

5 голосов
/ 20 апреля 2009

Возможно, вам необходимо отправить идентификатор сеанса пользователя в файле cookie вместе с запросом.

Если вы хотите использовать функцию file_get_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);
0 голосов
/ 29 сентября 2009

, если у вас есть контроль над www.domain-a.com/master.php

тогда вы можете запрограммировать его так, чтобы вы могли отправить ему имя пользователя в зашифрованном виде, например master.php? User = zxcvert2324 или что-то еще, и он расшифровал и узнал, кто отправляет запрос.

В противном случае вам нужно будет заглянуть в CURL и создать сеанс, сначала войдя в систему с помощью curl, и затем при следующем запросе перейдите на страницу master.php.

0 голосов
/ 21 апреля 2009

имейте в виду, что если ваш код сеанса проверяется по IP-адресу клиента, то у вас все еще могут быть проблемы, поскольку IP-адрес клиента, публикуемый на вашей странице, будет идентифицировать запрашивающий сервер (с использованием curl или file_get_contents) вместо клиентского браузера.

0 голосов
/ 20 апреля 2009

Вы должны быть в состоянии получить содержимое с помощью curl. См. этот ответ (возможно, вы можете отказаться от опции подделки браузера).

0 голосов
/ 20 апреля 2009

Ваши конфигурации PHP, вероятно, запрещают вам получать файлы по HTTP.

Возможные виновники:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...