PHP формируют маркерное использование и обработку

Я - новичок, работающий над сценарием входа в систему в PHP. Это - маркерный оператор формы, который я имею до сих пор:

$_SESSION["form_token"] = md5(rand(time (), true)) ;

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

Мое ограниченное понимание - то, что маркерная цель состоит в том, чтобы идентифицировать уникального пользователя в уникальном моменте времени и замаскировать информацию о маркере формы.

Затем все становится нечетким. Вот мои 3 нерешенных вопроса:

  1. Когда наилучшее время должно "проверить" маркер формы на цели безопасности?

  2. Как я проверяю его?

  3. Когда, если когда-нибудь, я "уничтожаю" маркер формы? (IOW, маркер формы оставался бы активен, пока пользователь не выходит из системы?

17
задан lorem monkey 15 August 2012 в 16:27
поделиться

3 ответа

Нет необходимости делать то, что вы пытаетесь сделать. Когда вы запускаете сессию в PHP с помощью функции session_start(), для вас уже генерируется уникальный SESSIONID. Вы должны а не ставить это на форму. По умолчанию он обрабатывается с помощью cookie-файлов. Также нет необходимости проверять SESSIONID, который снова обрабатывается за вас.

Вы отвечаете за аутентификацию пользователя и сохранение его аутентифицированного идентификатора (например, $_SESSION['user_id'] = $userId в СЕССИИ. Если пользователь выходит из системы, вы уничтожаете его сессию с помощью session_destroy.

Вы должны убедиться, что session_start() является одной из первых вещей для всех страниц вашего сайта.

Вот основной пример:

<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking

function login($username, $password)
{
    $user = new User();
    if ($user->login($username, $password)) {
        $_SESSION['user_id'] = $user->getId();
        return true;
    }
    return false;
}

function logout()
{
    session_destroy();
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']);
}

function generateFormHash($salt)
{
    $hash = md5(mt_rand(1,1000000) . $salt);
    $_SESSION['csrf_hash'] = $hash
    return $hash;
}

function isValidFormHash($hash)
{
    return $_SESSION['csrf_hash'] === $hash;
}

Edit: Я неправильно понял исходный вопрос. Я добавил соответствующие методы для генерации и проверки хэшей форм;

Пожалуйста, ознакомьтесь со следующими ресурсами:

13
ответ дан 30 November 2019 в 12:19
поделиться

это сделано для предотвращения атак CSRF

http://en.wikipedia.org/wiki/Cross-site_request_forgery

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

проверка HTTP_REFERER часто бывает достаточно хорошей, но не полным решением (например, https не отправляет строку реферера).

если вы действительно хотите защитить все формы токеном, вы можете создать некоторые удобные функции, такие как emitToken () и checkToken (), которые заставят его работать на всем сайте.

несколько примеров:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php

19
ответ дан 30 November 2019 в 12:19
поделиться

Ты можешь проверить реализацию zend framework.

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

Его Zend_Form_Element_Hash https://docs.zendframework.com/zend-form/element/csrf/

0
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: