2013-04-28 2 views
0

Я хочу использовать маркер безопасности как скрытое поле ввода в моей форме комментариев для целей безопасности. Я знаю, что если есть только одна форма на моей странице, я могу сделать некоторые вещи, как этотКак обрабатывать несколько токенов безопасности в SESSION и html-формах

$token = sha1(uniqid(rand(), TRUE)); 
$_SESSION['token'] = $token; 

я могу использовать этот знак в моей форме

<form action="comment.php" method="post"> 
<input type="hidden" name="token" value="<?php echo $token; ?>" /> 
<input type="text" name="comment_body" value="" /> 
</form> 

и на приемном конце, я могу сделать что

if ($_POST['token'] == $_SESSION['token']){ 

    /* Valid Token */ 

} 

Но у меня есть около 10 форм на одной странице, так как я могу генерировать несколько маркеров и как обрабатывать их на приемном конце. И что, если пользователь открывает несколько страниц?

+0

Какова цель этого токена? – Gumbo

+0

@ Gumbo для предотвращения атаки CSRF. –

ответ

0

Вы можете использовать сочетание микропоры и mt_rand, которые я в основном использовать при работе с таким сценарием

$tokenLen = 64; 

$randomData = mt_rand() . mt_rand() . mt_rand() . mt_rand() . microtime(true) . uniqid(mt_rand(), true); 

$token = substr(hash('sha512', $randomData), 0, $tokenLen); 
+0

Думаю, ты не прочитал мой вопрос полностью. Я не хочу знать, как создать безопасный токен, я просто хочу знать, как я могу обрабатывать несколько токенов. –

+0

Вы можете просто сохранить их в отдельных скрытых полях для каждой формы и сохранить их с именем, добавленным с именем формы, скажем, hidden_form1, hiiden_form2. Затем вы можете легко получить их на основе какой формы вы отправляете. –

+0

, но проблема в том, как я буду обрабатывать их на принимающей стороне. Я имею в виду, что один токен может быть сохранен в '$ _SESSION ['токен']', но как я буду хранить несколько токенов и как я буду сравнивать их? –

0

Для предотвращения CSRF, a single session-dependent token does already suffice.

Однако, если вы хотите использовать другой маркер для каждой формы можно связать маркер в виде характеристик, например, URL действия и метода, например:

// issue token 
$form = array('method'=>'POST', 'uri'=>'/comment.php'); 
if (!isset($_SESSION['CSRF_TOKENS']["{$form['method']}:{$form['uri']}"])) { 
    $_SESSION['CSRF_TOKENS']["{$form['method']}:{$form['uri']}"] = generate_csrf_token(); 
} 
echo '<form method="'.$form['method'].'" action="'.$form['uri'].'">'; 
echo '<input type="hidden" name="CSRF_TOKEN" value="'.$_SESSION['CSRF_TOKENS']["{$form['method']}:{$form['uri']}"].'">'; 


// check token 
$form = array('method'=>$_SERVER['REQUEST_METHOD'], 'uri'=>$_SERVER['REQUEST_URI']); 
if (isset(${'_'.$form['method']}['CSRF_TOKEN'], $_SESSION['CSRF_TOKENS']["{$form['method']}:{$form['uri']}"]) && ${'_'.$form['method']}['CSRF_TOKEN'] === $_SESSION['CSRF_TOKENS']["{$form['method']}:{$form['uri']}"]) { 
    // token valid 
} else { 
    // token missing or invalid 
} 

Другим возможным решением является для использования signed CSRF tokens. Вы можете добавить данный пример как дополнительную информацию помимо идентификатора пользователя, так как вы хотите еще больше ограничить срок действия токена.

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