2016-07-07 8 views
1

настоящее время у меня эти 2 функции, один для создания маркера и один для проверки достоверности:Безопасно ли генерировать токен CSRF на той же странице, что и защищенная форма?

function getToken() { 
    if(isset($_SESSION['token'])) { 
     return $_SESSION['token']; 
    } else { 
     $token = //random key generator goes here; 
     $_SESSION['token'] = $token; 
     return $token; 
    } 
} 

function validateToken($token) { 
    if ($token == getToken()){ 
     return true; 
    } else { 
     return false; 
    } 
} 

И моя регистрационная форма включает в себя этот скрытый вход:

<input type="hidden" name="token" value="<?php echo getToken(); ?>"> 

Является ли это безопасно? Я спрашиваю, что, если сессия законного пользователя истекает, а затем они получают CSRF'd в эту регистрационную форму, а токен генерируется самим вредоносным сайтом/iframe, потому что один из них еще не существует в сеансе, поэтому аутентификация просто прекрасна?

Предполагается, что пользователь остается в системе из-за куки.

Я понимаю, что здесь неправильно? Не удается ли удаленное связывание, например iframe, генерировать сеансы в вашем бэкэнд?

+0

И ... сеансы менее безопасны, чем это, потому что ...? – Machavity

+0

@Machavity Извините, не могу понять, что вы пытаетесь сказать. Все, о чем я прошу, заключается в том, что мой подход будет безопасным, потому что я предполагаю, что создаю токен на той же странице, что и форма, которая побеждает цель, не так ли? –

+0

"Создание маркера на той же странице, что и форма" --- что это значит? Невозможно догадаться токен CSRF. Это единственное требование для него. – zerkms

ответ

0

Нет. Насколько я могу судить, вы делаете это правильно, поскольку токен должен быть сгенерирован, как только пользователь приходит на страницу формы. Затем вы создадите его, чтобы точно знать, что кто-то (настоящий пользователь) действительно посетил вашу форму, а затем вы устанавливаете для них токен.

Когда они совершают какие-либо действия с формой, вы проверяете токен, чтобы узнать, действителен ли токен для этого пользователя. Итак, я думаю, вы делаете все правильно.

Одна вещь, сгенерируйте токен и храните его в сеансе, когда пользователь запрашивает/приходит на страницу формы. Было бы лучше, если вы создадите его каждый раз, когда приходит запрос. Затем после каждой успешной отправки формы очищайте отмеченный токен от сеанса.

+0

«Было бы лучше, если бы вы генерировали его каждый раз, когда приходит запрос». --- Конечно, это было бы болезненно, но с точки зрения безопасности неясно, почему это должно быть «лучше». – zerkms

+0

это поможет предотвратить захват сеанса, поскольку сеанс будет хранить токен за меньшее количество времени. –

+0

Если вы украли сеанс - как это относится к CSRF? У вас есть идентификатор сеанса - вы переходите на страницу и выполняете запрос с помощью только что сгенерированного токена. – zerkms