Удаление куки: как получить его путь (и домен)? - PullRequest
0 голосов
/ 07 ноября 2018

Различные статьи и SO ответ s предполагают, что удаление cookie через JS должно быть сделано так:

document.cookie = cookieName + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';

или если нам нужно указать домен / путь, например:

document.cookie = cookieName + "=" +
    (path   ? `;path=${path}` : "") +
    (domain ? `;domain=${domain}` : "") +
    ";expires=Thu, 01 Jan 1970 00:00:01 GMT";

Теперь в месте без полномочий root (например, https://classic.tiddlywiki.com/upgrade/) происходит более сложная ситуация. Если вы откроете его и введете document.cookie в консоли, вы получите одно значение (без domain , path или expires указано):

TiddlyWikiClassicOptions=chkRegExpSearch:%22false%22 chkCaseSensitiveSearch:%22false%22 chkIncrementalSearch:%22true%22 chkAnimate:%22true%22 chkSaveBackups:%22true%22 chkAutoSave:%22false%22 chkGenerateAnRssFeed:%22false%22 chkSaveEmptyTemplate:%22false%22 chkOpenInNewWindow:%22true%22 chkToggleLinks:%22false%22 chkHttpReadOnly:%22true%22 chkForceMinorUpdate:%22false%22 chkConfirmDelete:%22true%22 chkInsertTabs:%22false%22 chkUsePreForStorage:%22true%22 chkDisplayInstrumentation:%22false%22 chkRemoveExtraMarkers:%22false%22 txtBackupFolder:%22%22 txtEditorFocus:%22text%22 txtMainTab:%22Timeline%22 txtMoreTab:%22moreTabAll%22 txtMaxEditRows:%2230%22 txtFileSystemCharSet:%22UTF-8%22 txtTheme:%22%22 txtUserName:%22YourName%22

и запись в консоли

document.cookie = 'TiddlyWikiClassicOptions=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';

не удаляет cookie (или не изменяет его значение) (document.cookie дает то же самое). Более того, написание

document.cookie = 'TiddlyWikiClassicOptions=lalala';

не изменяет существующий файл cookie, а добавляет другой файл с таким же именем:

TiddlyWikiClassicOptions=lalala; TiddlyWikiClassicOptions=chkRegExpSearch:%22false%22 chkCaseSensitiveSearch:%22false%22 chkIncrementalSearch:%22true%22 chkAnimate:%22true%22 chkSaveBackups:%22true%22 chkAutoSave:%22false%22 chkGenerateAnRssFeed:%22false%22 chkSaveEmptyTemplate:%22false%22 chkOpenInNewWindow:%22true%22 chkToggleLinks:%22false%22 chkHttpReadOnly:%22true%22 chkForceMinorUpdate:%22false%22 chkConfirmDelete:%22true%22 chkInsertTabs:%22false%22 chkUsePreForStorage:%22true%22 chkDisplayInstrumentation:%22false%22 chkRemoveExtraMarkers:%22false%22 txtBackupFolder:%22%22 txtEditorFocus:%22text%22 txtMainTab:%22Timeline%22 txtMoreTab:%22moreTabAll%22 txtMaxEditRows:%2230%22 txtFileSystemCharSet:%22UTF-8%22 txtTheme:%22%22 txtUserName:%22YourName%22

Вот что я получаю в чистом Хроме. Я также пробовал это в Vivaldi с установленным HTML5 Storage Manager All in One (расширение Chrome), и он показывает то же самое, за исключением случая, когда присутствуют 2 куки: консоль выдает ту же строку, что и выше (на document.cookie) , расширение показывает

2 cookies with same names and same values

Этого не происходит в https://classic.tiddlywiki.com/ (удаление / редактирование работает как положено).

Теперь я решил, что для удаления начального файла cookie мне нужно было сделать

document.cookie = 'TiddlyWikiClassicOptions=; path=/; expires=Thu, 01 Jan 1970 00:00:01 GMT;';

и если я добавлю lalala один, я также должен был сделать

document.cookie = 'TiddlyWikiClassicOptions=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';

удалить второй.

Интересно, как я могу определить, какой путь мне следует использовать? document.cookie, похоже, ничего не говорит о «объеме» каждого куки. Или это что-то введено в дизайн, и мне всегда нужно знать, какой cookie был назначен для какого пути?

PS Я видел сообщение, из-за которого у меня возникает такая же проблема с доменами ( это на русском языке ), поэтому мне интересно, как связать домен с файлом cookie.

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Вот моя реализация идеи даны (удаление cookie для каждой пары путь + домен):

function deleteCookieFromAllScopes(cookieName)
{
    var domainParts = window.location.hostname.split('.').reverse();
    var topLevelDomain = domainParts.shift();
    var domains = [];
    for(let domainPart of domainParts)
    {
        let prevDomain = domains.slice(-1)[0] || topLevelDomain;
        domains.push(domainPart + '.' + prevDomain);
    }

    var path = window.location.pathname;
    var paths = ['/'], pathLength = 1, nextSlashPosition;
    while( (nextSlashPosition = path.indexOf('/', pathLength)) != -1 )
    {
        pathLength = nextSlashPosition + 1;
        paths.push(path.substr(0, pathLength));
    }

    for(let path of paths)
        for(let domain of domains)
            document.cookie = `${cookieName}=; path=${path}; domain=${domain}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
}

Это больше не сомневается, но гораздо более читабельно, я думаю. Предложения по улучшению приветствуются.

Вот модификация для особого случая куки-файлов страницы, открытой по схеме file::

function deleteCookieFromAllPaths(cookieName)
{
    var path = window.location.pathname;
    var paths = ['/'], pathLength = 1, nextSlashPosition;
    while( (nextSlashPosition = path.indexOf('/', pathLength)) != -1 )
    {
        pathLength = nextSlashPosition + 1;
        paths.push(path.substr(0, pathLength));
    }

    for(let path of paths)
        document.cookie = `${cookieName}=; path=${path}; expires=Thu, 01 Jan 1970 00:00:01 GMT;`;
}
0 голосов
/ 07 ноября 2018

Если вы не знаете (суб) домен и / или путь куки, попробуйте истечь все комбинации.

var hostname = window.location.hostname;
var pathname = window.location.pathname;
var i = -1;
do {
  var domain = hostname.substr(i+1);
  var j = 0;
  do {
    var path = pathname.substr(0,j+1);
    var cookie = 'TiddlyWikiClassicOptions=; path='+path+'; domain='+domain+'; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
    console.log(cookie);
    // stacksnippets throws an exception... uncomment to set cookie.
    //document.cookie = cookie;
  } while ((j = pathname.indexOf('/', j+1)) != -1)
} while ((i = hostname.indexOf('.', i+1)) < hostname.lastIndexOf('.'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...