Коли я повинен використовувати метод GET або POST? Яка різниця між ними?


249

Яка різниця при використанні GETчи POSTметоді? Який із них безпечніший? Які (недо) переваги кожного з них?

( подібне запитання )


2
Get не має тіла, тому на практиці означає, що ви обмежені в імені -> парами значень як структури даних через відсутність будь-якого формату кодування рядка запиту для більш складної структури. Якщо вам потрібно обробляти більш складні структури даних у ваших запитах (тобто масив, об’єкт тощо), вам потрібно використовувати POST та, можливо, більш вдосконалені формати (json / xml). Коротко сказано: не використовуйте GET, якщо вам це не доведеться (тобто URL-адреса / ресурс повинні бути відкриті).
themihai

Відповіді:


263

Це не питання безпеки. У HTTP - протокол визначає GET-типу запитів як є ідемпотентів , в той час як косяки , мають побічні ефекти. У звичайній англійській мові це означає, що GET використовується для перегляду чогось, не змінюючи його, тоді як POST використовується для чогось змінити. Наприклад, сторінка пошуку повинна використовувати GET, тоді як форма, яка змінює ваш пароль, повинна використовувати POST.

Також зауважте, що PHP трохи плутає поняття. Запит POST надходить з рядка запиту та через тіло запиту. GET-запит просто отримує введення з рядка запиту. Таким чином, POST-запит - це набір GET-запиту; Ви можете використовувати $_GETв запиті POST, і він навіть може мати сенс мати параметри з тим же ім'ям в $_POSTі $_GETщо означають різні речі.

Наприклад, скажімо, у вас є форма для редагування статті. Ідентифікатор статті може бути в рядку запиту (і, таким чином, доступний через $_GET['id']), але скажімо, що ви хочете змінити id статті. Потім новий ідентифікатор може бути присутнім в тілі запиту ( $_POST['id']). Гаразд, можливо, це не найкращий приклад, але я сподіваюся, що це ілюструє різницю між ними.


13
Існує певний аспект безпеки для різниці між GET та POST. Зловмисний сайт може приклеїти довільний запит GET у тег зображення, наприклад, змушуючи користувачів робити GET на іншому сервері. Якщо цей GET схожий на інший сервер / deletemyaccount, тоді трапляються погані речі.
Френк Швітерман

2
Я мав на увазі те, що вміст $ _POST не є магічно прихованим від шкідливих користувачів. Очевидно, що для всіх програм програмування речі є аспекти безпеки.
troelskn

1
Цей пост не відповідає повністю на питання, оскільки він не згадує про наслідки для безпеки. Верхня частина хороша до тих пір, поки орфографічна помилка "bol English" буде змінена на "plain English". Нижню частину занадто важко дотримуватися. В цілому, набагато краще, ніж мій пост Тхо. :-)
Akrikos

1
"Запит POST отримує введення з рядка запиту та через тіло запиту." ІМХО це неправильно. Щоб використовувати будь-який вхід, вам потрібно використовувати $ _REQUEST. $ _POST не отримує записи URL-адреси.
Гуннар Бернштейн

1
@Frank Schwieterman Я знаю, що це повідомлення старе, але видалити мій обліковий запис не є ідентичним, і він не повинен використовувати get.
frostymarvelous

77

Коли користувач вводить інформацію у форму та натискає Надіслати, є два способи передачі інформації з браузера на сервер: за URL-адресою або в тілі HTTP-запиту.

Метод GET, який використовувався в прикладі раніше, додає пари імен / значень до URL-адреси. На жаль, довжина URL-адреси обмежена, тому цей метод працює лише за наявності лише кількох параметрів. URL-адреса може бути усічена, якщо форма використовує велику кількість параметрів або якщо параметри містять велику кількість даних. Також параметри, передані за URL-адресою, видно в адресному полі браузера, не найкраще місце для відображення пароля.

Альтернативою методу GET є метод POST. Цей метод пакує пари імен / значень всередині тіла HTTP-запиту, що робить більш чистим URL-адресу і не накладає обмежень на розмір у виведенні форм. Це також більш безпечно.


1
Як це "безпечніше"?
Джуліан Решке

4
тому що його важче змінити? ви можете змінити GET в адресному рядку, але це не так просто з POST.
IAdapter

8
Сервер не може довіряти клієнту. Створення програми на основі помилкових припущень далеко не безпечно.
troelskn

Опенід теж не рятує, бо його можна зламати?
IAdapter

1
Я вважаю, що це найяскравіше пояснення - різниця щодо розміщення надісланих даних. Дякую.
greenoldman

37

Найкращою відповіддю була перша.

Ви використовуєте:

  • GET , якщо ви хочете отримати дані (GET DATA).
  • POST, коли потрібно надіслати дані (POST DATA).

2
Для чого використовується схема запиту / відповіді, і ви хочете зробити те і інше? ;) Я вважаю за краще використовувати POST у більшості випадків, коли мені потрібно отримати відповідь.
Дмитро Павлов

8
Взагалі це правда. GETцілком здатний також "надсилати" дані, тому не дуже точна відповідь.
Патрік Хофман

23

Є два загальних наслідки для використання "безпеки" GET. Оскільки дані відображаються в рядку URL-адреси, можливо, хтось, хто переглядає ваше плече в адресному рядку / URL-адресі, може переглядати щось, чого не повинно бути таємним, наприклад, сесійне cookie, яке потенційно може бути використане для викрадення вашого сеансу. Майте на увазі, що у всіх є телефони з камерою.

Інші наслідки безпеки пов'язані з GETтим, що GETзмінні реєструються в більшості журналів доступу до веб-серверів як частини URL-адреси запиту. Залежно від ситуації, регуляторного клімату та загальної чутливості даних це потенційно може викликати занепокоєння.

Деякі клієнти / брандмауери / системи IDS можуть нахмуритися на GETзапити, що містять надмірну кількість даних, і тому можуть дати недостовірні результати.

POST підтримує розширені функціональні можливості, такі як підтримка двочастинного двійкового вводу, що використовується для завантаження файлів на веб-сервери.

POSTпотрібен заголовок довжини вмісту, який може збільшити складність реалізації конкретної програми для клієнта, оскільки розмір поданих даних повинен бути відомий заздалегідь, запобігаючи формуванню запиту клієнта в виключно однопрохідному інкрементальному режимі. Можливо, незначна проблема для тих, хто вирішив зловживати HTTP, використовуючи його в якості транспорту RPC (Віддалений виклик процедури).

Інші вже зробили хорошу роботу в висвітленні смислових відмінностей та частини "коли" цього питання.


17

Я використовую GET , коли я витяг інформації з URL - адреси і POST , коли я посилаю інформацію в вигляді URL.


1
але ви можете використовувати GET і для надсилання. Різниця полягає у форматі (в URL-адресі (GET) або в запиті (POST)).
eric

Якщо кінцева точка приймає файл і повертає рядок із файлу (не створюється чи змінюється дані чи не застосовується база даних), то кінцевою точкою має бути GET або POST?
змінна

17

Ви повинні використовувати POST, якщо є багато даних або делікатна інформація (начебто чутливі речі потребують і безпечного з'єднання).

Використовуйте GET, якщо ви хочете, щоб люди змогли зробити закладку на вашій сторінці, оскільки всі дані включені в закладку.

Будьте обережні, люди, які потрапляють на REFRESH методом GET, тому що дані будуть надсилатися знову щоразу без попередження користувача (POST іноді попереджає користувача про повторне надсилання даних).


Якщо кінцева точка приймає файл і повертає рядок із файлу (не створюється чи змінюється дані чи не застосовується база даних), то кінцевою точкою має бути GET або POST?
змінна

@ варіабельна POST. У цьому випадку здебільшого тому, що POST створений для обробки завантажень файлів, а стандартний GET не є. Вам потрібно буде надсилати файл щоразу, коли сторінка завантажується, тому є сенс просто використовувати стандартний POST замість GET + файл, який би порушив сподівання GET, що URL-адреса повинна давати більш-менш однакові результати кожен раз.
Грант

14

Цей документ W3C пояснює використання HTTP GET та POST.

Я думаю, що це авторитетне джерело.

Короткий підсумок (розділ 1.3 документа):

  • Використовуйте GET, якщо взаємодія більше нагадує запитання (тобто це безпечна операція, наприклад запит, читання або пошук).
  • Використовуйте POST, якщо:
    • Взаємодія більше нагадує наказ, або
    • Взаємодія змінює стан ресурсу таким чином, як сприймає користувач (наприклад, підписка на послугу) або
    • Користувач несе відповідальність за результати взаємодії.

9
Я думаю, що це може бути дальше узагальнено таким чином: GET коли стан сервера не змінено, POST коли він є.
Ямча

10

Методи отримання та розміщення не мають нічого спільного з серверною технологією, яку ви використовуєте, вона працює однаково в php, asp.net або ruby. GET і POST є частиною протоколу HTTP. Як відмічено, марка POST є більш захищеною. Форми POST також не кешуються браузером. POST також використовується для передачі великої кількості даних.


8

Причина використання POST при внесенні змін до даних:

  • Веб-прискорювач, як-от Google Web Accelerator, натискатиме всі посилання (GET) на сторінці та зберігає їх у кеші. Це дуже погано, якщо посилання вносять зміни до речей.
  • Браузер кешує запити GET, тому навіть якщо користувач натискає посилання, він може не надсилати запит серверу для виконання змін.
  • Для захисту свого сайту / програми від CSRF необхідно використовувати POST. Щоб повністю захистити свою програму, ви також повинні створити унікальний ідентифікатор на сервері та надіслати його разом із запитом.

Крім того, не вводите конфіденційну інформацію в рядок запиту (лише опція з GET), оскільки вона відображається в адресному рядку, закладках та журналах сервера.

Сподіваємось, це пояснює, чому люди кажуть, що POST "захищений". Якщо ви передаєте конфіденційні дані, ви повинні використовувати SSL.


8

GETі POSTце методи HTTP, які дозволяють досягти подібних цілей

GETв основному це просто отримання (отримання) даних, A GETне повинен мати корпус, тому окрім файлів cookie, єдине місце для передачі інформації в URL-адресі та URL-адреси обмежені по довжині, GETменш безпечне порівняно з POSTтим, що дані, що надсилаються, є частиною URL-адреса

Ніколи не використовуйте GETдля надсилання паролів, кредитної картки чи іншої конфіденційної інформації !, Дані видно всім у URL-адресі, Можуть кешувати дані. GETнешкідливий, коли ми перезавантажуємо або передзвонимо кнопку, вона буде позначена книжкою, параметри залишаються в історії браузера, дозволені лише символи ASCII.

POSTможе включати будь-що, як-от зберігання чи оновлення даних, замовлення товару чи надсилання електронної пошти. POSTметод має тіло.

POSTметод захищений для передачі конфіденційної та конфіденційної інформації на сервер, він не буде видно в параметрах запиту в URL-адресі, а параметри не зберігаються в історії браузера. Немає обмежень щодо довжини даних. Коли ми перезавантажуємо браузер, він повинен попереджати користувача про те, що дані збираються повторно надсилатись. POSTметод не може бути закладений у закладки


3
  1. Метод GET використовується для надсилання менш чутливих даних, тоді як метод POST використовується для надсилання конфіденційних даних.
  2. Використовуючи метод POST, ви можете надсилати велику кількість даних порівняно з методом GET.
  3. Дані, надіслані методом GET, видно на заголовку браузера, тоді як дані, що надсилаються методом POST, невидимі.

0

Використовуйте метод GET, якщо ви хочете отримати ресурси з URL. Ви завжди можете побачити останню сторінку, якщо натиснути кнопку "назад" у веб-переглядачі, і її можна зробити на закладках, тому це не так безпечно, як метод POST.

Використовуйте метод POST, якщо ви хочете щось "надіслати" до URL-адреси. Наприклад, ви хочете створити обліковий запис google, і вам може знадобитися заповнити всю детальну інформацію, після натискання кнопки "надіслати" (метод POST називається тут), після успішної подачі, і спробуйте натиснути кнопку назад вашого браузера. , ви отримаєте помилку або нову порожню форму замість останньої сторінки із заповненою формою.


-10

GETметод:

  • Він використовується лише для надсилання дати з 256 символами

  • При використанні цього методу інформацію можна побачити у браузері

  • Це метод за замовчуванням, який використовується формами

  • Це не так забезпечено.


POSTметод:

  • Він використовується для надсилання необмежених даних.

  • За допомогою цього методу інформацію не можна побачити у браузері

  • Ви можете чітко згадати про POSTметод

  • Він більш захищений, ніж GETметод

  • Він надає більш вдосконалені функції


"Він використовується лише для надсилання дати з 256 символами" - не відповідає дійсності. "Використовуючи цей метод, інформацію можна побачити у браузері" - дані публікації також видно в браузерах, це просто не так очевидно. "Він надає більш вдосконалені функції" - такі як?
Квентін

Це не дуже корисна відповідь. Неправильна інформація на зразок "вона не настільки захищена" та "надає більш досконалі функції" та інші речі, згадані Квентіном.
Ендрю Барбер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.