문제
저는 PHP에서 로그인 스크립트를 작업하는 초보자입니다. 이것은 내가 지금까지 가지고있는 양식 토큰 진술입니다.
$_SESSION["form_token"] = md5(rand(time (), true)) ;
명세서는 사용자가 로그인을 원한다는 것을 나타내는 직후에 발행됩니다.
나의 제한된 이해는 토큰 목적은 고유 한 시점에서 고유 한 사용자를 식별하고 양식 토큰 정보를 위장하는 것입니다.
그러면 모든 것이 퍼지됩니다. 다음은 3 가지 열린 질문입니다.
보안 목적으로 양식 토큰을 "확인"하는 가장 좋은시기는 언제입니까?
어떻게 확인합니까?
언제든지, 나는 양식 토큰을 "파괴"합니까? (IOW, 사용자가 로그 아웃 할 때까지 양식 토큰이 "활성화"상태를 유지합니까?
해결책
당신이 시도하는 일을 할 필요가 없습니다. session_start ()로 PHP에서 세션을 시작하면 이미 고유 한 SessionID가 생성되었습니다. 당신은해야합니다 ~ 아니다 이것을 양식에 넣으십시오. 기본적으로 쿠키를 통해 처리됩니다. SessionID를 확인할 필요가 없습니다. 다시 처리됩니다.
귀하는 사용자를 인증하고 인증 된 ID를 저장할 책임이 있습니다 (예 : 세션에서 $ _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;
}
편집 : 원래 질문을 오해했습니다. 양식 해시를 생성하고 검증하기 위해 위의 관련 방법을 추가했습니다.
다음 리소스를 참조하십시오.
다른 팁
이것은 CSRF 공격을 방지하기위한 것입니다
http://en.wikipedia.org/wiki/cross-site_request_forgery
악의적 인 사이트는 이론적으로 응용 프로그램에 게시하는 양식을 표시 할 수 있습니다. 양식에는 데이터 유출 또는 원치 않는 조치를 유발하는 지침이 포함될 수 있습니다. 사용자는 사용자가 이미 로그인하여 앱이 수락하는 양식을 제출하는 데 속일 수 있습니다. 양식 토큰은 다른 사이트가 아닌 사이트에서 양식이 작성되었는지 확인합니다.
http_referer를 확인하는 것은 종종 충분히 좋지만 완전한 솔루션은 아닙니다 (예 : https는 참조 문자열을 보내지 않습니다).
토큰으로 모든 양식을 보장하려면 Emittoken () 및 CheckToken ()과 같은 편의 기능을 만들어 사이트 전체에서 작동하게 할 수 있습니다.
몇 가지 예 :
Zend Framework 구현을 확인할 수 있습니다.
특정 구현과는 별도로, 문서는 이러한 종류의 요소의 추론과 사용을 양식에서 설명합니다.
그것의 zend_form_element_hashhttps://docs.zendframework.com/zend-form/element/csrf/