เครื่องหมายทวิภาค `:` ปลอดภัยสำหรับการใช้ URL ที่จำง่ายหรือไม่?


109

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

http://site/gwturl#section1/section2

บางส่วนอาจต้องการแอตทริบิวต์เพิ่มเติมซึ่งเราต้องการระบุด้วย a :เพื่อให้ส่วนของ URL ไม่คลุมเครือ รหัสจะแยกออกก่อน/จากนั้นจึงเปิด:ดังนี้:

http://site/gwturl#user:45/comments

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

http://site/gwturl#user%3A45/comments <--- BAD

การใช้โคลอนด้วยวิธีนี้ปลอดภัยหรือไม่ (ซึ่งฉันหมายถึงจะไม่ถูกเข้ารหัสโดยอัตโนมัติ) สำหรับเบราว์เซอร์ระบบบุ๊กมาร์กแม้แต่โค้ด Javascript หรือ Java


อาจเป็นความคิดที่ดีที่จะระบุ (ให้ชัดเจนยิ่งขึ้น) ว่าคุณใช้ URL ที่ฝั่งไคลเอ็นต์เท่านั้น เนื่องจากคำตอบจำนวนมาก (เช่นเดียวกับของฉัน) ดูเหมือนว่าคุณจะส่ง URL ไปยังเซิร์ฟเวอร์โดยใช้ HTTP
Veger

แก้ไขเพื่อเพิ่มคำชี้แจงว่าการใช้แฟรกเมนต์เกิดขึ้นในฝั่งไคลเอ็นต์
Nicole

ฉันอยากรู้: หลังจาก 10 เดือนรูปแบบ URL นี้ได้ผลสำหรับคุณหรือไม่? ฉันกำลังพิจารณาใช้โครงการเดียวกัน
Jonathan Swinney

1
@ โจนาธานสวินนีย์น่าเสียดายที่ฉันได้ย้ายจากโครงการนี้ (และ บริษัท ) แม้ว่าคำตอบที่นี่ทำให้ฉันพอใจว่ามันคือหนทางที่จะไป ถ้าฉันจะเริ่มโปรเจ็กต์ใหม่ฉันจะใช้โครงร่างนี้ แต่ฉันก็ต้องแน่ใจว่าจะใช้#!เพื่อระบุว่าเพจนั้นเป็นสถานะ - ดูgooglewebmastercentral.blogspot.com/2009/10/… (ข้อเสนอนี้เป็นไปตาม โดยผู้ใช้ AJAX จำนวนมากเช่น Facebook)
Nicole

ฉันเพิ่งพบว่า WhatsApp จะตัด URL บนเครื่องหมายจุดคู่แรกดังนั้นตัวอย่างเช่นมันทำให้ URL ของ Google Maps ไม่มีประโยชน์ ใช่แล้วสิ่งสำคัญคือต้องหนี
Petruza

คำตอบ:


84

ฉันเพิ่งเขียนตัวเข้ารหัส URL ดังนั้นสิ่งนี้จึงค่อนข้างสดใหม่ในความคิดของฉัน

http://site/gwturl#user:45/comments

อักขระทั้งหมดในส่วนแฟรกเมนต์ ( user:45/comments) ถูกต้องตามกฎหมายสำหรับRFC 3986 URI

ส่วนที่เกี่ยวข้องของABNF :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

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


แก้ไข:

โธ่!

แม้จะมีการยืนยันของฉันเกี่ยวกับข้อมูลจำเพาะ URI, irreputableให้คำตอบที่ถูกต้องเมื่อเขาชี้ให้เห็นว่าองค์ประกอบ HTML 4 ชื่อสเปคที่

หมายเหตุว่ากฎระบุจะมีการเปลี่ยนแปลงใน HTML 5 จะยังคงมีข้อ จำกัด URI (ในขณะที่เขียนมีปัญหาที่ยังไม่ได้รับการแก้ไขเกี่ยวกับการใช้ URI ของ HTML 5)


ฉันคิดว่าคุณกำลังทำอะไรบางอย่างอยู่คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม การไม่ส่งสิ่งนี้ไปยังเซิร์ฟเวอร์ไม่ใช่ปัญหาเนื่องจากเราใช้ GWT ฉันไม่แน่ใจว่าฉันเข้าใจไวยากรณ์ที่ระบุในส่วนที่คุณยกมา
Nicole

แต่:เป็น gen-delim ไม่ใช่ sub-delim
Bobince

1
เซมิโคลอนเป็นสิ่งที่ถูกกฎหมายสำหรับ pchar ดังนั้นไม่ว่าจะอยู่ใน sub-delim หรือ gen-delim ก็ไม่ใช่ปัญหา
Veger

@bobince - :อยู่ในpcharซึ่งอยู่ในfragmentจึง:ได้รับอนุญาต @Renesis - วิกิพีเดียมีบทความเกี่ยวกับ ABNF en.wikipedia.org/wiki/ABNFคุณมีพื้นมองไปที่รายชื่อของตัวละครที่ได้รับอนุญาตซึ่งเป็น/วิธีการหรือ ฉันยังไม่ได้เขียนโปรแกรม GWT เลยไม่รู้ว่ามันใช้ส่วนย่อยของ URI อย่างไร
McDowell

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

59

นอกเหนือจากการวิเคราะห์ของ McDowell เกี่ยวกับมาตรฐาน URI แล้วโปรดจำไว้ด้วยว่าส่วนย่อยต้องเป็นชื่อ anchor HTML ที่ถูกต้อง อ้างอิงจากhttp://www.w3.org/TR/html4/types.html#type-name

โทเค็น ID และ NAME ต้องขึ้นต้นด้วยตัวอักษร ([A-Za-z]) และอาจตามด้วยตัวอักษรตัวเลข ([0-9]) ขีดกลาง ("-") ขีดล่าง ("_") , เครื่องหมายทวิภาค (":") และจุด (".")

ดังนั้นคุณโชคดี ":" ได้รับอนุญาตอย่างชัดเจน และไม่มีใครควร "%" - หลีกเลี่ยงไม่เพียงเพราะ "%" เป็น char ที่ผิดกฎหมายเท่านั้น แต่ยังเป็นเพราะส่วนย่อยต้องตรงกับชื่อ anchor char-by-char ดังนั้นจึงไม่ควรมีตัวแทนพยายามที่จะยุ่งเกี่ยวกับพวกเขาในทางใดทางหนึ่ง

อย่างไรก็ตามคุณต้องทดสอบ ไม่ปฏิบัติตามมาตรฐานเว็บอย่างเคร่งครัดบางครั้งมาตรฐานอาจขัดแย้งกัน ตัวอย่างเช่น HTTP / 1.1 RFC 2616 ไม่อนุญาตให้ใช้สตริงการสืบค้นใน URL คำขอในขณะที่ HTML สร้างขึ้นเมื่อส่งแบบฟอร์มด้วยเมธอด GET สิ่งใดก็ตามที่ดำเนินการในโลกแห่งความเป็นจริงจะชนะในตอนท้ายของวัน


58

มีเดียวิกิและเอ็นจินวิกิอื่น ๆ ใช้โคลอนใน URL เพื่อกำหนดเนมสเปซโดยไม่มีปัญหาสำคัญ

เช่นhttp://en.wikipedia.org/wiki/Template:Welcome


31
คำตอบที่ตรงประเด็นที่สุด เราทุกคนรู้ดีว่าสิ่งที่อยู่ในข้อกำหนดมีส่วนเกี่ยวข้องกับความเป็นจริงในการพัฒนาเว็บเพียงเล็กน้อย คุณจะไม่ได้รับการรับประกันเรื่อง "ความปลอดภัย" ที่ดีไปกว่า "เว็บไซต์ 10 อันดับแรกของโลก"
สตีเวนคอลลินส์

1
@StevenCollins ไม่เกี่ยวข้องมากไปกว่าคำตอบที่ให้ไว้ 3 ปีก่อนหน้านี้ซึ่งระบุว่าเหมือนกันทุกประการ :)
Martin James

7

ฉันจะไม่นับมัน มีแนวโน้มว่าจะได้รับการเข้ารหัส URL %3Aโดยตัวแทนผู้ใช้จำนวนมาก


1
@arbales: ใช่ User-agent ที่เข้ากันได้น้อยบางตัวจะปล่อยให้ URL ที่ไม่เป็นไปตามข้อกำหนดไม่มีการตกแต่ง
Asaph

4

จากURLEncoderjavadoc:

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเข้ารหัสรูปแบบ HTML, ให้คำปรึกษาแบบ HTML เปค

เมื่อเข้ารหัสสตริงจะใช้กฎต่อไปนี้:

  • อักขระที่เป็นตัวเลขและตัวอักษร "a" ถึง "z", "A" ถึง "Z" และ "0" ถึง "9" จะยังคงเหมือนเดิม
  • อักขระพิเศษ ".", "-", "*" และ "_" ยังคงเหมือนเดิม
  • อักขระเว้นวรรค "" จะถูกแปลงเป็นเครื่องหมายบวก "+"
  • อักขระอื่น ๆ ทั้งหมดไม่ปลอดภัยและก่อนอื่นจะถูกแปลงเป็นไบต์อย่างน้อยหนึ่งไบต์โดยใช้รูปแบบการเข้ารหัสบางอย่าง จากนั้นแต่ละไบต์จะแสดงด้วยสตริง 3 อักขระ "% xy" โดยที่ xy คือการแสดงเลขฐานสิบหกสองหลักของไบต์ รูปแบบการเข้ารหัสที่แนะนำให้ใช้คือ UTF-8 อย่างไรก็ตามด้วยเหตุผลด้านความเข้ากันได้หากไม่ได้ระบุการเข้ารหัสระบบจะใช้การเข้ารหัสเริ่มต้นของแพลตฟอร์ม

นั่นคือ:ไม่ปลอดภัย


3

ฉันไม่เห็น Firefox หรือ IE8 เข้ารหัสURLของ Wikipedia บางตัวที่มีอักขระ


1
Opera ยังเก็บเซมิโคลอนไว้ด้วย แต่การนับพฤติกรรมดังกล่าวไม่ใช่สิ่งที่ควรทำ
Veger

1
Renesis กำลังพูดถึงส่วนของ URL ไม่ใช่เส้นทาง URL
Gumbo

Wikipedia เป็นหนึ่งในความคิดของฉันเมื่อเขียนคำถามนี้ การใช้โคลอนในทางเทคนิคนั้นไม่ถูกต้อง / ไม่ปลอดภัยหรือไม่? ฉันมักจะเห็น (และ) ใน URL ของ Wikipedia ที่เข้ารหัส แต่ไม่เคยมีเครื่องหมายจุดคู่ซึ่งทำให้ฉันสับสนเล็กน้อย
Nicole

3
Wayback Machine มี: ในลิงก์ต่างๆเช่นweb.archive.org/web/20080822150704/http://stackoverflow.com
barrowc

2

โคลอนถูกใช้เป็นตัวแบ่งระหว่างชื่อผู้ใช้และรหัสผ่านหากโปรโตคอลต้องการการตรวจสอบสิทธิ์


0

ลำไส้ใหญ่ไม่ปลอดภัย ดูที่นี่


หน้านั้นไม่ได้จูงใจว่าทำไมจึงไม่ปลอดภัย RFC2396 ที่อ้างถึงไม่ได้บอกว่าควรหลีกเลี่ยงเช่นกัน นอกจากนี้สคริปต์ตัวแปลงที่ให้มาจะไม่เข้ารหัส (ใน Chrome 9 ต่อไป)
Adam Lindberg

อดัมคุณไม่ถูกต้อง มันระบุโดยตรงว่าอะไรและทำไม
ktamlyn

-5

ไม่ใช่อักขระที่ปลอดภัยและใช้เพื่อแยกแยะว่าพอร์ตใดที่คุณเชื่อมต่อเมื่ออยู่หลังชื่อโดเมนของคุณ

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