Якою була мотивація введення запитів на попередній політ?
Запроси попереднього польоту були введені, щоб браузер міг бути впевнений, що він працює з сервером, відомим CORS, перш ніж надсилати певні запити. Ці запити були визначені як такі, що були як потенційно небезпечними (зміни станів), так і новими (неможливо перед CORS через ту саму політику походження ). Використання запитів перед польотом означає, що сервери повинні відмовитись (правильно реагуючи на передполіт) на нові, потенційно небезпечні типи запитів, які CORS робить можливим.
У цьому і полягає сенс цієї частини специфікації : "Для захисту ресурсів від перехресних запитів, які не могли походити від певних агентів користувача до існування цієї специфікації, робиться запит перед польотом для того, щоб ресурс усвідомлював цю специфікацію."
Чи можете ви надати мені приклад?
Давайте уявимо, що користувач веб-переглядача входить на свій банківський сайт за адресою A.com
. Коли вони переходять до шкідливих B.com
, ця сторінка містить деякий Javascript, на який намагається надіслати DELETE
запит A.com/account
. Оскільки користувач увійшов у систему A.com
, цей запит, якщо він буде надісланий, включає куки, які ідентифікують користувача.
До CORS, політика веб-переглядача щодо того самого оригіналу заблокувала б його надсилання цього запиту. Але оскільки мета CORS полягає в тому, щоб зробити можливим саме такий тип взаємодії між походженнями, це вже не доречно.
Браузер може просто надіслати DELETE
та дозволити серверу вирішити, як з ним поводитися. Але що робити, якщо A.com
не знають про протокол CORS? Це може йти вперед і стратити небезпеку DELETE
. Можливо, було припущено, що завдяки політиці веб-переглядача щодо того самого оригіналу браузера він ніколи не може отримати такий запит, і, отже, він ніколи не був загартований проти такої атаки.
Щоб захистити такі сервери, які не знають CORS, протокол вимагає, щоб браузер спочатку надіслав запит перед польотом . Цей новий вид запиту - це те, на що лише сервери, обізнані з CORS, можуть відповідати належним чином, що дозволяє браузеру знати, чи безпечно надсилати фактичне чи ні DELETE
.
Чому вся ця суєта щодо браузера не може зловмиснику просто надіслати DELETE
запит із власного комп’ютера?
Звичайно, але такий запит не включає файли cookie користувача. Атака, яка призначена для запобігання, покладається на те, що браузер надсилатиме файли cookie (зокрема, інформацію про автентифікацію для користувача) для іншого домену разом із запитом.
Це звучить , як Cross-Site Request Підробка , де форма на сайті B.com
банку , POST
щоб A.com
з печивом користувача і нанести шкоду.
Це вірно. Іншим способом цього є те, що запити перед польотом були створені так, щоб не збільшувати поверхню атаки CSRF для серверів, не знаючих CORS.
Але дивлячись на вимоги до "простих" запитів, які не потребують попереднього перегляду, я бачу, що POST
це все ж дозволено. Це може змінити стан і видалити дані так само, як DELETE
!
Це правда! CORS не захищає ваш сайт від атак CSRF. Потім знову без CORS ви також не захищені від атак CSRF. Метою запитів перед польотом є лише обмежити експозицію CSRF до того, що вже існувало у світі перед CORS.
Зітхнути. Гаразд, я з нетерпінням приймаю потребу в попередніх польотах. Але чому ми повинні робити це для кожного ресурсу (URL) на сервері? Сервер або обробляє CORS, або його немає.
Ви впевнені в цьому? Не рідкість для декількох серверів обробляти запити для одного домену. Наприклад, може статися так, що запити A.com/url1
обробляються одним видом сервера, а запити A.com/url2
обробляються різним сервером. Як правило, сервер, що обробляє один ресурс, може гарантувати безпеку щодо всіх ресурсів у цьому домені.
Чудово. Давайте підемо на компроміс. Давайте створимо новий заголовок CORS, який дозволяє серверу точно вказати, для яких ресурсів він може говорити, щоб уникнути додаткових запитів перед польотом на ці URL-адреси.
Гарна ідея! Насправді ж заголовок Access-Control-Policy-Path
був запропонований саме для цієї мети. Зрештою, це було вимкнено із специфікації, мабуть через те, що деякі сервери неправильно реалізували специфікацію URI таким чином, що запити до шляхів, які видаються безпечними для браузера, насправді не були б безпечними на зламаних серверах.
Це розсудливе рішення, яке надало пріоритет безпеці над продуктивністю, дозволяючи браузерам негайно реалізувати специфікацію CORS, не наражаючи на існуючі сервери небезпеку? Або це було короткозорим, щоб приректи Інтернет на марну пропускну здатність і подвоїти затримку просто для розміщення помилок на певному сервері в певний час?
Думки різняться.
Ну, як мінімум, браузери будуть кешувати попередній перехід для однієї URL-адреси?
Так. Хоча, мабуть, не дуже довго. У браузерах WebKit максимальний час кешування перед польотом наразі становить 10 хвилин .
Зітхнути. Що ж, якщо я знаю, що мої сервери обізнані з CORS, і тому мені не потрібен захист, який пропонують запити перед польотом, чи є мені спосіб уникнути їх?
Ваш єдиний реальний варіант - переконатися, що ви відповідаєте вимогам до "простих" запитів. Це може означати відмову від користувацьких заголовків, які ви б інакше включали (як X-Requested-With
), брехні про Content-Type
або більше.
Що б ви не робили, ви повинні переконатися, що у вас є належний захист CSRF, оскільки специфікація CORS не стосується відхилення "простих" запитів, включаючи небезпечні POST
. Як зазначено в специфікації : "ресурси, для яких прості запити мають значення, окрім пошуку, повинні захищати себе від підробки міжміських запитів".