Проблемы с использованием ajax для доступа к безопасным и httponly куки из javascript - PullRequest
0 голосов
/ 16 января 2019

Мой веб-сайт не защищен от файлов cookie, и некоторые файлы cookie были настроены с помощью javascript. По соображениям безопасности мне пришлось добавить безопасные флаги и флаги httponly, чтобы адаптировать мой javascript. Единственный способ, который я нашел, - использовать ajax.

Я написал php-скрипт, вызываемый javascript через ajax для установки файлов cookie. Как я знаю, javascript является однозадачным, а асинхронные задачи планируются после синхронных. Поэтому мне пришлось изменить свой код, чтобы дождаться возврата ajax перед вызовом следующих страниц. Например (см. Javascript ниже), когда действие равно «RELOAD», если на странице обнаружен тег формы, он отправляется, если нет, выполняется простая перезагрузка.

JavaScript:

function setMultiCookie(prm, action) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
            setMultiCookieRet(action);
        }
    };
    xhr.open("POST", "setMultiCookies.php", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send("prm="+encodeURIComponent(prm));
}
function setMultiCookieRet(action) {
    switch(action) {
        case 'RELOAD':
            var form = document.getElementsByTagName('form');
            if (form.length > 0)
                form[0].submit();
            else
                location.reload(true);
        break;
        case 'NONE':
        break;
        default:
            window.open(action,'_self');
    }
}

php скрипт setMultiCookies.php:

<?php
header("Content-Type: text/plain");
if ($_POST["prm"] == '')
    exit;
$prm = explode('µ', $_POST["prm"]);
foreach ($prm as $parms) {
    list($name, $value) = explode('§', $parms, 2);
    if ($value == "-unSetCookie-")
        setcookie($name, '', 1, "/", "", TRUE, TRUE);
    else
        setcookie($name, $value, 0, "/", "", TRUE, TRUE);
}
?>

Пример вызова для установки cookie var1 на val1 и var2 на val2, для сброса val3 и перезагрузки страницы после этого:

<span onClick="setMultiCookie('var1§val1µvar2§val2µval3§-unSetCookie-', 'RELOAD');" class="button">

Это работает большую часть времени, но в некоторых случаях, особенно с тегами формы, это не так. Я не знаю, что происходит. Я уверен, что PHP скрипт работает. Я сделал несколько отображений трассировки и проверил, что php setcookie return имеет значение true. Но куки не установлены. Я полагаю, что-то происходит до того, как набор сделан. У меня была эта проблема ранее, когда я загружал страницу в синхронной части JavaScript.

Я был бы рад, если вы знаете, что происходит, или если вы знаете какой-нибудь способ расследования.

1 Ответ

0 голосов
/ 17 января 2019

OK. Тем временем я решил свою проблему. Мой пример не был хорошим, потому что он работает с тегом span. Я не знаю почему, но это не работает с тегами кнопок. В любом случае, я заменил теги кнопок на теги span, и все в порядке.

Спасибо SLaks и Kaddath за взгляд на мой вопрос. Мой веб-сайт является интранетом, и для доступа к нему требуется AD-логин (также написан на PHP).

...