CSRF Token Generator & Validator

Аватар
Autumn Shade
Извън линия
Потребител
Потребител
Мнения: 269
Регистриран на: 14 Мар 2019, 13:20
Се отблагодари: 48 пъти
Получена благодарност: 150 пъти

CSRF Token Generator & Validator

Мнение от Autumn Shade » 13 Юни 2019, 10:47

Понеже доста хора си правят сайтове, които са с готови изтеглени системи, къде имат някакви основни защити от SQLi или пък от XSS, също и за тези, които сами си ги пишат системите, има едно нещо, което много го пренебрегват. Това е CSRF, или така казано, Cross-site request forgery.

Какво представлява?
Представете си, че в момента се във вашият акаунт на банката www.amxxbank.bg . Представете си, че едно прехвърляне на пари ще даде като резултат една заявка от формуляра, който сте попълнили http://www.amxxbank.bg/transfer?to=(номер на акаунт);amount=(стойност). (не ви е нужен вашият номер на акаунта, понеже той е използван и запазен при входа в онлайн банкирането)

Посещавате някакъв случаен сайт чрез реклама, да кажем amxx-tampered.bg, като вие не знаете дали той е съмнителен или не. Ако собственикът на сайта има представа как работи тази заявка, която споменахме по-горе(което е супер елементарно за проследяване) и правилно отгатне, че сте останали в акаунта си(с малко късмет), може да извърши заявка като http://www.amxxbank.bg/transfer?to=12345;amount=50000, в която12345 е номер на акаунта, към който да прехвърли сумата, а 50000 е сумата, която сте се радвали, че имате допреди малко.

Вие сте в тази страница, затова браузъра ви ще направи заявката и банката не може да разпознае откъде идва заявката, защото реално изпращат заявка към www.amxxbank.bg през вашият браузър с бисквитката, която е запазена при вас за този сайт и по този начин изглежда напълно нормална заявка, пък после ходи търси какво е станало и как.

Накратко, така стоят нещата в свят без token-и. Доста страшничко, нали? А пък такъв ignore му бият всичките. :clap:

Добре, дай да обърнем и другата страна, ами ако има token, какво ще е по-различно?

Много простичко.
Пак имаме същата заявка, с лека промяна:
http://www.amxxbank.bg/transfer?to=1234 ... 5028841971

Този token е случайно генериран, salt-нат и се сменя спрямо фактори, които са близо до невъзможното за отгатване. Единствено можете да пожелаете успех на този, който се захване. Доста главоболие е, от личен опит казвам.

Решението:
Понеже повечето си мислят, ей така, ще сложат един token, но как, къде и ще стане пак мазало или същата работа. За тези, които искат да си играят, слагате го във формуляра като hidden field и му задавате стойността. За улеснение, написах един class за CSRF - да може да генерирате такъв token и да го проверявате дали е вашият.

https://github.com/amxx-bg/cellar

Как се ползва?
Супер елементарно е.Правим един include на файла, викаме конструктора, задаваме време на живот на token-а (след което ще се обнови) и ползваме.

Код за потвърждение: Избери целия код

$secret = 'някаква стойност за salt';
$cellar = new \AMXXBG\Cellar($secret, array('lifetime' => 3600));

// Генерираме token-а
$token = $cellar->generate();

// Проверяваме дали е валиден
if ($cellar->isValid($token)) {
  // Обработвате заявката или правите какво ще правите
}

// За допълнителни проверки
$cellar->hasExpired($token);
$cellar->hasTampered($token);
Като цяло е това.

Тестове под PHP 7.2:
Изображение


Последно издигане Autumn Shade от 13 Юни 2019, 10:47

Обратно към “Уроци”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта