Есть ли способ открыть содержимое страницы через php, используя куки, хранящиеся в браузере? - PullRequest
2 голосов
/ 02 июля 2010

У меня есть веб-сайт на основе PHP, к которому я хотел бы добавить зону только для членов. Вместо того, чтобы создавать свои собственные страницы регистрации / входа в систему, я хотел бы создать фрагмент кода, который будет проверять, вошел ли пользователь на определенном сайте (для простоты, мы могли бы предположить, что это сайт Facebook) и, если да, разрешить ему перемещаться по моему сайту. Если нет, скажите ему, чтобы войти на этот сайт и вернуться после этого.

Я хотел бы добиться этого, заставив мой сайт открыть страницу на этом сайте, на которой есть экран приветствия, если пользователь вошел в систему или в противном случае требует имя пользователя / пароль. Анализируя содержимое этой страницы, я смогу увидеть, вошел ли пользователь в систему или нет.

Я пытался добиться этого с помощью CURL (см. Код ниже), но безуспешно, так как даже если пользователь вошел на этот сайт через тот же браузер, при открытии моего сайта было показано, как будто он не было. Я полагаю, что проблема в файлах cookie, поскольку я где-то читал, что при выполнении запросов CURL файлы cookie, сохраненные в браузере, недоступны.

Есть ли способ заставить PHP-скрипт открыть страницу с другого сайта, используя куки, сохраненные в браузере (куки были созданы ранее этим сайтом)?

Here is the PHP code from my site:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.my-site.com');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'User agent');
$data = curl_exec($ch);
echo($data);

Ответы [ 5 ]

3 голосов
/ 02 июля 2010

Во-первых, это абсолютно ужасный способ обработки логина для вашего сайта.

Во-вторых, если вы хотите использовать Facebook, у них есть API, который вы можете посмотреть, чтобы узнать, является ли ваш пользовательвошел в систему.

В-третьих, CURL может хранить и использовать файлы cookie, присутствующие только на компьютере, на котором выполняется код - это ваш сервер, а не компьютер вашего пользователя.

Если вы действительно можете только серверпользователи, которые зарегистрированы на другом сайте, пытаются каким-то образом сотрудничать с этим сайтом.В противном случае вы можете запросить у своих пользователей их имя пользователя и пароль для другого сайта, а затем попытаться войти в систему с помощью CURL с вашего сервера, чтобы проверить, действительны ли имя пользователя и пароль.

3 голосов
/ 02 июля 2010

Браузеры ваших пользователей не будут отправлять вам свои cookie-файлы на Facebook. Без этого вы не сможете реализовать свой план. Если бы вы могли получить их, вы бы эффективно взломали учетную запись этого человека на Facebook, чего не хотите делать, верно?

Попробуйте OpenID , используемый такими сайтами, как stackoverflow.com.

1 голос
/ 02 июля 2010

Я действительно думаю, что это действительно хороший вопрос. Итак, вот некоторые мысли.

Во-первых, cookie-файлы явно разработаны, чтобы не допустить этого. Подумайте об этом: когда вы заходите на facebook.com из дома, это замечательно - fbook использует куки-файлы для отслеживания вашего статуса входа в систему, и этот куки-файл привязан к сеансу вашего браузера. Кто-то другой, проверяющий facebook из своего офиса, не будет знать ваш логин - потому что это просто совершенно другой запрос от другого браузера на другом компьютере с другим IP-адресом и другим набором файлов cookie. Пока все хорошо.

Так что подумайте: вы заходите на Facebook со своего компьютера. Теперь вы открываете эту специальную веб-страницу, которая пытается использовать cURL для просмотра информации о вашем сеансе (вне зависимости от того, вошли вы в систему или нет).

Что ж, "открытие сеанса скручивания" эквивалентно "открытию сеанса браузера" - верно? Только ваш «веб-браузер» имеет другой интерфейс - командная строка и графический интерфейс.

Это означает, что cURL фактически является отдельной сущностью от отдельного домена, открывающего Facebook, так же, как офисный работник, проверяющий, что их страница полностью независима от вашей.

Кроме того, файлы cookie используются в браузерах таким образом, что одному домену (user382155.com) не разрешен доступ к файлам cookie из другого домена (facebook.com). Это из соображений безопасности.

Так как вы можете этого достичь? Вот несколько идей. (Некоторые из них - плохие идеи. Но идея состоит в том, чтобы начать думать о решениях.)

  1. Вы можете запустить скрипт cURL на том же компьютере, что и веб-браузер. Вы знаете, запустить веб-сервер локально. Затем вы можете поиграть с настройками apache / php, чтобы ваш PHP-скрипт мог получить доступ к файлам cookie вашего браузера. Затем ваш сценарий может использовать эту информацию cookie, чтобы определить, разрешать ли вам вход в систему. Или перенаправить вас на сайт в вашем собственном домене (плохая идея). Или что-то.

  2. Вы можете использовать несколько умных расширений firefox или сценария greasemonkey, чтобы выполнить этот «межсайтовый скриптинг» для вас - чтобы проверить состояние файлов cookie Facebook и использовать их для авторизации вашего собственного сайта. Это соответствует предыдущему предложению. Проблема в том, что вам нужен клиент для установки какого-либо скрипта. Вы могли бы быть в состоянии сделать что-то умное с javascript, но я сомневаюсь в этом - это именно то, что атака "XSS".

  3. Вы можете отслеживать процесс входа в Facebook и пытаться перепроектировать то, что он делает. Я бы порекомендовал LiveHTTPHeaders , чтобы помочь с этим. Затем вы можете получить в веб-форме имя пользователя / пароль fbook, а затем использовать cURL, чтобы «имитировать» процесс входа в систему с использованием этой информации. Это может быть против политики Facebook. (конечно, замените «facebook» тем веб-сайтом, который вас интересует. В случае с Facebook это явно противоречит их политике)

Ни одно из этих решений не является отличным (и они небезопасны, вероятно, нарушают ToS, бла-бла-бла). Вы пытаетесь сделать что-то, для чего сеть явно не предназначена.

После всего этого, отвечая на ваш вопрос: нет, один домен не может получить доступ к файлам cookie другого домена. (Но вы можете попробовать!)

1 голос
/ 02 июля 2010

Вы не можете получить файлы cookie, которые не были установлены вашим сайтом (или файлами одного и того же домена).

С http://en.wikipedia.org/wiki/HTTP_cookie#Privacy_and_third-party_cookies:

"Файлы cookie имеют некоторые важные последствия для конфиденциальности и анонимности веб-пользователей. Хотя файлы cookie отправляются только на сервер, который их настраивает, или на сервер в том же домене Интернета, веб-страница может содержать изображения или другие компоненты, хранящиеся на серверах в другие домены. Файлы cookie, которые устанавливаются во время поиска этих компонентов, называются файлами cookie сторонних производителей. К ним относятся файлы cookie из нежелательных всплывающих окон. "

OpenID - достойный способ справиться с этим. Якобы у Зенда есть приличная библиотека для этого (хотя я сам не пробовал): http://devzone.zend.com/article/3581

Обновление: вот статья, которую я нашел, используя cURL, поскольку вы сказали, что уже используете это: http://www.110mb.com/forum/tip-how-to-use-simple-openid-t30219.0.html

0 голосов
/ 19 декабря 2016

Здесь много достойных ответов, но я решил добавить свои два цента.

Большинство сайтов приличного размера с логинами позволяют получить то, что вы запрашиваете через API.Это обычно требует некоторого OAuth к и от определенного домена.Просто найдите «единый вход» для любого домена, с которым вы работаете.

Если у вас есть контроль над соответствующим доменом, и нет единого входа, тогда вы можете свернуть свой собственный.Как уже говорили многие, разные домены не могут получить доступ к другим файлам cookie по соображениям безопасности.Обычно, чтобы обойти это, люди используют Iframes одного домена, встроенного в страницу другого домена.Внешний кадр все еще не может получить доступ к внутреннему содержимому, но вы можете делать запросы GET при загрузке.Как правило, происходит загрузка iframe, пользователь может щелкнуть по iframe, после чего в домене с фреймами произойдет некоторая проверка.Как только все будет в порядке, он перенаправит браузер обратно в ваш домен с токеном OAuth, который вы затем сможете использовать для проверки API на каждой странице навигации.

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