особенности стандарта подталкивают разработчиков помещать токен прямо в адрес. а потом начинают думать как бы им "защитить самого пользователя от неблагоразумного распространения ключа, в составе URL". неидеальный мир.
Там же написано: "...или в HTTP заголовке запроса". Его, внезапно, можно даже c GET-запросом передать ) Потому - всё равно не понятно. --- Добавлено --- Код (Javascript): fetch('https://httpbin.org/delete', { method: 'DELETE', headers: { 'Token': '123' }}).then((response) => { return response.json() }).then((result) => { console.log(result.headers.Token) })
@romach все-таки формирование и разбор заголовков или отправка формы выглядит сложнее, чем переход по ссылке с уникальным токеном, не находишь?
Для этих целей в yii прикольную штуку сделали, я сейчас повторяю это и в проектах на других фреймворках. В ссылку дописывается data-method='post', и через js для таких ссылок при клике создаётся невидимая форма и субмитится. Для пользователя выглядит как ссылка, а на самом деле срабатывает post. Правда, без JS всё отрубится, но у меня ещё ни одного сайта не было, где бы заказчик не требовал столько интерактива, что без js даже менюшку порой не открыть
@mkramer это интересно. но представь что пользователь захочет поделиться ссылкой - нормальное желание. right click / Copy Link Location / paste. и если в такой ссылке присутствует токен, то он понятное дело перестанет быть секретным. вот из-за подобных кейсов я думаю, что одноразовые или прикрепленные к конкретному действию токены дают бОльшую защиту.
В самой ссылке токена нету, в том-то и прикол. Токен вставляется в скрытую форму, которая отправляется постом, берётся из метатегов. И это для ссылок, которыми никто не будет делиться, типа того же логаута или удаления. Ну а если поделится, на стороне сервера ставится ограничение на этот роут, чтоб только post.
Сложнее в чем? Добавить заголовок к запросу и обработать его на сервере всяко ж проще, чем постоянно ожидать гонку токенов, не? --- Добавлено --- Его не надо передавать ссылкой, даже добавлять его к ссылке не надо. Надо передавать http-заголовком к запросу. Всё. Мне одноразовый токен напоминает знаменитые htmlspecialchars(trim(stripslashes())) и что там ещё есть. Многие делают так, потому что "защита больше", но мы ведь тут взрослые дяди и не надо объяснять, в каких случаях и на каких этапах оно нужно, а в каких вредительство и карго-культ? )
не возражаю. --- Добавлено --- вот правда не надо. у каждого возраста и опыта есть свои фетиши. вернёмся к этому через год, может быть
Это вот проблема, суть которой в том, что разработчик кладет болт на то, что GET-запросы должны быть запросами на получение данных, блин, а не на изменение состояния системы. Если у тебя в ссылке появляются юзер-специфичные данные, значит ты уже что-то делаешь не так. И надо исправлять причину, а не обвешивать это золотыми костылями.
эх... теперь видимо придется ждать 40 лет, что бы вкурить смысл "молодежь, вы нихера не понимаете в арбузах на деревьях" ))
Нашел навороченный скрипт на защиту от CSR, вроде бы звезд много, ставлю - если открывать одно окно - проверка работает, если открыть сразу два, и отправить данные в первой форме - ошибка. блин, спрашивается к чему столько наворотов, и откуда столько звезд, если защита не работает как надо...
Потому что большинство людей видят, что звезд много и ставят еще одну не думая. Ну и да, зато защитища какая! Одноразовое все! Секурность! Все, что могли, от своего же пользователя оградили..