2015-11-03 5 views
1

У меня есть веб-приложение, в котором я намерен предоставить каждому клиенту собственный субдомен, такой как client1.myapp.com, client2.myapp.com и т. Д. Когда пользователь входит в систему, я храню их ID пользователя в переменной сеанса, например $_SESSION['user'] = 4; Когда установлено $_SESSION['user'], пользователь вошел в систему и может получить доступ к приложению. Поскольку идентификаторы пользователей уникальны только для каждого отдельного клиента, мне нужен способ не допустить доступа пользователей к субдоменам других клиентов. Я подумал использовать для этого cookie сеанса, но потом решил, что файлы cookie могут быть взломаны. Теперь я собираюсь назначить каждому клиенту уникальный идентификатор клиента и использовать $_SESSION[$clientID]['user'] вместо $_SESSION['user']. Это безопасный способ решения проблемы? Какие у меня есть другие варианты?Как ограничить пользователей своим поддоменом

ответ

1

Нет ничего плохого в вашем подходе $clientID.

Если вы хотите получить фантазию, вы можете сделать что-то вроде использования session_set_cookie_params, так что то же самое PHPSESSID cookie может быть доступно для всех доменов и поддоменов. Это имеет свои преимущества, особенно если ваша централизованная страница входа в систему должна определить, зарегистрирован ли пользователь для определенного домена или поддомена. Или если вы хотите разрешить пользователю выходить из всех поддоменов одновременно или создать административную учетную запись, которая может получить доступ ко всем субдоменам.

Никогда не доверяйте идентификатору сеанса, даже если файл cookie привязан к определенному субдомену, поскольку сеансы для всех поддоменов составляют stored в том же каталоге на сервере.
Решение для этого может быть: ini_set(session.save_path, "/path/to/your/folder/$clientid"), тогда у вас будет уникальный каталог, предназначенный для каждого клиента для хранения сеансов. Преимущество такого подхода заключается в том, что ваш $_SESSION не будет содержать информацию, связанную с другим поддоменом.

Вы также можете использовать sesssion_name, поэтому вместо PHPSESSID вы можете использовать client1 или client2, чтобы было понятно, к какому клиенту принадлежит сеанс. , например. client2=8d72edf35377a27388cb;client8=b47277bc8e3d4a5f
, тогда PHP может прочитать этот файл cookie и знать клиента, для которого существует сессия.

Вы также можете использовать комбинацию из всех вышеперечисленных, независимо от того, что работает для вас.
См функции сессии связанные здесь: http://php.net/manual/en/book.session.php
И параметры сеанса, связанные здесь: http://php.net/manual/en/session.configuration.php

1

Попробуйте что-нибудь подобное. Я надеюсь, это поможет.

Когда пользователь входит в систему, хранить их субдомен в переменной сеанса, как:

$_SESSION['user_subdomain'] = 'client1.myapp.com'; 

И когда $_SESSION['user'] и $_SESSION['user_subdomain'] установлен, пользователь вошел в систему и доступ к приложению, то просто проверить текущее приложение, обращающееся-х субдомен равен $_SESSION['user_subdomain'] или нет.

Используя этот способ, вы можете перенаправить клиента на субдомен правильного приложения, если он попытался получить доступ к дополнительным доменам других клиентов. Таким образом, вы можете запретить пользователям получать доступ к поддоменам других клиентов.

Смежные вопросы