2015-03-17 5 views
0

У меня вопрос о безопасности и сеансах cookie. Сайт, который я создаю в данный момент, использую ниже:авторизация в сеансе cookie VS security

Когда пользователь вошел в систему, я даю сеансу cookie 'authenticate'. Далее в скрипте я использую этот файл cookie. как:

if ($_SESSION['authenticate'] === 'fail'){do something} 
else if ($_SESSION['authenticate'] === 'pass'){do something else} 

, но теперь вопрос ... из соображений безопасности мое чутье говорит: НЕ ОБЕСПЕЧИТЬ !!! .... есть более безопасный способ сделать это whitout куки сессии? Руда это полный надежный способ?

thnx в продвинутом состоянии.

+0

По мне это безопасно. –

ответ

2

Вам нужно понять разницу между сеансами PHP и куки.

Куки-файлы - это строки, которые отправляются сервером в браузер, и что браузер должен отправить сервер обратно на каждый последующий запрос до истечения срока действия файла cookie.
Например, если сервер отвечает запросом с заголовком Set-Cookie: foo=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT, при каждом последующем запросе до 9 июня 2012 года браузер должен отправить запрос Cookie: foo=abc123.
На скрипте PHP $_COOKIE['foo'] будет abc123.

PHP-сессии основаны на файлах cookie, но они не сохраняют значения внутри файла cookie.
Если вы храните $_SESSION['foo'] = 'abc123', сервер НЕ отправит foo=abc123 клиенту в качестве файла cookie, но скорее создаст сеанс , хранящийся на сервере, и отправит в качестве файла cookie только идентификатор сеанса.
Итак, когда вы вызываете session_start(), PHP генерирует новый сеанс на сервере с автогенерированным идентификатором (если вам интересно, вы можете прочитать идентификатор с session_id()). Затем он отправит (автоматически) файл cookie клиенту, похожий на phpsessid=PHP_SESSION_ID_HERE. Все это делается автоматически с помощью PHP, и вам не нужно об этом беспокоиться.

В конце этой истории, да, ваш код в безопасности. Это связано с тем, что вы не устанавливаете файл cookie authenticated=pass (который будет небезопасным, так как клиенты могут легко перезаписать файлы cookie), но вместо этого вы сохраните это значение в хранилище сеансов PHP, и клиент увидит только идентификатор сеанса.

PS: вместо простого хранения логического «аутентифицированного» вы можете захотеть сохранить более полезную информацию в сеансе, такую ​​как идентификатор пользователя аутентифицированного пользователя в базе данных или что-нибудь еще, что может иметь смысл.

PS2: PHP-сессии имеют устаревшую поддержку браузеров, у которых нет файлов cookie, но в 2015 году это бессмысленно (интересно, кто до сих пор отключает куки!), Если вы это сделаете, 90% сайтов перестанут работать). Как следствие, вы должны убедиться, что у вас есть эти два ини настройки: (КОХ: http://php.net/manual/en/session.configuration.php#ini.session.use-cookies)

session.use_cookies 1 
session.use_only_cookies 1 
+1

Следует отметить (хотя и несколько оффтопный, поскольку предполагается, что остальная часть приложения небезопасна), что вы должны привязать 'session_id()' к IP-адресу клиентов. Это поможет предотвратить захват сеанса и хищение файлов cookie. ** + 1 от меня, большое объяснение **. –

+1

@ ʰᵈˑ Спасибо :) Говоря о привязке сессии к IP ...Некоторые люди могут утверждать, что они не на 100% надежны, поскольку (по крайней мере в прошлом) были ситуации, когда один и тот же пользователь мог подключаться к различным IP-адресам даже в разных классах (например, корпоративный). Еще одна хорошая идея - связать сеанс с пользовательским агентом браузера, поскольку это, конечно, не изменится для продолжительности сеанса. – Qualcuno

+1

О да, согласен. Под этим я подразумеваю, что проверка 'session_id()' действительна против IP, не получая 'session_id()', передавая IP. Таким образом, если кто-то захватывает ваши файлы cookie и получает ваш «PHPSESSID», они должны быть в одной сети или обманывать их IP (?). Сделать сложнее захватить, да, но невозможно? Неуверенный. –

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