Вход Регистрация
Файл: inc/CSRF-secure.php
Строк: 58
<?php

// Имя поля с id сессии
define('CSRF_INPUT_NAME''SID');

/* Токен (GET) */

if (filter_has_var(INPUT_GETCSRF_INPUT_NAME) && $_GET[CSRF_INPUT_NAME] != session_id()) {

    
// Генерируем новый id сессии
    
session_regenerate_id();
    
// Удаляем токен
    
unset($_GET[CSRF_INPUT_NAME]);

}

// Для ссылок (GET)
define('CSRF_GET_URL'CSRF_INPUT_NAME '=' session_id());

/* Проверка сессии */

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

    if (!
filter_has_var(INPUT_POSTCSRF_INPUT_NAME) || $_POST[CSRF_INPUT_NAME] != session_id()) {

        
// Генерируем новый id сессии
        
session_regenerate_id();
        
// Удаляем зловредные данные
        
unset($_POST);

    }

}

/* Работаем с буфером вывода */

function obCallback($buffer) {

    
$doc = new DOMDocument;

    
$doc->loadHTML($buffer);

    
/* Обновление кэша стилей и скриптов */

    
$links $doc->getElementsByTagName('link'); // ищем стили

    
foreach ($links as $element) {

        if (!
$element->hasAttribute('href'))
            continue;

        
$href $element->getAttribute('href');

        
$file $_SERVER['DOCUMENT_ROOT'] . $href;

        if (!
file_exists($file))
            continue;

        
$mtime filemtime($file);

        
// Приписываем время последней модификации
        
$element->setAttribute('href'$href '?' date('YmdHis'$mtime));

    }

    
$scripts $doc->getElementsByTagName('script'); // ищем скрипты

    
foreach ($scripts as $element) {

        if (!
$element->hasAttribute('src'))
            continue;

        
$src $element->getAttribute('src');

        
$file $_SERVER['DOCUMENT_ROOT'] . $src;

        if (!
file_exists($file))
            continue;

        
$mtime filemtime($file);

        
// Приписываем время последней модификации
        
$element->setAttribute('src'$src '?' date('YmdHis'$mtime));

    }

    
/* Защита от CSRF */

    
$forms $doc->getElementsByTagName('form'); // ищем формы

    
foreach ($forms as $element) {

        
// Узнаем метод передачи данных с формы
        
$method $element->getAttribute('method');
        
$method strtoupper($method);

        
// Работаем только с POST-данными
        
if ($method != 'POST')
            continue;

        
/* Создаем поле */

        
$newElement $doc->createElement('input');

        
$node $element->appendChild($newElement);

        
$node->setAttribute('type''hidden');
        
$node->setAttribute('name'CSRF_INPUT_NAME);
        
$node->setAttribute('value'session_id());

    }

    return 
$doc->saveHTML();

}

// Буферизация вывода
ob_start('obCallback');
Онлайн: 0
Реклама