Мой веб-сайт не защищен от файлов 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.
Я был бы рад, если вы знаете, что происходит, или если вы знаете какой-нибудь способ расследования.