Перезапись файла cookie HttpOnly с помощью JavaScript?

Согласно документу MDN:

Чтобы предотвратить атаки межсайтового скриптинга (XSS), файлы cookie HttpOnly недоступны для JavaScript Document.cookie API; они только отправляются на сервер.

Я нашел сценарий замены файла cookie HttpOnly на JavaScript, вот PoC в ASP.NET:

<%@Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) 
{
    if (Request["m"] == "check") 
    {
        Response.Write("Cookie=" + Request.Cookies["C"].Value);
        Response.End();
    }
    else 
    {
        Response.AppendCookie(new HttpCookie("C") 
        {
            Value = "ByServer",
            HttpOnly = true
        });
    }
}
</script>
<html>
<body>
    <div>
        document.cookie -&gt; <span id=t></span>
    </div>
    <script>
        document.getElementById("t").innerHTML = document.cookie;
        document.cookie="C=ByClient";
    </script>
    <a href="?m=check">Check Cookie</a>
</body>
</html>

В тесте Chrome чтение document.cookie ничего не дает, чтобы доказать, что файл cookie HttpOnly действительно не читается для JavaScript. Но при установке document.cookie = "C=ByClient" одновременно существуют два файла cookie с разными путями.

введите здесь описание изображения

Затем проверьте файл cookie со стороны сервера, Request.Cookies["C"] возвращает "ByClient", заданный JavaScript, но не "ByServer", назначенный сервером. Файл cookie HttpOnly перезаписывается клиентом.

Результат будет другим, если мы зададим точный HttpCookie.Path:

    Response.AppendCookie(new HttpCookie("C") 
    {
        Value = "ByServer",
        HttpOnly = true,
        Path = "/asp/httponlycookie"
    });

Теперь document.cookie="ByClient" не удалось добавить или изменить файл cookie, файл cookie HttpOnly защищен.

введите описание изображения здесь

Могу ли я сделать вывод: свойство HttpOnly гарантирует только то, что файл cookie не может быть прочитан для JavaScript, файл cookie HttpOnly по-прежнему можно заменить или перезаписать с помощью JavaScript?


person Darkthread    schedule 04.10.2018    source источник
comment
Файл cookie HttpOnly изменяется клиентом. Нет, это не так. Похоже, вы добавили дополнительный файл cookie с тем же именем.   -  person Cerbrus    schedule 04.10.2018
comment
@Cerbrus спасибо за ссылку, это прояснило мое замешательство.   -  person Darkthread    schedule 05.10.2018
comment
Для меня это означает, что вы можете скрыть файл cookie HttpOnly в JavaScript, установив для него другое значение на другом пути, что может позволить вам изменить значение файла cookie HttpOnly в запросах, сделанных на сервер. Итак, я не думаю, что этот вопрос является дубликатом.   -  person Warlike Chimpanzee    schedule 15.06.2019
comment
Префикс __Host- был создан для предотвращения таких проблем с безопасностью, потому что файл cookie с префиксом __Host- может быть установлен только с 1) безопасным флагом, 2) путем =/ и 3) неустановленным доменом, что означает, что другой файл cookie с префиксом одно и то же имя не может быть установлено с другой подписью. Таким образом, это эффективно препятствует тому, чтобы JavaScript устанавливал файл cookie с тем же именем, что и файл cookie HttpOnly. И это предотвращает атаки «человек посередине», поскольку соединение должно быть безопасным.   -  person PHP Guru    schedule 30.09.2020