LINUXTALKS.CO

Защита от неавторизованного изменения данных в cookie на PHP

 , ,

L


0

1

Чую сделал какой то быдлокод, потому что не уверен в том что делаю и полагаю что есть способы лучше.

На странице есть скрытое поле «random-page-id», в нём размещается случайно сгенерированное число из «печенек». Если передаваемое формой число не совпадает с числом в печеньках, то настройки не обновляются. Если совпадает - то обновляются. Зачем это нужно? Что бы нельзя было обнулить или подменить настройки, подбросив ссылку.

<?php
    // Считывание настроек
    if (isset($_COOKIE["random-page-id"])) {
        $RandomPageId = $_COOKIE["random-page-id"] ; // Если случайный идентификатор есть, он считывается. 
        // Нужно это для безопасности. Что бы переход по случайной ссылке не переписал настройки.
    } else {
        $RandomPageId = random_int(0, 2000000000);
        setcookie("random-page-id", $RandomPageId, time() + 615168000); // Случайный идентификатор сгенерирован и записан в печеньки
    }
    if (isset($_COOKIE["rules"])) {
        $rules=$_COOKIE["rules"] ;
    }
    if (isset($_COOKIE["cookie-script"])) {
        $CookieScript=$_COOKIE["cookie-script"] ;
    }
    // Сохранение настроек
    if (isset($_POST["random-page-id"])) {
        // Если была отправлена форма
        if ($_POST["random-page-id"] == $_COOKIE["random-page-id"]) {
            // Параметр отправили верный
            // Запись обновлённых настроек
            $rules = $_POST["rules"];
            setcookie ("rules", $rules, time() + 615168000 ); // Запись выбора набора правил. Серверные или анонимные.
            $CookieScript = $_POST["cookie-script"];
            setcookie ("cookie-script", rtrim(htmlspecialchars($CookieScript)), time() + 615168000 ); // Запись анонимных правил.
        } else {
            // Попытка взлома
            $ErrorNah = True;
        }
        $RandomPageId = $_COOKIE["random-page-id"] ; // Если случайный идентификатор есть, он считывается. 
        // Нужно это для безопасности. Что бы переход по случайной ссылке не переписал настройки.
    } else {
        // Страница открыта без запроса.
    }
?>

Форма:

<form action="/settings.php" accept-charset="UTF-8" method="post">
        <p></p>Какие правила применять?</p>
        <p>
            <?php echo $rules ; ?> <br>
            <input type="radio" name="rules" value="anon"   <?php if ($rules=="anon")   {echo "checked";} ; ?> >Анонимные<Br>
            <input type="radio" name="rules" value="server" <?php if ($rules=="server") {echo "checked";} ; ?> >Серверные<Br>
        </p>
        <HR>
        <input type="text" name="random-page-id" value=" <?php echo $RandomPageId ; ?>" > <?php echo $RandomPageId ; ?>
        <HR> <?php if ($ErrorNah) {echo "<p> <H2> Обнаружена попытка взлома </H2> <HR> </p>";} ; ?>
        <p><textarea name="cookie-script" class="TextRules"><?php echo rtrim($CookieScript);?></textarea></p>
        <p> Сохранение сценария <input type="submit"  /></p>
        <HR>
    </form>

Как это сделать лучше?

★★★★★★

Обычная кука – это тупо отправляемый с клиентской стороны заголовок. Его ничего не мешает подделать.

Лучше – использовать сессионную куку, т.е. которая от session_start. Между клиентом и сервером летают не открытые данные, а только хеш-имя сессионной куки. А во избежание чистки сессионных данных в файловой системе, хранить все эти данные лучше в базе (можно запилить соответствующий хендлер).

deep-purple    
★★★★★★★★★★
Android / Firefox
Ответ на: комментарий от deep-purple

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

rezedent12    
★★★★★★
Windows / Firefox
Ответ на: комментарий от rezedent12

Я понял даже глубже. Настройки храни на сервере, кука только сессионная, иначе похачат.

Ну и да, совсем тебя добью: гугли CSRF token. И, конечно, это должно храниться в сессии на сервере ))

deep-purple    
★★★★★★★★★★
Android / Firefox
Ответ на: комментарий от deep-purple

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

rezedent12    
★★★★★★
Windows / Firefox
Ответ на: комментарий от rezedent12

Эта защита делается с помощью цсрф токена, а не кук. Кроме того, все, что изменяемо, должно модифицироваться только (! не будем о прочих конкретных) через пост метод.

deep-purple    
★★★★★★★★★★
Android / Firefox