PHP ::: безопасный SESSION_ID ::: нет CSRF? - PullRequest
0 голосов
/ 27 января 2012

Используя это:

function nonce($str,$expires){
return sha1(date('Y-m-d H:i',ceil(time()/$expires)*$expires).$_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].$salt.$str);
}

Допустим, я инициализирую свой session_id после входа в систему, также генерируя отпечаток, как это:

session_regenerate_id();
$_SESSION['thumbprint']=nonce(session_id().'thumbprint',86400);

И назовите это:

function valid_session(){
    return ($_SESSION['thumbprint']==nonce(session_id().'thumbprint',86400));
}

function logged_in(){
    return (valid_session()&&isset($_SESSION['user']['id'])&&isset($_SESSION['user']['typeid'])&&isset($_SESSION['user']['email']));
}

Вверху каждой страницы:

if(logged_in==false){//logout & redirect back to index}

Имея отпечаток большого пальца под таким контролем, мне даже нужно делать токены для каждого вызова функции, или этого влияния достаточно для защиты от CSRF?

::: 86400 - это 24 часа, которые я понимаю, это долго. Это слишком долго, чтобы реально использовать уникальный идентификатор для?
::: Когда я говорю «безопасные функции», я имею в виду, что функции могут быть защищены с использованием того же одноразового номера или токена.

Ответы [ 2 ]

2 голосов
/ 27 января 2012

Просто используйте одноразовые токены для отправки формы.uniqid() достаточно для этого.Сохраните токен в сеансе при его создании и включите его в форму.Затем в сценарии обработки POST формы убедитесь, что опубликованное значение является значением в сеансе.

Все, что вы делаете, генерируя отпечатки, используя такие вещи, как $_SERVER['REMOTE_ADDR'] и т. Д., В корне разрушает ваше приложениедля людей, которые используют шлюзы (AOL - канонический пример).

0 голосов
/ 27 января 2012

Вы можете попробовать класс защиты CSRF, написанный Саймоном Уиллисоном http://simonwillison.net/static/2008/csrf_protect.php.txt

Не забудьте проверить его блог: http://simonwillison.net:8003/! Женился!

Также вы можете попробовать: www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) и раздел «Как проверить уязвимость CSRF».

Веселись

...