Плохая обработка переменных сессий PHP? - PullRequest
4 голосов
/ 04 мая 2009

В настоящее время я использую следующий код в моей cms, чтобы проверить, вошел ли посетитель как администратор, чтобы он мог редактировать текущую страницу:

if($_SESSION['admin']=="1")
{
        echo "<a href="foobar/?update">edit</a>";
}

Но я боюсь, что код небезопасен. Разве переменные $ _session не могут быть легко изменены пользователем?

Какая практика будет безопаснее?

Ответы [ 6 ]

4 голосов
/ 04 мая 2009

Нет, это хороший способ сделать это. Пользователь не может изменить глобальную переменную $ _SESSION, если у него нет доступа к вашему серверу. Не забудьте держаться подальше от клиентских куки .

Чтобы сделать его еще более безопасным, хорошим способом является сохранение IP-адреса и проверка того, что он остается неизменным при каждом запросе.

3 голосов
/ 04 мая 2009

Код в порядке, вы просто показываете ссылку. Просто убедитесь, что ваш скрипт UPDATE также защищен.

1 голос
/ 05 мая 2009

Я нашел эту презентацию о безопасности сеанса

Объясняет, как избежать:

  • Фиксация сессии.
  • Захват сессии.

Также на слайде с дополнительной информацией есть несколько ссылок на товары

1 голос
/ 04 мая 2009

$_SESSION переменные не могут быть установлены пользователем. Поэтому код отлично работает, хотя вы, как правило, запрашиваете у своего пользовательского бэкэнда (обычно это просто пользователи таблиц, иногда LDAP) права текущего пользователя.

0 голосов
/ 11 апреля 2018

Этот код больше не является безопасным:

if mypage.php contains this code:

session_start();
$_SESSION['admin']==1;
echo "<a href='http://the.link-to-your-page.php' target='_blank'>link</a>";

Если щелкнуть ссылку, администратор сеанса как 1 будет перенесен на вашу страницу и появится кнопка редактирования.

Самый безопасный способ - установить токен (это очень простой шаг) сразу после авторизации. например, $token = sh512($var.....); $_SESSION['token']=$token;

поверх каждой страницы поместите что-то вроде этого:

if(!isset($_SESSION['token'])){ die('Access Denied');}
if(!isset($_SESSION['username'])){ die('Access Granted');}

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

0 голосов
/ 04 мая 2009

Переменные сеанса должны быть достаточно безопасными после того, как ваше кодирование безопасно.

Также используйте вместо этого следующее. Останавливает ошибки с == Вероятно, следует также использовать true, поскольку это намного быстрее, чем сравнение строк.

if( "1" === $_SESSION['admin'] )
...