จะส่งรหัสผ่านอย่างปลอดภัยผ่าน HTTP ได้อย่างไร


115

หากในหน้าจอเข้าสู่ระบบผู้ใช้ส่งแบบฟอร์มพร้อมชื่อผู้ใช้และรหัสผ่านของเขารหัสผ่านจะถูกส่งเป็นข้อความธรรมดา (แม้จะมี POST ก็ตามโปรดแก้ไขฉันหากฉันผิด)

คำถามคือวิธีที่ถูกต้องในการปกป้องผู้ใช้และรหัสผ่านของเขาจากบุคคลที่สามที่อาจแอบดักฟังข้อมูลการสื่อสารคืออะไร?

ฉันทราบว่า HTTPS สามารถแก้ไขปัญหาได้ แต่มีวิธีใดบ้างที่จะทำให้มั่นใจได้ว่าอย่างน้อยระดับความปลอดภัยโดยใช้โปรโตคอล HTTP มาตรฐาน (คำขอ POST) (อาจใช้จาวาสคริปต์ไม่ทางใดก็ทางหนึ่ง)

แก้ไข ฉันอาจทิ้งสิ่งสำคัญบางอย่างไป

สิ่งที่ฉันเกี่ยวกับคือหน้านั่นคือหน้าเข้าสู่ระบบที่สร้างโดย PHP ซึ่งแน่นอนว่าส่งถึงผู้ใช้ในคำขอ HTTP GET เป็นไฟล์ HTML ไม่มีการเชื่อมต่อ (@Jeremy Powel) ระหว่างเซิร์ฟเวอร์และไคลเอนต์ดังนั้นฉันจึงไม่สามารถสร้างโปรโตคอลการจับมือดังกล่าวได้ และฉันต้องการให้กระบวนการทั้งหมดมีความโปร่งใสสำหรับผู้ใช้ - เขาต้องการส่งรหัสผ่านไม่ใช่จัดการกับการเข้ารหัส

ขอบคุณ


1
คุณอาจจะไม่สามารถทำได้หากไม่มีไคลเอนต์ที่ใช้การเข้ารหัส แต่ผู้ใช้ไม่จำเป็นต้องเห็นกระบวนการดังกล่าว เขาเพียงแค่ป้อนรหัสผ่านของเขาและรหัสที่ PHP ของคุณสร้างขึ้น (ตัวอย่างเช่นจาวาสคริปต์) จะจัดการทุกอย่างให้คุณ
Jeremy Powell

13
ปัญหาที่คุณอธิบายคือสาเหตุที่ HTTPS ถูกคิดค้นขึ้น หากคุณส่งความลับไปยังไคลเอนต์เพื่อเข้ารหัสรหัสผ่านผู้ดักฟังจะสามารถดมกลิ่นและถอดรหัสรหัสผ่านในการเดินทางกลับได้
jnoss

1
ดังนั้น S ในคำแนะนำของคุณอาจเป็นได้เพียงรหัสผ่าน (หรือชื่อผู้ใช้ + รหัสผ่านรวมกันไม่ว่าด้วยวิธีใดก็ตาม) เนื่องจากนี่เป็น "ความลับ" เดียวที่ผู้ใช้มี ฉันถูกไหม? ดังนั้นวิธีแก้ปัญหาจะเป็นดังนี้: - เซิร์ฟเวอร์จัดเตรียมเพจ HTML ที่มีฟิลด์ฟอร์มที่ซ่อนอยู่ R - ผู้ใช้ป้อนรหัสผ่านและก่อนที่จะส่งรหัสผ่านจาวาสคริปต์จะคำนวณ H (R, S) และส่งไปยังเซิร์ฟเวอร์ บางทีแม้กระทั่งโดยใช้ AJAX - เซิร์ฟเวอร์จะคำนวณ H (R, S) และเปรียบเทียบกับที่ได้รับและส่งการตอบกลับไปยังคำขอ ajax ว่าผ่านการรับรองความถูกต้องหรือไม่ - จาวาสคริปต์จะเปลี่ยนเส้นทางเบราว์เซอร์ไปยังหน้าเว็บที่ต้องการ
Kornelije Petak

2
@jeremy powell - แม้ว่าสิ่งที่คุณอธิบายจะเป็นแนวทางปฏิบัติทั่วไป แต่ก็ยังเสี่ยงต่อการที่คนกลางสามารถดมคุกกี้จากส่วนหัวและแอบอ้างเป็นผู้ใช้โดยการนำคุกกี้กลับมาใช้ใหม่ การโจมตีของคนที่อยู่ตรงกลางนั้นยากที่จะป้องกันได้เว้นแต่คุณจะใช้ HTTPS
jnoss

1
สำหรับใครก็ตามที่ได้รับคำถามนี้ในอนาคต: หลังจากเข้าสู่ระบบคุณจะต้องรักษาความปลอดภัยคุกกี้เซสชันด้วย (ดังนั้น: การใช้ HTTPS นั้นง่ายกว่ามาก)
Arjan

คำตอบ:


66

การใช้ HTTP กับ SSL จะทำให้ชีวิตของคุณง่ายขึ้นมากและคุณสามารถพักผ่อนได้อย่างสบายใจคนฉลาด (อย่างน้อยก็ฉลาดกว่าฉัน!) ได้กลั่นกรองวิธีการสื่อสารที่เป็นความลับนี้มาหลายปีแล้ว


14
... และ"แต่ต้องจ่ายค่าใบรับรอง SSL !!" ไม่ใช่การร้องเรียนที่ถูกต้องเนื่องจากคุณสามารถขอรับได้ในราคา $ 30 ในวันนี้ ข้อมูลของคุณไม่คุ้มกับเงิน 30 เหรียญในการปกป้องจริงหรือ?
caf

3
จะเกิดอะไรขึ้นหากเว็บโฮสต์ที่คุณสมัครไม่รองรับการเพิ่มใบรับรอง SSL
Calmarius

89
@Calmarius - จากนั้นคุณจะย้ายไปยังเว็บโฮสต์จริง
BornToCode

3
@BornToCode ในทางเทคนิคหมายความว่าคุณต้องมี IP เฉพาะและคุณต้องเป็นเจ้าของฮาร์ดแวร์เซิร์ฟเวอร์ (หรืออย่างน้อยก็ VPS) เพื่อใช้ HTTPS เว็บโฮสต์ที่ใช้ร่วมกันไม่สามารถทำ HTTPS ได้เว้นแต่เซิร์ฟเวอร์ทั้งหมดจะได้รับการปกป้องด้วยใบรับรองของเจ้าของโฮสต์
Calmarius

6
เว็บโฮสต์ที่ใช้ร่วมกันสามารถทำ https ได้อย่างแน่นอนโดยใช้en.wikipedia.org/wiki/Server_Name_Indication
Brian Minton

39

การตรวจสอบความปลอดภัยเป็นหัวข้อกว้าง ๆ โดยสรุปตามที่ @ jeremy-powell กล่าวไว้มักชอบส่งข้อมูลรับรองผ่าน HTTPS แทน HTTP จะทำให้ปวดหัวที่เกี่ยวข้องกับความปลอดภัยไปมาก

ใบรับรอง TSL / SSL ค่อนข้างถูกในทุกวันนี้ ในความเป็นจริงหากคุณไม่ต้องการเสียเงินเลยมีให้บริการฟรีallowencrypt.org - ผู้ออกใบรับรองอัตโนมัติ

คุณสามารถก้าวไปอีกขั้นและใช้caddyserver.comซึ่งเรียกใช้ allowencrypt อยู่เบื้องหลัง

ตอนนี้เมื่อเราได้ HTTPS แล้ว ...

คุณไม่ควรส่งข้อมูลเข้าสู่ระบบและรหัสผ่านผ่านพารามิเตอร์ POST payload หรือ GET ใช้ส่วนหัวการอนุญาต (โครงร่างการพิสูจน์ตัวตนการเข้าถึงพื้นฐาน) แทนซึ่งสร้างขึ้นดังนี้:

  • ชื่อผู้ใช้และรหัสผ่านจะรวมกันเป็นสตริงโดยคั่นด้วยเครื่องหมายจุดคู่เช่นชื่อผู้ใช้: รหัสผ่าน
  • สตริงผลลัพธ์ถูกเข้ารหัสโดยใช้ตัวแปร RFC2045-MIME ของ Base64 ยกเว้นไม่ จำกัด ที่ 76 อักขระ / บรรทัด
  • วิธีการอนุญาตและช่องว่างเช่น "พื้นฐาน" จะถูกใส่ก่อนสตริงที่เข้ารหัส

แหล่งที่มา: Wikipedia: ส่วนหัวการอนุญาต

อาจดูเหมือนซับซ้อนเล็กน้อย แต่ก็ไม่ใช่ มีห้องสมุดดีๆมากมายที่จะมอบฟังก์ชันนี้ให้คุณได้ทันที

มีเหตุผลที่ดีสองสามประการที่คุณควรใช้ส่วนหัวการอนุญาต

  1. มันเป็นมาตรฐาน
  2. ง่ายมาก (หลังจากเรียนรู้วิธีใช้แล้ว)
  3. จะช่วยให้คุณสามารถเข้าสู่ระบบที่ระดับ URL ได้ดังนี้: https://user:password@your.domain.com/login(เช่น Chrome จะแปลงเป็นAuthorizationส่วนหัวโดยอัตโนมัติ)

สิ่งสำคัญ:
ตามที่ @zaph ระบุไว้ในความคิดเห็นของเขาด้านล่างการส่งข้อมูลที่ละเอียดอ่อนเนื่องจากข้อความค้นหา GET ไม่ใช่ความคิดที่ดีเนื่องจากมักจะลงเอยในบันทึกของเซิร์ฟเวอร์

ใส่คำอธิบายภาพที่นี่


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

อ่า ... ไม่เลย ภาพหน้าจอที่คุณเห็นได้รับการแก้ไขเพื่อแสดงสิ่งที่เกิดขึ้นในเบราว์เซอร์ เมื่อคุณกด Enter browser จะแปลง url ของคุณสร้างAuthorizationส่วนหัว เพียงแค่ให้มันไป ท่อนไม้จะเตือนความสะอาด และแน่นอนว่าหากคุณทำการโทรจากเซิร์ฟเวอร์ (หากเป็นสถานการณ์ที่คุณกังวล) คุณควรสร้างส่วนหัวโดยทางโปรแกรมแน่นอน
FullStackForger

คุณไม่สามารถบันทึกสิ่งที่คุณมองไม่เห็น username:password@urlจากเบราว์เซอร์แปลเป็น: url+ Authorizationส่วนหัวของคำขอ สำหรับการสืบค้น GET ... อย่างที่บอกใช้ Authroziation header จะดีกว่า.
FullStackForger

2
คุณไม่ได้กล่าวถึงประเด็นของคำถาม: การปกป้องข้อมูลที่ละเอียดอ่อนจากการดักฟังจากคนตรงกลาง จุดเน้นคือไม่ค้นหาทางเลือกอื่นและ / หรือวิธีที่เป็นมาตรฐานมากกว่าในการส่งข้อมูลรับรอง แต่ปกป้องพวกเขาผ่านช่องทางที่ไม่ปลอดภัย
Lord of the Goo

3
ควรเน้นว่าโซลูชันนี้ใช้ได้เฉพาะเมื่อคุณเข้ารหัสการเชื่อมต่อกับ TLS / SSL อยู่แล้ว base64 ไม่ใช่การเข้ารหัส
สก็อต

14

คุณสามารถใช้แผนการตอบสนองความท้าทาย สมมติว่าทั้งไคลเอนต์และเซิร์ฟเวอร์รู้ความลับ S จากนั้นเซิร์ฟเวอร์จะมั่นใจได้ว่าไคลเอนต์รู้รหัสผ่าน (โดยไม่ต้องให้รหัสผ่าน) โดย:

  1. เซิร์ฟเวอร์ส่งตัวเลขสุ่ม R ไปยังไคลเอนต์
  2. ไคลเอนต์ส่ง H (R, S) กลับไปที่เซิร์ฟเวอร์ (โดยที่ H คือฟังก์ชันแฮชการเข้ารหัสเช่น SHA-256)
  3. เซิร์ฟเวอร์คำนวณ H (R, S) และเปรียบเทียบกับการตอบสนองของลูกค้า หากตรงกันเซิร์ฟเวอร์จะรู้ว่าไคลเอนต์รู้รหัสผ่าน

แก้ไข:

มีปัญหาที่นี่เกี่ยวกับความใหม่ของ R และความจริงที่ว่า HTTP ไม่มีสถานะ นี้สามารถจัดการได้โดยมีเซิร์ฟเวอร์สร้างความลับเรียกว่า Q ที่เพียงเซิร์ฟเวอร์รู้ จากนั้นโปรโตคอลจะเป็นดังนี้:

  1. เซิร์ฟเวอร์สร้างหมายเลขสุ่ม R จากนั้นส่งไปยังไคลเอนต์ H (R, Q) (ซึ่งไคลเอนต์ไม่สามารถปลอมแปลงได้)
  2. ไคลเอนต์ส่ง R, H (R, Q) และคำนวณ H (R, S) และส่งทั้งหมดกลับไปที่เซิร์ฟเวอร์ (โดยที่ H คือฟังก์ชันแฮชการเข้ารหัสเช่น SHA-256)
  3. เซิร์ฟเวอร์คำนวณ H (R, S) และเปรียบเทียบกับการตอบสนองของลูกค้า จากนั้นใช้เวลา R และคำนวณ (อีกครั้ง) H (R, Q) หากเวอร์ชันของไคลเอ็นต์ H (R, Q) และ H (R, S) ตรงกับการคำนวณซ้ำของเซิร์ฟเวอร์เซิร์ฟเวอร์จะถือว่าไคลเอ็นต์ได้รับการรับรองความถูกต้อง

โปรดทราบเนื่องจากไคลเอนต์ไม่สามารถปลอมแปลง H (R, Q) ได้ H (R, Q) จึงทำหน้าที่เป็นคุกกี้ (ดังนั้นจึงสามารถนำไปใช้เป็นคุกกี้ได้)

การแก้ไขอื่น:

การแก้ไขโปรโตคอลก่อนหน้านี้ไม่ถูกต้องเนื่องจากทุกคนที่สังเกตเห็น H (R, Q) ดูเหมือนว่าจะสามารถเล่นซ้ำได้ด้วยแฮชที่ถูกต้อง เซิร์ฟเวอร์ต้องจำว่า R ตัวไหนไม่สดอีกต่อไป ฉันกำลังตอบรับคำตอบนี้เพื่อให้พวกคุณสามารถแก้ไขได้และหาสิ่งที่ดีออกมา


+1 - คุณจะต้องคำนวณการตอบสนองในฝั่งไคลเอ็นต์ด้วย javascript (หรือ Flash / Silverlight / ฯลฯ )
orip

10
ไม่หยุดยั้งคนที่อยู่ตรงกลางหรือโจมตีด้วยการแอบอ้างบุคคลอื่น เช่นผ่าน wifi. ดูเหมือนว่านี่จะทำให้เกิดความรู้สึกปลอดภัยที่ผิดพลาด IMO
Tom Hawtin - แท็กไลน์

2
ที่ป้องกันการโจมตีแบบแฝง แต่ Man in the Middle ยังสามารถโจมตีได้
Douglas Leeder

7
นอกจากนี้ยังต้องให้เซิร์ฟเวอร์ทราบรหัสผ่านเดิม
Douglas Leeder

3
อย่าคิดค้น crypto ใหม่! (ในการผลิต)
bryanph

11

หากเว็บโฮสต์ของคุณอนุญาตหรือคุณจะต้องจัดการกับข้อมูลที่ละเอียดอ่อนให้ใช้ HTTPS เป็นช่วงเวลา (มักจะกำหนดโดยกฎหมาย afaik)

มิฉะนั้นหากคุณต้องการทำบางอย่างผ่าน HTTP ฉันจะทำอะไรแบบนี้

  1. เซิร์ฟเวอร์ฝังคีย์สาธารณะไว้ในหน้าเข้าสู่ระบบ
  2. ลูกค้ากรอกแบบฟอร์มการเข้าสู่ระบบและคลิกส่ง
  3. คำขอ AJAX ได้รับการประทับเวลาปัจจุบันจากเซิร์ฟเวอร์
  4. สคริปต์ฝั่งไคลเอ็นต์เชื่อมต่อข้อมูลประจำตัวการประทับเวลาและเกลือ (แฮชจากข้อมูลอะนาล็อกเช่นการเคลื่อนไหวของเมาส์เหตุการณ์การกดแป้น) เข้ารหัสโดยใช้คีย์สาธารณะ
  5. ส่งแฮชที่เป็นผลลัพธ์
  6. เซิร์ฟเวอร์ถอดรหัสแฮช
  7. ตรวจสอบว่าการประทับเวลาล่าสุดเพียงพอหรือไม่ (อนุญาตให้ใช้หน้าต่างสั้น ๆ 5-10 วินาทีเท่านั้น) ปฏิเสธการเข้าสู่ระบบหากการประทับเวลาเก่าเกินไป
  8. เก็บแฮชเป็นเวลา 20 วินาที ปฏิเสธแฮชเดียวกันสำหรับการล็อกอินในช่วงเวลานี้
  9. พิสูจน์ตัวตนผู้ใช้

ดังนั้นวิธีนี้จึงป้องกันรหัสผ่านและแฮชการตรวจสอบสิทธิ์เดียวกันไม่สามารถเล่นซ้ำได้

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

  1. เซิร์ฟเวอร์ตั้งค่าคุกกี้เซสชันพิเศษซึ่งประกอบด้วยสตริงแบบสุ่ม
  2. เบราว์เซอร์จะส่งคุกกี้นี้กลับในคำขอถัดไป
  3. เซิร์ฟเวอร์จะตรวจสอบค่าในคุกกี้หากแตกต่างกันแสดงว่ามันทำลายเซสชันมิฉะนั้นทั้งหมดก็ไม่เป็นไร
  4. เซิร์ฟเวอร์ตั้งค่าคุกกี้อีกครั้งด้วยข้อความที่แตกต่างกัน

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

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

เกี่ยวกับการใช้งาน: RSA น่าจะเป็นอัลกอริทึมที่รู้จักกันมากที่สุด แต่ค่อนข้างช้าสำหรับคีย์แบบยาว ฉันไม่รู้ว่าการติดตั้ง PHP หรือ Javascript จะเร็วแค่ไหน แต่อาจมีอัลกอริทึมที่เร็วกว่า


ในกรณีนี้รหัสผ่านได้รับการป้องกันจริงหรือ? ไม่มีใครสามารถดักจับสิ่งที่ส่งและถอดรหัสโดยใช้คีย์สาธารณะแล้วอัปเดตการประทับเวลาเมื่อใช้ในภายหลังได้หรือไม่ ฉันพลาดอะไรไปรึเปล่า?
michaellindahl

@michaellindahl การเข้ารหัสแบบไม่สมมาตรหมายความว่าสามารถใช้เฉพาะคีย์ส่วนตัวซึ่งไม่เคยออกจากเซิร์ฟเวอร์เพื่อถอดรหัสสิ่งต่างๆ คีย์สาธารณะสามารถใช้ในการเข้ารหัสเท่านั้น
Dan Pantry

2
คอมพิวเตอร์ระหว่างเบราว์เซอร์และเซิร์ฟเวอร์สามารถเปลี่ยนคีย์สาธารณะในหน้าเข้าสู่ระบบ
Antti

ขอบคุณสำหรับการแบ่งปันวิธีการของคุณฉันพบว่าทุกอย่างน่าสนใจมาก การประทับเวลาที่เพิ่มในการส่งหนังสือรับรองเป็นสิ่งที่ดี! คำถามหนึ่งเกี่ยวกับการใช้คุกกี้เซสชันพิเศษที่มีค่าเป็นสตริงสุ่ม: เป็นเหมือนโทเค็นสำหรับคำขอถัดไปเท่านั้นหรือไม่?
วิคเตอร์

4

ฉันจะใช้ระบบแลกเปลี่ยนคีย์ Diffie-Hellman ฝั่งเซิร์ฟเวอร์และฝั่งไคลเอ็นต์กับ AJAX หรือการส่งแบบฟอร์มหลายรายการ (ฉันแนะนำแบบเดิม) แม้ว่าฉันจะไม่เห็นการใช้งานที่ดีบนอินเทอร์เน็ต โปรดจำไว้ว่าไลบรารี JS สามารถเสียหายหรือเปลี่ยนแปลงได้โดย MITM พื้นที่เก็บข้อมูลในเครื่องสามารถใช้เพื่อช่วยต่อสู้กับปัญหานี้ได้ในระดับหนึ่ง


4

คุณสามารถใช้SRPเพื่อใช้รหัสผ่านที่ปลอดภัยผ่านช่องทางที่ไม่ปลอดภัย ข้อดีคือแม้ว่าผู้โจมตีจะดักฟังการรับส่งข้อมูลหรือโจมตีเซิร์ฟเวอร์ แต่ก็ไม่สามารถใช้รหัสผ่านบนเซิร์ฟเวอร์อื่นได้ https://github.com/alax/jsrpเป็นไลบรารี javascript ที่รองรับรหัสผ่านที่ปลอดภัยผ่าน HTTP ในเบราว์เซอร์หรือฝั่งเซิร์ฟเวอร์ (ผ่านโหนด)


1

HTTPS มีประสิทธิภาพมากเนื่องจากใช้การเข้ารหัสแบบไม่สมมาตร การเข้ารหัสประเภทนี้ไม่เพียง แต่ให้คุณสร้างอุโมงค์เข้ารหัส แต่คุณสามารถยืนยันได้ว่าคุณกำลังคุยกับคนที่ใช่ไม่ใช่แฮกเกอร์

นี่คือซอร์สโค้ด Java ซึ่งใช้ RSA การเข้ารหัสแบบอสมมาตร (ใช้โดย PGP) ในการสื่อสาร: http://www.hushmail.com/services/downloads/


0

คุณสามารถใช้ ssl สำหรับโฮสต์ของคุณได้มีโครงการฟรีสำหรับ ssl เช่น allowencrypt https://letsencrypt.org/


2
ตรวจสอบประโยคที่สามในคำถาม (นอกจากนี้โปรดอ่านคำตอบอื่น ๆ เสมอเพื่อให้แน่ใจว่าคุณไม่ได้เพิ่มรายละเอียดที่ซ้ำกันน้อยลง)
Nathan Tuggy

0

การใช้ https เสียงเป็นตัวเลือกที่ดีที่สุดที่นี่ (ใบรับรองไม่แพงขนาดนี้) อย่างไรก็ตามหาก http เป็นข้อกำหนดคุณอาจใช้การเข้ารหัสบางส่วน - เข้ารหัสที่ฝั่งเซิร์ฟเวอร์และถอดรหัสในเบราว์เซอร์ของผู้ใช้ (ส่งคีย์แยกต่างหาก)

เราได้ใช้สิ่งนั้นในขณะที่ใช้safevia.net - การเข้ารหัสจะทำบนฝั่งไคลเอนต์ (ผู้ส่ง / ผู้รับ) ดังนั้นข้อมูลผู้ใช้จึงไม่มีอยู่ในเครือข่ายหรือเลเยอร์เซิร์ฟเวอร์

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