У меня есть страница, которая показывает значение из сеанса, позволяет называть его www.domain-a.com/master.php, и если я набираю его непосредственно из браузера, он показывает мне значение сеанса.
но когда я пытаюсь загрузить его с помощью file_get_contents (или другого метода) из другого домена, например, www.domain-b.com/slave.php, он не извлекает содержимое, защищенное сеансом, просто пустую страницу.
Я знаю, это потому, что сервер-б пытается получить контент, а не пользователь …
кто-нибудь знает, как сообщить домену – кто-то, кто получает информацию, является пользователем? есть способ получить значение сеанса?
С уважением,
josé
Существует одно полезное решение.
Отправка 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);
он отлично работает. Да, да, да
Вероятно, вам нужно отправить идентификатор сеанса пользователя в файл 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);
имейте в виду, что если ваш код сеанса проверяет IP-адрес клиента, у вас могут все еще возникать проблемы, так как IP-адрес клиента, размещенный на вашей странице, будет отображаться на запрашивающем сервере (используя curl или file_get_contents) вместо клиентского браузера.
если у вас есть контроль над сайтом http://www.domain-a.com/master.php
то вы можете запрограммировать его таким образом, чтобы вы могли отправить его имя пользователя в зашифрованном виде и, например, master.php? user = zxcvert2324 или что угодно, и оно расшифровало бы и узнало, кто отправляет запрос.
В противном случае вам нужно будет заглянуть в CURL и создать сеанс, сначала запустив логин на этот сайт, а затем на следующий запрос перейдите на эту страницу master.php.
Возможно, ваши настройки PHP запрещают вам получать файлы через HTTP.
Возможные виновники:
allow_furl_open
Вы должны иметь возможность извлекать контент с помощью curl. См. Этот ответ (возможно, вы можете удалить опцию spoof браузера).