สตริงข้อความค้นหา HTTPS ปลอดภัยหรือไม่


351

ฉันกำลังสร้าง API บนเว็บที่ปลอดภัยซึ่งใช้ HTTPS อย่างไรก็ตามหากฉันอนุญาตให้ผู้ใช้กำหนดค่า (รวมถึงการส่งรหัสผ่าน) โดยใช้สตริงการสืบค้นสิ่งนี้จะปลอดภัยหรือฉันควรบังคับให้ทำผ่าน POST หรือไม่

คำตอบ:


453

ใช่แล้ว. แต่การใช้ GET สำหรับข้อมูลที่สำคัญนั้นเป็นความคิดที่ไม่ดีด้วยเหตุผลหลายประการ:

  • การรั่วไหลของผู้อ้างอิง HTTP ส่วนใหญ่ (ภาพภายนอกในหน้าเป้าหมายอาจรั่วรหัสผ่าน [1])
  • รหัสผ่านจะถูกเก็บไว้ในบันทึกของเซิร์ฟเวอร์ (ซึ่งเห็นได้ชัดว่าไม่ดี)
  • แคชประวัติในเบราว์เซอร์

ดังนั้นแม้ว่า Querystring จะปลอดภัย แต่ก็ไม่แนะนำให้ถ่ายโอนข้อมูลที่สำคัญผ่าน Querystring

[1] แม้ว่าฉันต้องทราบว่า RFC ระบุว่าเบราว์เซอร์ไม่ควรส่งผู้อ้างอิงจาก HTTPS ไปยัง HTTP แต่นั่นไม่ได้หมายความว่าแถบเครื่องมือเบราว์เซอร์ของบุคคลที่สามที่ไม่ดีหรือรูปภาพ / แฟลชภายนอกจากไซต์ HTTPS จะไม่รั่วไหล


4
สิ่งที่เกี่ยวกับhttps เพื่อ httpsผู้อ้างอิง? หากฉันได้รับรูปภาพจากเว็บไซต์บุคคลที่สามโดยใช้ https เบราว์เซอร์จะส่งสตริงข้อความค้นหาทั้งหมดจากคำขอก่อนหน้าของฉันไปยังเซิร์ฟเวอร์บุคคลที่สามหรือไม่
Jus12

4
@ Jus12 ใช่มันจะไม่สมเหตุสมผล แต่นั่นคือวิธีการออกแบบ
ดร. ชั่วร้าย

2
ถ้าเช่นนั้นเหตุใดข้อกำหนด OAuth2 จึงไม่แนะนำให้ส่งข้อมูลที่ละเอียดอ่อนในพารามิเตอร์การสืบค้น (ใน URL) แม้ว่าจะแนะนำให้ใช้ TLS (HTTPS) เสมอ อ้างถึงจุดสุดท้ายในtools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka

@ dr.evil คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับปัญหาHistory caches in browsersหรือเพิ่มการอ้างอิงสำหรับ ir ได้อย่างไร?
LCJ

1
เพื่อให้คำตอบนั้นสมบูรณ์พร้อมข่าวสารล่าสุด: securitynewspaper.com
Tom

78

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

ดังนั้นควรใช้การโพสต์อย่างน้อยสำหรับกล่องโต้ตอบรหัสผ่าน นอกจากนี้ตามที่ระบุไว้ในลิงค์ littlegeek ที่โพสต์ GET URL มีแนวโน้มที่จะถูกเขียนลงในบันทึกเซิร์ฟเวอร์ของคุณ


48

ใช่สตริงข้อความค้นหาของคุณจะถูกเข้ารหัส

เหตุผลเบื้องหลังคือสตริงการสืบค้นเป็นส่วนหนึ่งของโปรโตคอล HTTP ซึ่งเป็นโปรโตคอลชั้นแอปพลิเคชันในขณะที่ส่วนความปลอดภัย (SSL / TLS) มาจากชั้นการขนส่ง การเชื่อมต่อ SSL สร้างขึ้นก่อนจากนั้นพารามิเตอร์การสืบค้น (ซึ่งเป็นของโปรโตคอล HTTP) จะถูกส่งไปยังเซิร์ฟเวอร์

เมื่อสร้างการเชื่อมต่อ SSL ลูกค้าของคุณจะทำตามขั้นตอนต่อไปนี้ตามลำดับ สมมติว่าคุณพยายามเข้าสู่เว็บไซต์ที่ชื่อว่าexample.comและต้องการส่งข้อมูลรับรองของคุณโดยใช้พารามิเตอร์ข้อความค้นหา URL ที่สมบูรณ์ของคุณอาจมีลักษณะดังต่อไปนี้:

https://example.com/login?username=alice&password=12345)
  1. ลูกค้าของคุณ (เช่นเบราว์เซอร์ / แอพมือถือ) จะแก้ไขชื่อโดเมนของคุณexample.comเป็นที่อยู่ IP (124.21.12.31)โดยใช้คำขอ DNS เมื่อทำการสืบค้นข้อมูลนั้นจะใช้เฉพาะข้อมูลโดเมนเท่านั้นคือexample.comจะใช้เท่านั้น
  2. ตอนนี้ไคลเอนต์ของคุณจะพยายามเชื่อมต่อกับเซิร์ฟเวอร์ด้วยที่อยู่ IP 124.21.12.31และจะพยายามเชื่อมต่อกับพอร์ต 443 (พอร์ตบริการ SSL ไม่ใช่พอร์ต HTTP เริ่มต้น 80)
  3. ตอนนี้เซิร์ฟเวอร์ที่example.comจะส่งใบรับรองไปยังลูกค้าของคุณ
  4. ลูกค้าของคุณจะตรวจสอบใบรับรองและเริ่มแลกเปลี่ยนคีย์ลับที่แชร์สำหรับเซสชันของคุณ
  5. หลังจากสร้างการเชื่อมต่อที่ปลอดภัยได้สำเร็จพารามิเตอร์การสืบค้นของคุณจะถูกส่งผ่านการเชื่อมต่อที่ปลอดภัยเท่านั้น

ดังนั้นคุณจะไม่เปิดเผยข้อมูลที่ละเอียดอ่อน อย่างไรก็ตามการส่งข้อมูลรับรองของคุณผ่านเซสชัน HTTPS โดยใช้วิธีนี้ไม่ใช่วิธีที่ดีที่สุด คุณควรเลือกวิธีอื่น


2
แต่ดูคำตอบโดย @dr สิ่งชั่วร้าย, สตริงเหมืองหินอาจสิ้นสุดลงในล็อกไฟล์และแคชดังนั้นจึงอาจไม่ปลอดภัยบนเซิร์ฟเวอร์
zaph

3
สวัสดี, ในแง่ของความปลอดภัย HTTPS, เป้าหมายคือการส่งข้อมูลไปยังเซิร์ฟเวอร์อย่างปลอดภัยโดยไม่มีใครอยู่ตรงกลางสามารถดักข้อมูลออกมาได้ ในขณะที่เป็นไปได้และตอบคำถามก็ยากที่จะควบคุมสิ่งที่เซิร์ฟเวอร์ทำในภายหลัง นั่นเป็นเหตุผลที่ฉันได้พูดถึงสิ่งนี้ด้วยวิธีที่ไม่ถูกต้อง เพิ่มไปที่คุณไม่ควรส่งรหัสผ่านของคุณจากลูกค้า คุณควรแฮชบนอุปกรณ์และส่งค่าแฮชไปยังเซิร์ฟเวอร์เสมอ
Ruchira Randana

จากมุมมองด้านความปลอดภัยที่ส่งข้อมูลที่เป็นความลับในสตริงเหมืองไม่ปลอดภัยควรส่งใน POST โดยทั่วไปรหัสผ่านจะถูกแฮชบนเซิร์ฟเวอร์ไม่ใช่โดยไคลเอนต์ ข้อความว่า "คุณไม่ควรส่งรหัสผ่านของคุณจากลูกค้า" ขัดแย้งกับคำตอบ: (e.g http://example.com/login?username=alice&password=12345).
zaph

@RuchiraRandana การแฮชบนไคลเอ็นต์นั้นไม่มีจุดหมายเพราะคีย์ส่วนตัวจะถูกดึงจากด้านหน้าได้อย่างง่ายดาย
James W

@JamesW " คีย์ส่วนตัวนั้นสามารถดึงจากด้านหน้าได้อย่างง่ายดาย " คีย์อะไร
curiousguy

28

ใช่. ข้อความทั้งหมดของเซสชัน HTTPS นั้นปลอดภัยด้วย SSL ซึ่งรวมถึงแบบสอบถามและส่วนหัว ในแง่นั้น POST และ GET จะเหมือนกันทุกประการ

สำหรับความปลอดภัยของวิธีการของคุณไม่มีวิธีพูดจริงโดยไม่มีการตรวจสอบที่เหมาะสม


27
มีความปลอดภัยมากกว่าการสื่อสารระหว่างเบราว์เซอร์และเซิร์ฟเวอร์
JoeBloggs

26

SSL เชื่อมต่อกับโฮสต์ก่อนดังนั้นชื่อโฮสต์และหมายเลขพอร์ตจะถูกถ่ายโอนเป็นข้อความธรรมดา เมื่อโฮสต์ตอบสนองและความท้าทายที่ประสบความสำเร็จลูกค้าจะเข้ารหัสคำขอ HTTP ด้วย URL จริง (คืออะไรหลังจากสแลชที่สาม) และส่งไปยังเซิร์ฟเวอร์

มีหลายวิธีในการทำลายความปลอดภัยนี้

เป็นไปได้ที่จะกำหนดค่าพร็อกซีเพื่อทำหน้าที่เป็น "คนที่อยู่ตรงกลาง" โดยทั่วไปเบราว์เซอร์จะส่งคำขอเชื่อมต่อกับเซิร์ฟเวอร์จริงไปยังพร็อกซี หากกำหนดค่าพร็อกซีด้วยวิธีนี้จะเชื่อมต่อผ่าน SSL กับเซิร์ฟเวอร์จริง แต่เบราว์เซอร์จะยังคงคุยกับพร็อกซี ดังนั้นหากผู้โจมตีสามารถเข้าถึงพร็อกซีได้เขาจะสามารถเห็นข้อมูลทั้งหมดที่ไหลผ่านพร็อกซีในรูปแบบข้อความที่ชัดเจน

คำขอของคุณจะปรากฏในประวัติเบราว์เซอร์ด้วย ผู้ใช้อาจถูกล่อลวงให้คั่นหน้าเว็บไซต์ ผู้ใช้บางคนมีการติดตั้งเครื่องมือทำบุ๊คมาร์คให้ตรงกันดังนั้นรหัสผ่านอาจสิ้นสุดที่ deli.ci.us หรือที่อื่น ๆ

ท้ายที่สุดบางคนอาจแฮ็คคอมพิวเตอร์ของคุณและติดตั้งเครื่องบันทึกแป้นพิมพ์หรือเครื่องขูดหน้าจอ (และไวรัสโทรจันประเภทอื่น ๆ ) เนื่องจากรหัสผ่านสามารถมองเห็นได้โดยตรงบนหน้าจอ (ตรงข้ามกับ "*" ในกล่องโต้ตอบรหัสผ่าน) นี่คือช่องโหว่ด้านความปลอดภัยอื่น

สรุป: เมื่อพูดถึงเรื่องความปลอดภัยต้องพึ่งพาเส้นทางที่ถูกตี มีมากเกินไปที่คุณไม่รู้ไม่คิดและจะทำลายคอของคุณ


3
"เบราว์เซอร์จะยังคงพูดคุยกับพร็อกซี" ไม่เป็นความจริง แต่จะต้องแสดงเบราว์เซอร์ที่มีใบรับรองที่ถูกต้องซึ่งพร็อกซีสามารถสร้างได้เฉพาะเมื่อมีการควบคุม CA ที่เบราว์เซอร์เชื่อถือ
ปีเตอร์


10

ผมไม่เห็นด้วยกับคำสั่งเกี่ยวกับ[ ... ] HTTP อ้างอิงการรั่วไหล (ภาพภายนอกในเพจเป้าหมายอาจรั่วไหลรหัสผ่าน)ในการตอบสนองของ Slough

HTTP 1.1 RFC ระบุอย่างชัดเจน :

ลูกค้าไม่ควรรวมเขตข้อมูลส่วนหัวของผู้อ้างอิงในคำขอ HTTP (ไม่ปลอดภัย) หากหน้าการอ้างอิงถูกถ่ายโอนด้วยโปรโตคอลที่ปลอดภัย

อย่างไรก็ตามบันทึกเซิร์ฟเวอร์และประวัติเบราว์เซอร์มีเหตุผลเพียงพอที่จะไม่นำข้อมูลที่สำคัญในสตริงการสืบค้น


2
มีคำว่า 'ควร' อีกครั้ง คุณจะเชื่อถือรหัสผ่านของคุณทุกเวอร์ชันด้วยเบราว์เซอร์หรือไม่
JoeBloggs

1
สิ่งนี้เกี่ยวข้องกับ GET กับ POST อย่างไร "ทุกเบราว์เซอร์ทุกเวอร์ชัน" จะปลอดภัยหรือไม่หากคุณใช้ POST ผ่าน HTTPS
Arnout

2
นอกจากนี้หน้าเว็บ HTTPS อาจจะมีการยึดภาพภายนอกผ่าน HTTPS - ในกรณีที่เบราว์เซอร์ควรจะรวมถึงส่วนหัวอ้างอิงและทำให้เปิดเผยรหัสผ่านของคุณ ...
ตัวยง

3
@Arnout: โปรดอ่าน RFC นี้ซึ่งจะบอกคุณว่าไม่ควรหมายความว่า: ietf.org/rfc/rfc2119.txt มันไม่เหมือนกับที่ต้องไม่ดังนั้นส่วนที่คุณอ้างไม่เกี่ยวข้องจริงๆและตัวแทนเบราว์เซอร์อาจยังรวมถึงผู้อ้างอิง เป็น HTTP
Andy

8

ใช่ตั้งแต่วินาทีที่คุณสร้างการเชื่อมต่อ HTTPS ทุกครั้งจะปลอดภัย สตริงการสืบค้น (GET) ตามที่ POST ถูกส่งผ่าน SSL


-4

คุณสามารถส่งรหัสผ่านเป็น MD5 hash param พร้อมเพิ่มเกลือบางส่วน เปรียบเทียบในฝั่งเซิร์ฟเวอร์สำหรับรับรองความถูกต้อง


11
MD5 ไม่ใช่ฟังก์ชันแฮชที่เหมาะสมสำหรับรหัสผ่าน
slawek

1
ไม่ว่าจะถูกแฮชหรือในข้อความธรรมดามันเป็นวิธีปฏิบัติที่ไม่ดีในการส่งรหัสผ่านภายในพารามิเตอร์ GET โปรดอ้างอิงคำตอบที่ได้รับการโหวตสูงสุดสำหรับคำอธิบาย Aaaand ... MD5 ไม่ควรใช้ที่ใดอีกต่อไป ...
โทมัส

" ฟังก์ชันแฮชไม่เหมาะสำหรับรหัสผ่าน " ยังดีกว่าการส่งรหัสผ่านใน cleartext ไปยังเซิร์ฟเวอร์ฮ่า ๆ
curiousguy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.