В моята предишна публикация в блога бях обсъждал модела на токен за синхронизиране (STP) и как се прилага. Тази публикация е за втория най-разпространен начин за използване на Anti-CSRF токена, моделът Double Submit Cookie.

Въведение

Double Submit Cookie Pattern (DSCP) влиза в действие, когато имате ограничени сървърни ресурси и не можете да си позволите да следите всеки токен за всяка сесия (и по-голямо затруднение, когато един потребител може да има няколко сесии).

Поток от събития на образец на бисквитка за двойно изпращане

Основната разлика тук в сравнение с модела на токен за синхронизатор е, че генерираният Токен не се съхранява от страна на сървъра и сървърът няма запис на токена. Всичко, което сървърът прави, е да генерира токена и да го изпрати на страната на клиента. Оттам нататък токенът ще бъде достъпен само от страна на клиента, което изисква да не задавате тази бисквитка на токена като HttpOnly (тъй като JavaScript в браузъра трябва да прочетете тази бисквитка).

Когато потребител влезе в защитения уебсайт, неговите/нейните идентификационни данни се проверяват и потребителят се удостоверява. След това сървърът създава идентификатор на сесия за потребителя и го задава като бисквитка в отговора. По подобен начин токен бисквитка също се генерира и задава като бисквитка. Сървърът трябва да съхранява идентификатора на сесията за потребителя (за да следи потребителя), но не съхранява токена за тази сесия.

Веднага щом отговорът за удостоверяване бъде изпратен до браузъра на клиента, скриптът от страна на клиента (в този случай JavaScript) рчете маркерната бисквитка, извлича стойността и я вгражда във формуляра за операция за промяна на състоянието като скрито поле . След като потребителят попълни полетата и изпрати формуляра, заявката се изпраща с маркерната бисквитка (и сесийната бисквитка) в заглавката и също същата стойност на маркера в тялото на заявката.

Сега, когато заявката бъде получена от сървъра, стойността в токен бисквитката и стойността на токена в тялото на заявката се извличат и сравняват, за да се види дали съвпадат. Ако да, исканото действие за промяна на състоянието се изпълнява.

Примерно внедряване

Същото примерно приложение Spring Boot, използвано в предишната публикация в блога за Synchronizer Token Pattern, както преди, с незначителни промени в кода от страна на сървъра, ще бъде използвано като демонстрация и тук.

Когато потребителят влезе, неговите идентификационни данни ще бъдат потвърдени и разрешени за влизане в началната страница. Кодът по-долу е MainController, който обработва удостоверяването и добавя сесийната бисквитка и маркерната бисквитка към отговора. Също така в кода по-долу е PostMapping за /blog, което в този случай би било операцията за промяна на състоянието.

Идентификаторът на сесияи бисквитките csrf токен могат да се видят в браузъра на клиента, както е показано на изображението по-долу.

Класът на услугата изпълнява механизмите за удостоверяване и валидиране, както е показано в същността по-долу.

Ако и само ако заявката, която се изпраща, включва токена както в заглавката, така и в тялото, заявката ще бъде разрешена да премине през сървъра.

Колко сигурно е това?

Нападател от кръстосан произход няма да може да прочете каквато и да е информация от сървъра, нито да промени стойностите на бисквитките, съгласно политиката за същия произход. Но все пак нападателят може да подмами удостоверения потребител да изпрати злонамерена заявка до валидния URL адрес, но без стойността на бисквитката на токена в тялото на заявката на нападателя, заявката незабавно ще бъде провалена от сървъра. Следователно, докато не разрешите изрично кръстосани заявки към сървъра, вашето приложение е безопасно.

Или наистина е така?

Но наскоро изследователи по сигурността от OWASP пуснаха възможна атака, която може да заобиколи шаблона Double Submit Cookie и да организира CSRF атака. Сървърът, който не познава бисквитката на токена, е една от причините за гореспоменатия проблем. Намерени са възможности за нападател да настрои бисквитките чрез използване на поддомейни и промени на човек по средата в обикновени HTTP връзки.

Очаквайте още интересни публикации...

Ако ви е харесала тази статия, моля, задръжте бутона за пляскане по-долу 👏, за да помогнете на другите да я намерят.