Коллизия cookie: возможно ли в Django и Javascript различать cookie родительского домена и поддомена?

Я создал кучу Django-сайтов на одном домене:

  • example.com
  • site1.example.com
  • site2.example.com
  • site3.example.com

Они должны быть полностью независимыми - использоваться разными людьми для разных целей.

Однако куки, установленные на example.com, имеют приоритет для Django, и значения, установленные на site1.example.com, site2.example.com и т.д., игнорируются, если родительский домен установил куки с таким же именем.


Как это работает:

Когда загружается первая страница, она устанавливает cookie, чтобы сервер знал, отправлять ли компьютерную или мобильную страницу при следующем запросе.

Программа Django создает правильную версию на основе значения cookie.

Когда загружается сайт1.example.com, он устанавливает cookie, запрашивая мобильную версию. Но затем программа Django видит значение, установленное example.com и игнорирует правильный cookie.

Итак, мне нужен способ сделать одно из следующего:

  1. prevent site1.example.com from reading the cookie of example.com
  2. differentiate in Django the domain associated with the cookie so I can tell that the value is wrong
  3. find a way to set a parent domain cookie in Javascript that makes it inaccessible to subdomains (I'm not using www)

Если я не смогу найти элегантное решение, я, вероятно, закончу тем, что изменю имя cookie, чтобы оно менялось вместе с именем домена.

Я знаю, что я мог бы использовать session framework, но кроме этой конкретной проблемы, все работает отлично. Я бы очень хотел избежать модификации существующей системы, хотя, конечно, если придется, я это сделаю.

В качестве временного решения я добавил некоторый код в функцию setCookie:

  var domain = window.location.hostname;
  deleteParentCookieIfNecessary(name, domain);

deleteParentCookieIfNecessary содержит:

function deleteParentCookieIfNecessary(name, domain){
  var parts = domain.split('.');
  if (parts.length > 2){ // on subdomain
    var domain = parts.slice(-2).join('.');
    document.cookie = cname + '=;domain=.' + domain + ';path=/;max-age=0';
  }
}

В результате, когда cookie установлен, если url является поддоменом, то cookie родительского домена с таким же именем будет автоматически удален.

Поскольку вы говорите, что сайты должны быть полностью независимыми, третье предложенное вами решение кажется наиболее разумным. Вы не должны устанавливать куки таким образом, чтобы они были доступны поддоменам. В настоящее время вы указываете домен в cookie, вы должны пропускать домен, что означает, что cookie будет отправляться только для текущего домена (по крайней мере, в современных браузерах, IE не следует этой спецификации). Если в cookie указан домен, это означает, что cookie будет использоваться и для поддоменов.

Ваша функция установки cookie должна выглядеть следующим образом:

function setCookie(cname, cvalue, exdays) {
  // Domain should not be set unless cookie needs to be accessed by subdomains
  // var domain = window.location.hostname;


  if (exdays > 7) exdays = 7; // max in Safari

  var d = new Date();
  d.setTime(d.getTime() + (exdays*24*60*60*1000));

  var name = cname + '=' + cvalue + '; ';
  var expy = 'expires=' + d.toUTCString(); + '; ';
  // Domain should not be set unless cookie needs to be accessed by subdomains
  // var domn = '; domain=' + domain + '; ';
  var path = 'path=/; ';
  var secu = 'samesite=lax; secure;';

  var complete = name + expy + path + secu;
  document.cookie = complete;
}
Вернуться на верх