Согласно документу 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 -> <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?