ฉันควรใช้วิธี GET หรือ POST เมื่อใด ความแตกต่างระหว่างพวกเขาคืออะไร


249

ความแตกต่างระหว่างการใช้GETหรือPOSTวิธีการคืออะไร? อันไหนปลอดภัยกว่ากัน? อะไรคือข้อดีของแต่ละข้อ?

( คำถามที่คล้ายกัน )


2
Get ไม่มีเนื้อความในทางปฏิบัติหมายความว่าคุณถูก จำกัด ให้ใช้ชื่อ -> คู่ของค่าเป็นโครงสร้างข้อมูลเนื่องจากไม่มีรูปแบบการเข้ารหัสสตริงแบบสอบถามใด ๆ สำหรับโครงสร้างที่ซับซ้อนมากขึ้น หากคุณต้องการจัดการโครงสร้างข้อมูลที่ซับซ้อนมากขึ้นในคำขอของคุณ (เช่นอาร์เรย์วัตถุ ฯลฯ ) คุณต้องใช้ POST และรูปแบบขั้นสูง (json / xml) พูดสั้น ๆ : อย่าใช้ GET เว้นแต่คุณจะต้อง (เช่น URL / ทรัพยากรจะต้องค้นพบได้)
themihai

คำตอบ:


263

มันไม่ใช่เรื่องของความปลอดภัย โปรโตคอล HTTP กำหนดคำขอประเภท GET ว่าเป็นidempotentในขณะที่ POST อาจมีผลข้างเคียง ในภาษาอังกฤษแบบธรรมดานั่นหมายความว่า GET ใช้สำหรับการดูบางสิ่งโดยไม่ต้องเปลี่ยนในขณะที่ POST ใช้สำหรับการเปลี่ยนบางสิ่งบางอย่าง ตัวอย่างเช่นหน้าการค้นหาควรใช้ GET ในขณะที่แบบฟอร์มที่เปลี่ยนรหัสผ่านของคุณควรใช้ POST

นอกจากนี้โปรดทราบว่า PHP สร้างความสับสนให้กับแนวคิดเล็กน้อย คำขอ POST รับอินพุตจากสตริงเคียวรีและผ่านเนื้อความคำขอ คำขอ GET เพิ่งได้รับอินพุตจากสตริงแบบสอบถาม ดังนั้นคำขอ POST จึงเป็น superset ของคำขอ GET คุณสามารถใช้$_GETในคำขอ POST และอาจเหมาะสมที่จะมีพารามิเตอร์ที่มีชื่อเดียวกัน$_POSTและ$_GETนั่นหมายถึงสิ่งต่าง ๆ

ตัวอย่างเช่นสมมติว่าคุณมีแบบฟอร์มสำหรับแก้ไขบทความ Article-id อาจอยู่ในสตริงการสืบค้น (และมีให้ใช้งานผ่าน$_GET['id']) แต่สมมติว่าคุณต้องการเปลี่ยน Article-id รหัสใหม่อาจมีอยู่ในเนื้อหาคำขอ ( $_POST['id']) ตกลงบางทีนั่นอาจไม่ใช่ตัวอย่างที่ดีที่สุด แต่ฉันหวังว่ามันจะแสดงให้เห็นถึงความแตกต่างระหว่างทั้งสอง


13
มีแง่มุมความปลอดภัยที่แน่นอนถึงความแตกต่างระหว่าง GET และ POST ไซต์ที่เป็นอันตรายสามารถติดคำขอ GET โดยพลการในแท็กรูปภาพทำให้ผู้ใช้ทำการ GET กับเซิร์ฟเวอร์อื่น หาก GET นี้เป็นเหมือนotherserver / deletemyaccount แสดงว่าสิ่งเลวร้ายเกิดขึ้น
Frank Schwieterman

2
สิ่งที่ฉันหมายถึงคือเนื้อหาของ $ _POST ไม่ได้ซ่อนไว้อย่างน่าอัศจรรย์จากผู้ใช้ที่เป็นอันตราย เห็นได้ชัดว่ามีประเด็นด้านความปลอดภัยสำหรับการเขียนโปรแกรมทุกสิ่ง
troelskn

1
โพสต์นี้ไม่ได้ตอบคำถามอย่างสมบูรณ์เพราะเขาไม่ได้พูดถึงผลกระทบด้านความปลอดภัย ส่วนบนดีตราบใดที่ข้อผิดพลาดในการสะกดคำ "pain English" เปลี่ยนเป็น "Plain English" ส่วนล่างนั้นยากเกินกว่าจะติดตาม โดยรวมแล้วดีกว่าโพสต์ของฉันมาก :-)
Akrikos

1
"คำขอ POST รับอินพุตจากสตริงข้อความค้นหาและผ่านเนื้อความคำขอ" IMHO สิ่งนี้ไม่ถูกต้อง ในการใช้อินพุตคุณต้องใช้ $ _REQUEST $ _POST ไม่ได้รับรายการ URL
Gunnar Bernstein

1
@ Frank Schwieterman ฉันรู้ว่าโพสต์นี้เก่า แต่ลบบัญชีของฉันไม่ใช่ idempotent และไม่ควรใช้ get
frostymarvelous

77

เมื่อผู้ใช้ป้อนข้อมูลในแบบฟอร์มและคลิกส่งมีสองวิธีที่ข้อมูลสามารถส่งจากเบราว์เซอร์ไปยังเซิร์ฟเวอร์: ใน URL หรือภายในเนื้อความของคำขอ HTTP

เมธอด GET ซึ่งใช้ในตัวอย่างก่อนหน้านี้ต่อท้ายชื่อ / ค่าต่อท้าย URL น่าเสียดายที่ความยาวของ URL มี จำกัด ดังนั้นวิธีนี้จะใช้ได้เฉพาะเมื่อมีพารามิเตอร์เพียงไม่กี่พารามิเตอร์เท่านั้น URL อาจถูกปัดเศษหากฟอร์มใช้พารามิเตอร์จำนวนมากหรือหากพารามิเตอร์มีข้อมูลจำนวนมาก นอกจากนี้พารามิเตอร์ที่ส่งผ่าน URL จะปรากฏในช่องที่อยู่ของเบราว์เซอร์ไม่ใช่สถานที่ที่ดีที่สุดสำหรับรหัสผ่านที่จะแสดง

ทางเลือกของวิธีการ GET คือวิธี POST เมธอดนี้จัดทำแพ็กเกจคู่ชื่อ / ค่าที่อยู่ภายในเนื้อความของคำร้องขอ HTTP ซึ่งสร้างขึ้นเพื่อทำความสะอาด URL และไม่มีการ จำกัด ขนาดของเอาต์พุตแบบฟอร์ม มันมีความปลอดภัยมากกว่า


1
มีความปลอดภัยมากกว่านี้อย่างไร?
Julian Reschke

4
เพราะมันยากที่จะเปลี่ยน? คุณสามารถเปลี่ยน GET ในแถบที่อยู่ได้ แต่มันไม่ง่ายนักกับ POST
IAdapter

8
เซิร์ฟเวอร์ไม่สามารถเชื่อถือลูกค้าได้ การออกแบบแอปพลิเคชันของคุณเกี่ยวกับสมมติฐานที่ผิดนั้นอยู่ไกลจากความปลอดภัย
troelskn

openid ยังไม่ได้บันทึกเพราะมันสามารถแตก?
IAdapter

1
ฉันเชื่อว่านี่เป็นคำอธิบายที่ชัดเจนที่สุด - ความแตกต่างเกี่ยวกับการจัดวางข้อมูลที่ส่ง ขอบคุณ.
greenoldman

37

คำตอบที่ดีที่สุดคือคำตอบแรก

คุณกำลังใช้:

  • รับเมื่อคุณต้องการดึงข้อมูล (GET DATA)
  • POSTเมื่อคุณต้องการส่งข้อมูล (POST DATA)

2
รูปแบบบริการคำร้องขอ / ตอบสนองถูกใช้และคุณต้องการทำทั้งสองอย่าง? ;) ฉันต้องการใช้ POST ในกรณีส่วนใหญ่เมื่อฉันต้องการการตอบกลับ
Dmitry Pavlov

8
โดยทั่วไปนั้นเป็นเรื่องจริง GETมีความสามารถในการ 'ส่ง' ข้อมูลได้อย่างสมบูรณ์แบบดังนั้นจึงไม่ใช่คำตอบที่แม่นยำมากนัก
Patrick Hofman

23

มีสองร่วมกัน "ความปลอดภัย" GETผลกระทบจากการใช้เป็น เนื่องจากข้อมูลปรากฏในสตริง URL อาจมีบางคนที่มองข้ามไหล่ของคุณที่แถบที่อยู่ / URL อาจสามารถดูบางสิ่งที่ไม่ควรเปิดเผยเช่นคุกกี้เซสชันที่อาจถูกนำมาใช้เพื่อจี้เซสชันของคุณ โปรดทราบว่าทุกคนมีโทรศัพท์กล้องถ่ายรูป

ความเกี่ยวข้องด้านความปลอดภัยอื่น ๆ ของเกี่ยวข้อง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
ฉันคิดว่าสามารถสรุปเพิ่มเติมได้ดังนี้: รับเมื่อสถานะของเซิร์ฟเวอร์ไม่เปลี่ยนแปลง POST เมื่อเป็น
Yamcha

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ไม่ควรมีเนื้อหา, ดังนั้นนอกเหนือจากคุกกี้, ที่เดียวที่จะส่งผ่านข้อมูลอยู่ใน 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 ตัวอักษรเท่านั้น" - ไม่เป็นความจริง "เมื่อใช้วิธีนี้ข้อมูลสามารถมองเห็นได้บนเบราว์เซอร์" - โพสต์ข้อมูลสามารถมองเห็นได้ในเบราว์เซอร์มันก็ไม่ค่อยชัดเจนนัก "มันมีคุณสมบัติขั้นสูงเพิ่มเติม" - เช่น?
Quentin

นี่ไม่ใช่คำตอบที่มีประโยชน์มาก ข้อมูลที่ไม่ถูกต้องเช่น 'ไม่ปลอดภัยอย่างนั้น' และ 'มีคุณสมบัติขั้นสูงเพิ่มเติม' และสิ่งอื่น ๆ ที่ Quentin พูดถึง
Andrew Barber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.