#php #facebook #facebook-graph-api #csrf
#php #Facebook #facebook-graph-api #csrf
Вопрос:
В настоящее время я создаю веб-сайт с использованием аутентификации Facebook. Я работаю локально и продолжаю получать ошибки CSRF. Я пытаюсь понять их механизм защиты CSRF:
$code = $_REQUEST["code"];
$_SESSION['state']= $_REQUEST['state'];//GETS SITE WORKING BUT UNSAFE!!!///
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "http://www.facebook.com/dialog/oauth?client_id="
. $app_id . "amp;redirect_uri=" . urlencode($my_url) . "amp;state="
. $_SESSION['state'];
echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
Что происходит, так это то, что кажется, что мой $ _REQUEST[‘state’] установлен, а мой $ _SESSION[‘state’] — нет. Следовательно, чтобы заставить его работать, у меня есть строка, которая устанавливает оба значения равными. Моя переменная $ code никогда не кажется пустой, следовательно, новая переменная $ _SESSION[‘state’ никогда не устанавливается.
Во-первых, какова роль $_REQUEST[‘code’] и откуда берется / устанавливается эта переменная?
Есть идеи, как исправить это с помощью моей небезопасной строки кода?
p.s Я знаю, что должен использовать FB sdk, но изучаю веб-дизайн / безопасность, так что это хорошее упражнение, чтобы узнать, как это работает!!
Большое спасибо, Сэм
Для всех, кому интересно, я разобрался, как это работает, но до сих пор не решил свою проблему…В любом случае
Система защиты CSFR работает путем сохранения идентификатора состояния на стороне сервера в $_SESSION[‘state’], тот же идентификатор сохраняется также внутри $_REQUEST[‘state’], то есть на стороне клиента. Следовательно, это означает, что если произойдет атака CSRF, значение состояния атаки CSRF (на стороне клиента) не будет соответствовать значению состояния $_SESSION[‘state’], следовательно, код не выполняется, и атака предотвращена.
Пожалуйста, поправьте меня, если я ошибаюсь!
Ответ №1:
Ваше описание по существу правильное, значение состояния, которое находится в URL при перенаправлении обратно на ваш сайт ($ _REQUEST[‘state’]), должно соответствовать значению состояния, которое было присвоено при первом перенаправлении Facebook (хранится в $_SESSION[‘state’]). Если они не совпадают, произошла какая-то «манипуляция», и вам не следует продолжать.
Но вы также сказали, что $ _SESSION[‘state’] не был установлен, потому что $ code никогда не бывает пустым. Если это так, то как происходит перенаправление на Facebook?
Кажется более вероятным, что значения сеанса вообще не сохраняются. Это единственное место на вашем сайте, где вы используете сеансы?
Обратите внимание, что вам не обязательно использовать сеанс, если это проблематично. Если у вас настроена база данных, вы можете использовать это так же легко. Или вы можете полностью отказаться от локального хранилища, если вы придумаете способ быть достаточно уверенным, что полученное вами значение состояния действительно было создано вашим кодом как часть предполагаемой последовательности. Например, вы могли бы установить значение состояния в текущую временную метку, объединенную с md5 временной метки плюс секретной строки. Когда значение состояния возвращается, сначала проверьте часть метки времени, чтобы убедиться, что она была создана в течение последней минуты или двух, а затем проверьте md5, чтобы убедиться, что она не была создана кем-то другим. Таким образом, у вас есть простой токен, который нельзя угадать заранее и который нельзя использовать повторно, два основных требования для предотвращения CSRF.
Комментарии:
1. Да, это верно, я понял, что мои $ _SESSIONs не работают должным образом, и пошел интегрировать мои другие пользовательские страницы. Кажется, мои файлы cookie не работали должным образом, но я исправил это, и проблема все еще сохраняется. Я просто объясняю это неудобством запуска на локальном сервере!
2. Если сеансы работают иначе, но доставляют вам проблемы здесь, возможно, не стоит тратить слишком много времени на их переделку для этой единственной цели. Я немного отредактировал свой ответ с некоторыми другими вариантами, которые вы могли бы рассмотреть.