<?
// Если нужно
class antiCSRF
{
// Получаем рандомную строку, тут в md5 хешируется метка времени //
public function RandStr(){
}
// Получаем реальный IP адрес //
public function IP ()
{
global $_SERVER;
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP'])) { $ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
}
// Гененрируем токен, Записываем текущий IP
/*
Как юзать:
Для POST <input type="hidden" name="token" value=<?=$csrf->gen_token()?>>
Для GET(пример) index.php?id=1&token=$csrf->gen_token()
В примерах, без синтаксиса, не знаю как будете юзать
*/
public function gen_token (){
// Записываем токен в сессию
$_SESSION['token'] = $this->RandStr();
// Пишем текущий IP
$_SESSION['tokenIP'] = $this->IP();
return $_SESSION['token'];
}
public function CheckToken (){
// Тут: если токен не найден в POST ищет в GET, если нету там - возвращает null
// Как юзать: в верху страницы, куда идет запрос $csrf->CheckToken ();
$data['token'] = (empty($_POST['token']) ?
$_GET['token'] : null); // Проверяем передан ли токен, и совпадает ли он с тоеном записанным в сессию
if(empty($data['token']) or
$data['token'] != $_SESSION['token']) { exit('Попытка подмены токена'); }
// Даже если токен сперли, проверяем совпадаеи ли IP запроса с текущим
if($_SESSION['tokenIP'] != IP()){
exit('IP при отправке формы и IP текущий не совпали'); }
}
}
// Создаем экземпляр класса
$csrf = new antiCSRF();