Запит GET незначно менш безпечний, ніж запит POST. Ні одна не пропонує справжню "безпеку" сама по собі; використання POST-запитів помітно не захистить ваш веб-сайт від шкідливих атак. Однак використовувати GET-запити можна зробити безпечну програму інакше незахищеною.
Мантра, що ви "не повинні використовувати GET-запити для внесення змін", все ще є дійсною, але це мало стосується зловмисної поведінки. Форми для входу є найбільш чутливими до надсилання за допомогою неправильного типу запиту.
Шукайте павуків та веб-прискорювачів
Це справжня причина, коли ви повинні використовувати POST-запити для зміни даних. Шукати павуки будуть переходити за кожним посиланням на вашому веб-сайті, але не подаватимуть випадкові форми, які вони знайдуть.
Веб-прискорювачі гірші, ніж пошукові павуки, тому що вони працюють на машині клієнта, і "клацають" по всіх посиланнях у контексті зареєстрованого користувача . Таким чином, додаток, який використовує GET-запит для видалення речей, навіть якщо для цього потрібен адміністратор, буде радісно виконувати накази (не шкідливого!) Веб-прискорювача та видаляти все, що бачить .
Заплутана депутатська атака
Заплутатися заступник атаки (де депутат браузер) є можливим , незалежно від того, чи використовується GET або POST - запит .
На веб-сайтах, що контролюються зловмисниками, GET і POST однаково легко подати без взаємодії з користувачем .
Єдиний сценарій, у якому POST трохи менш сприйнятливий - це те, що багато веб-сайтів, які не знаходяться під контролем зловмисника (скажімо, сторонній форум) дозволяють вставляти довільні зображення (дозволяючи зловмиснику вводити довільний GET-запит), але запобігають усім способи введення довільного запиту POST, будь то автоматичного чи ручного.
Можна стверджувати, що веб-прискорювачі є прикладом заплутаної депутатської атаки, але це лише питання визначення. У всякому разі, зловмисник не має ніякого контролю над цим, так що навряд чи атака , навіть якщо депутат є в замішанні.
Проксі-журнали
Проксі-сервери, ймовірно, реєструють GET URL-адреси в повному обсязі, не знімаючи рядок запиту. Параметри запиту POST зазвичай не реєструються. Файли cookie навряд чи будуть записані в будь-якому випадку.(приклад)
Це дуже слабкий аргумент на користь POST. По-перше, незашифрований трафік можна реєструвати повністю; шкідливий проксі вже має все необхідне. По-друге, параметри запиту для зловмисника мають обмежене використання: те, що їм дійсно потрібно, - це файли cookie, тому якщо єдине, що вони мають, це проксі-журнали, вони навряд чи зможуть атакувати або GET, або POST URL.
Є один виняток для запитів на вхід: вони, як правило, містять пароль користувача. Збереження цього в журналі проксі відкриває вектор атаки, який відсутній у випадку POST. Однак вхід через звичайний HTTP все одно не є безпечним.
Кеш-проксі
Кешуючі проксі-сервери можуть зберігати GET-відповіді, але не POST-відповіді. Сказавши це, відповіді GET можна зробити кешованими з меншими зусиллями, ніж перетворення URL-адреси в обробник POST.
HTTP "Referer"
Якщо користувач повинен перейти на веб-сайт третьої сторони зі сторінки, поданої у відповідь на запит GET, цей веб-сайт отримує всі параметри запиту GET.
Належить до категорії "розкриває параметри запиту третій стороні", чіткість якої залежить від того, що є в цих параметрах. Запити POST, природно, не захищені від цього, однак для використання GET-запиту хакеру потрібно буде вставити посилання на власний веб-сайт у відповідь сервера.
Історія браузера
Це дуже схоже на аргумент "проксі-журнали": GET-запити зберігаються в історії браузера разом з їх параметрами. Зловмисник може легко отримати їх, якщо у них є фізичний доступ до машини.
Дія оновлення браузера
Веб-переглядач повторно повторить GET-запит, як тільки користувач натисне «оновити». Це може зробити це під час відновлення вкладок після відключення. Будь-яка дія (скажімо, платіж) таким чином буде повторена без попередження.
Веб-переглядач не повторюватиме запит POST без попередження.
Це хороший привід використовувати лише запити POST для зміни даних, але не має нічого спільного зі шкідливою поведінкою і, отже, безпекою.
То що мені робити?
- Використовуйте лише запити POST для зміни даних, головним чином, з міркувань безпеки.
- Використовуйте лише POST-запити для форм входу; в іншому випадку вводяться вектори атак.
- Якщо ваш сайт виконує чутливі операції, вам дійсно потрібен хтось, хто знає, що вони роблять, тому що це не може бути висвітлено в одній відповіді. Вам потрібно використовувати HTTPS, HSTS, CSP, пом'якшити ін'єкцію SQL, ін'єкцію скриптів (XSS) , CSRF та ін., Що може бути специфічним для вашої платформи (наприклад, вразливість масового призначення в різних рамках: ASP.NET MVC , Рубіни на рейках тощо). Не існує жодної речі, яка дозволить змінити "безпечний" (не експлуатований) і "не захищений".
Через HTTPS дані POST кодуються, але чи може URL-адреси обнюхувати третьою стороною?
Ні, їх не можна нюхати. Але URL-адреси будуть збережені в історії браузера.
Чи було б справедливо сказати, що найкраща практика полягає у тому, щоб уникнути можливого розміщення конфіденційних даних у POST або GET взагалі та використання коду на стороні сервера для обробки конфіденційної інформації?
Залежить від того, наскільки він чутливий, а точніше, яким чином. Очевидно, клієнт це побачить. Той, хто має фізичний доступ до комп'ютера клієнта, побачить це. Клієнт може підробляти його, повертаючи його вам назад. Якщо це важливо, тоді так, зберігайте конфіденційні дані на сервері і не дозволяйте їм залишати.