จะเกิดอะไรขึ้นเมื่อฉันวางเมาส์เหนือลิงก์ใน Chrome


40

เมื่อคลิกที่ลิงค์นี้ ( http://a//%%30%30) ใน Google Chrome Chrome จะหยุดและปิดแท็บและอินสแตนซ์ทั้งหมด

แต่ในบางกรณีฉันต้องเลื่อนไปที่ลิงก์และแท็บหยุดทำงาน

จะเกิดอะไรขึ้นเมื่อฉันวางเมาส์เหนือลิงก์นี้ ฉันหมายถึงว่า Chrome จะทำอย่างไรเมื่อมีลิงก์วางอยู่เหนือ


12
นี่เป็นโอกาสอันดีที่สกอตต์ทอมวิดีโอที่พูดคุยเกี่ยวกับสิ่งที่เขาคิดที่เกิดขึ้นในโครเมี่ยมyoutube.com/watch?v=0fw5Cyh21TE
DLeh

5
ข้อผิดพลาดนี้ได้รับการแก้ไขในChrome 45.0.2454.101 มันก็ยังคงอยู่ในChrome 45.0.2454.99
Deltik

ข้อผิดพลาดไม่ได้รับการแก้ไขใน Chrome 45.0.2454.101 (อย่างน้อยใน Mac OS 10.10.5 Chrome ยังคงทำงานล้มเหลว)
คณิตศาสตร์

คำตอบ:


42

ความผิดพลาดที่เกิดจากการข้อผิดพลาดที่เพิ่งค้นพบในChrome - และอื่น ๆWebKit เบราว์เซอร์ * - เฉพาะที่เกี่ยวข้องกับอย่างใดอย่างหนึ่ง (!) %%30%30, %0%30หรือ%%300เป็นส่วนหนึ่งของ URL ซึ่งภายในสิ้นทั้งหมดขึ้นเป็นตัวแทนของสัญลักษณ์เดียวกัน: null คุณสามารถอ่านเพิ่มเติมเกี่ยวกับข้อผิดพลาดที่นี่

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

หมายเหตุ:
* เบราว์เซอร์ WebKitอื่น ๆได้แก่ Safari, Opera, Steam Browser, Midori, S60 (Symbian), เบราว์เซอร์ Blackberry และเบราว์เซอร์ของ Playstation 3 - แต่ไม่ใช่ Firefox, Internet Explorer หรือ Edge

แก้ไข: ข้อผิดพลาดนี้ได้รับการแก้ไขในChrome 45.0.2454.101ตามที่Deltikชี้ให้เห็น

เพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้น

ปัญหาเกี่ยวข้องกับURL canonicalizerซึ่งจะทำงานทันทีที่คุณโฮเวอร์เหนือลิงก์ - อาจเป็นเพราะการแสดงลิงค์ในแถบสถานะของเบราว์เซอร์และสำหรับการดึงหน้าเว็บล่วงหน้าเพื่อให้โหลดได้เร็วขึ้นเมื่อคลิก

สำหรับบทบาทของ canonicalizer URL:
เมื่อมีการเขียน URL HTMLอาจมีการเขียนในรูปแบบเช่น/homeหรือ../../homeแต่เบราว์เซอร์จำเป็นต้องแปล URL นี้เป็นสิ่งที่มีโปรโตคอลและโดเมนเช่นhttp://superuser.com/homeกัน นอกจาก URL อาจประกอบด้วยURL Escapesที่จำเป็นต้องได้รับการแปลและเหล่านี้หนีเป็นร้อยละเข้ารหัส%%30%30เช่น (รายการ URL ที่ละเอียดยิ่งขึ้นหนีออกมาที่นี่ )
ฟังก์ชั่นที่ใช้จัดการการแปล URLนี้ คือสิ่งที่เกิดความล้มเหลวเนื่องจากได้รับข้อมูลจากผู้พัฒนาที่ไม่ได้คาดหวัง / จัดการ

นี่คือบทสรุปของการเปลี่ยนรหัสที่แก้ไขปัญหา:

จัดการกับการหลบหลีกซ้อนที่มีปัญหาในพา ธ URL อย่างถูกต้อง

โดยเฉพาะถ้าการไม่ใช้ Escape ในอินพุตจะนำไปสู่ ​​URL เอาต์พุตที่มีลำดับ Escape ใหม่เช่นการแปลงอินพุต "%% 30% 30" เป็น "% 00" ให้หลีกเลี่ยงการนำหน้า '%' เป็น "% 25" เพื่อให้แน่ใจว่าผลลัพธ์ ลำดับจะไม่ถือว่าเป็นลำดับการหลบหนีที่ถูกต้องใหม่

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


3
เพื่อความชัดเจนไม่มีปัญหากับ FireFox หรือ IE 11
เดฟ

6
การพิจารณา Opera จะขึ้นอยู่กับเอนจิ้นของ Chrome ที่ไม่ได้ทำให้ตกใจว่ามันล้มเหลว ซึ่งเป็นเหตุผลที่มีเอนจิ้นการแสดงผลหลายอันเป็นสิ่งที่ดี
Ramhound

8
แต่ทำไมมันเกิดขึ้นบนเลื่อน ? ฉันหมายถึงเมื่อฉันวางลิงก์ไว้ไม่มีการค้นหาดังนั้นทำไมจึงขัดข้อง
LINQ

4
ยังไม่ชัดเจนว่าอะไรเป็นสาเหตุของข้อผิดพลาด แต่บางคนคิดว่ามันเกี่ยวข้องกับสิ่งURL canonicalizerที่เห็นได้ชัดว่าเริ่มทำงานทันทีที่คุณวางเมาส์เหนือลิงก์อาจแสดงลิงก์ในแถบสถานะของเบราว์เซอร์ ฉันไม่สามารถให้คำตอบบางอย่างแก่คุณได้อย่างไรก็ตามเมื่อมีการเขียน URL ในรูปแบบ HTML มันอาจถูกเขียนในรูปแบบเช่น/homeหรือ../../homeแต่เบราว์เซอร์จำเป็นต้องแปล URL นี้เป็นสิ่งที่มีโปรโตคอลและโดเมนเช่นhttp://superuser.com/homeกัน บางทีฟังก์ชั่นการจัดการที่เป็นสิ่งที่เกิดความล้มเหลวเพราะได้รับอินพุตที่ไม่คาดคิด?
miyalys

15
@ JéfersonBuenoเมื่อคุณวางเมาส์เหนือลิงก์ Chrome จะแสดงที่มุมซ้ายล่าง ต้องใช้การประมวลผลบางอย่างรวมถึง "การแปล" ของอักขระที่เข้ารหัสพิเศษ การประมวลผลนี้เป็นข้อผิดพลาดและทำให้โปรแกรมทั้งหมดขัดข้อง
Fabio พูดว่า Reinstate Monica

11

ดังที่ฟาบิโอทูราติพูด

เมื่อคุณวางเมาส์เหนือลิงก์ Chrome จะแสดงที่มุมซ้ายล่าง ต้องใช้การประมวลผลบางอย่างรวมถึง "การแปล" ของอักขระที่เข้ารหัสพิเศษ

อย่างไรก็ตามจากการโพสต์และความคิดเห็นของคุณฉันคิดว่าคุณมีความกังวลมากขึ้นเกี่ยวกับว่า Chrome เชื่อมต่อกับลิงก์ในพื้นหลังหรือไม่ มันไม่เพื่อทำเบราว์เซอร์ที่ทันสมัยอื่น ๆ ( Firefox , Opera ) คุณอาจต้องการปิดใช้งานการดึงข้อมูลล่วงหน้าในการตั้งค่าของ Chrome หรือติดตั้งuBlock Originเพื่อรับการตั้งค่าความเป็นส่วนตัวมากขึ้น


6

ฉันต้องการชี้แจงเพิ่มเติมเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่

โดยพื้นฐานแล้ว% 30 เป็น URL ที่เข้ารหัส 0 และ% 00 เป็น NULL ที่เข้ารหัส URL (ซึ่งแสดงเป็นไบนารีเป็น 0000 0000) ดังนั้นหากคุณมี URL ที่มีอักขระเข้ารหัสแบบซ้อนที่จะถอดรหัสเป็น NULL ข้อผิดพลาดจะเกิดขึ้น

Chrome ทำสิ่งต่อไปนี้เมื่อตั้งค่า URL แบบบัญญัติ (ที่มา: https://code.google.com/p/chromium/issues/detail?id=533361#c13 ):

  • สตริงการป้อนข้อมูล "http: //a.com/%%30%30" จะถูกยกเลิกการ Escape ด้วย " http://a.com/%00 " และถือว่าเป็น GURL ที่ถูกต้อง
  • ในที่สุด GURL นี้จะถูกส่งไปยัง GURLToDatabaseURL () ซึ่งจะเรียก ReplaceComponents () ที่อยู่บนนั้นเพื่อตัดชื่อผู้ใช้และรหัสผ่าน
  • ReplaceComponents () กำหนดค่า URL ใหม่อีกครั้ง
  • Canonicalization ของพา ธ กระทบลำดับ "% 00", unescapes, เห็นว่านี่คือ 0 ถ่านซึ่งไม่ถูกต้องใน URL ปล่อยมันหนี แต่ทำเครื่องหมาย URL ที่เป็นผลลัพธ์ไม่ถูกต้อง
  • เมื่อเรากลับไปที่ GURLToDatabaseURL () มันจะเรียก. spec () บน URL ใหม่โดยคาดว่ามันจะถูกต้องเนื่องจาก URL ที่ป้อนนั้นรับประกันว่าถูกต้องและเราเพิ่งลบชื่อผู้ใช้และรหัสผ่านออก DCHECKs นี้

ดังนั้น URL จะถือว่าใช้งานได้ครั้งแรก แต่หลังจากลบข้อมูลส่วนตัวบางอย่างแล้วก็ถือว่าเป็นโมฆะ อย่างไรก็ตามหลังจากลบข้อมูลแล้วฟังก์ชันที่เรียกว่ารหัสเฉพาะนั้นจะต้องมี URL ที่ถูกต้อง

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

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