Каковы некоторые рекомендации по поддержанию ответственной безопасности сессий в PHP? В Интернете есть информация по всему миру, и самое время собрать ее в одном месте!
Есть несколько вещей сделать, чтобы сохранить Вашу сессию безопасной:
Одним из рекомендаций является вызов session_regenerate_id при каждом изменении уровня безопасности сессии. Это помогает предотвратить перехват сеанса.
Мои два (или больше) центы:
Есть крошечная, но хорошая книга по этой теме: [Существенная безопасность PHP с помощью Криса Шифлетта] (http://phpsecurity.org/).
! [Существенная безопасность PHP] (http://shiflett.org/images/essential-php-security-small.png)
На домашней странице книги Вы найдете некоторые интересные кодовые примеры и типовые главы.
Вы можете использовать упомянутую выше технику (IP & UserAgent), описанный здесь: [Как избежать хищения идентификационных данных] (http://devzone.zend.com/article/11906)
Я думаю, что одна из основных проблем (которая решается в PHP 6) - это register_globals. В настоящее время одним из стандартных методов, используемых для избежания register_globals
, является использование массивов $_REQUEST
, $_GET
или $_POST
.
"Правильный" способ сделать это (по состоянию на 5.2, хотя там есть небольшие ошибки, но он стабилен по состоянию на 6, которая скоро появится) - через filters.
Таким образом, вместо:
$username = $_POST["username"];
вы бы сделали:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
или даже просто:
$username = filter_input(INPUT_POST, 'username');
У этой бумаги фиксации сессии есть очень хорошие указатели, куда нападение может произойти. См. также страницу фиксации сессии в Википедии.
Используя IP-адрес isn' t действительно лучшая идея, по моему опыту. Например; в моем офисе есть два IP-адреса, которые привыкают в зависимости от груза, и мы постоянно сталкиваемся с проблемами, используя IP-адреса.
Вместо этого I' ve выбрал хранение сессий в отдельной базе данных для областей на моих серверах. Таким образом, ни у кого в файловой системе нет доступа к той информации о сессии. Это было действительно полезно с phpBB прежде 3.0 (they' ve, так как зафиксировано это), но it' s все еще хорошая идея я думаю.
session.cookie_httponly = 1
change session name from default PHPSESSID
Апачи #eq добавляют заголовок:
X-XSS-Protection 1
Это довольно тривиально и очевидно, но не забудьте session_destroy после каждого использования. Это может быть трудно реализовать, если пользователь не выходит из системы явно, поэтому для этого можно установить таймер.
Вот хороший учебник по setTimer() и clearTimer().
Основная проблема с сессиями PHP и безопасностью (помимо угона сессии) идет с тем, в какой окружающей среде Вы находитесь. По умолчанию PHP хранит данные о сессии в файле в OS' s справочник временного секретаря. Без любой специальной мысли или планирующий это - мировой удобочитаемый справочник, таким образом, вся Ваша информация о сессии общественная любому с доступом к серверу.
Что касается поддержания сессий по нескольким серверам. В том пункте было бы лучше переключиться, PHP пользователю обращался с сессиями, где это звонит, Ваши обеспеченные функции к СВЕРНУВШЕМУСЯ МОЛОКУ (создайте, прочитайте, обновите, удалите), данные о сессии. В том пункте Вы могли хранить информацию сессии в базе данных или кэш-памяти как решение так, чтобы у всех серверов приложений был доступ к данным.
Хранение Ваших собственных сессий может также быть выгодным, если Вы находитесь на общем сервере, потому что оно позволит Вам сохранить его в базе данных, которая Вы часто времена имеют больше контроля тогда файловая система.
Я настроил свои сессии как это -
на регистрации на странице:
$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
(фраза, определенная на странице конфигурации)
тогда на заголовке, который является всюду по остальной части места:
session_start();
if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {
session_destroy();
header('Location: http://website login page/');
exit();
}
Если Вы, которых Вы используете session_set_save_handler (), Вы можете установить своего собственного укладчика сессии. Например, Вы могли сохранить свои сессии в базе данных. Обратитесь к комментариям php.net для примеров укладчика сессии базы данных.
Сессии DB также хороши, если у Вас есть несколько серверов иначе, если бы Вы используете основанные на файле сессии, Вы должны были бы удостовериться, что у каждого webserver был доступ к той же файловой системе к чтению-записи сессии.
Я проверил бы и IP и Пользовательского Агента, чтобы видеть, изменяются ли они
if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
|| $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
{
//Something fishy is going on here?
}
Вы должны быть уверены, что данные о сессии безопасны. Смотря на Ваш php.ini или используя phpinfo () Вы можете найти Вас параметрами настройки сессии. _session.savepath говорит Вам, где они спасены.
Проверьте разрешение папки и ее родителей. Это shouldn' t быть общественным (/tmp) или быть доступным другими веб-сайтами по Вашему общему серверу.
Принятие Вас все еще хочет использовать php сессию, Вы можете установить php использовать другую папку, изменившись _session.savepath или сохранять данные в базе данных, изменившись _session.savehandler.
Вы могли бы быть в состоянии установить _session.savepath в своем php.ini (некоторые поставщики позволяют его), или для апача + mod_php, в .htaccess файле в Вашем корневом каталоге места:
< code> сессия save_path php_value "/home/example.com/html/session" . Вы можете также установить его во время, которым управляют, с _session_save_path () _.Проверьте Криса Shiflett' s обучающая программа или Zend_Session_SaveHandler_DbTable, чтобы установить и альтернативный укладчик сессии.