พารามิเตอร์ _snowman ในรูปแบบ Ruby on Rails 3 มีไว้เพื่ออะไร?


174

ใน Ruby on Rails 3 (ปัจจุบันใช้ Beta 4) ฉันเห็นว่าเมื่อใช้form_tagหรือform_forผู้ช่วยเหลือมีฟิลด์ที่ซ่อนชื่อที่_snowmanมีค่า of ( Unicode \ x9731) ปรากฏขึ้น

ดังนั้นสิ่งนี้มีไว้เพื่ออะไร?


2
นี่คือ 'เอกสาร' ประเภทคำถาม & คำตอบ - ฉันพยายามค้นหาคำตอบที่นี่และจบลงด้วยการขุดผ่านข้อความยืนยันดังนั้นฉันคิดว่าฉันจะแบ่งปันที่นี่เพื่อคนอื่น ๆ ที่สงสัยเกี่ยวกับมนุษย์หิมะ ...
Matthew Savage

คำตอบ:


308

พารามิเตอร์นี้ถูกเพิ่มไปยังแบบฟอร์มเพื่อบังคับให้ Internet Explorer (5, 6, 7 และ 8) เพื่อเข้ารหัสพารามิเตอร์เป็น unicode

โดยเฉพาะข้อผิดพลาดนี้สามารถถูกเรียกใช้หากผู้ใช้สลับการเข้ารหัสของเบราว์เซอร์เป็น Latin-1 เพื่อให้เข้าใจว่าเหตุใดผู้ใช้จึงตัดสินใจที่จะทำสิ่งที่ดูบ้าคลั่งลองดูที่การค้นหาของ Googleนี้ เมื่อผู้ใช้วางเว็บไซต์ลงในโหมด Latin-1 หากพวกเขาใช้ตัวอักษรที่สามารถเข้าใจได้ทั้ง Latin-1 และ Unicode (ตัวอย่างเช่นéหรือçทั่วไปในชื่อ) Internet Explorer จะเข้ารหัสเป็นภาษาละติน -1

ซึ่งหมายความว่าหากผู้ใช้ค้นหา "Ché Guevara" จะเกิดความผิดพลาดทางฝั่งเซิร์ฟเวอร์ ใน Ruby 1.9 สิ่งนี้จะส่งผลให้เกิดข้อผิดพลาดในการเข้ารหัสเมื่อข้อความเข้ามาในเอ็นจินนิพจน์ทั่วไป ใน Ruby 1.8 มันจะส่งผลให้ผลลัพธ์ที่ขาดสำหรับผู้ใช้

ด้วยการสร้างพารามิเตอร์ที่ IE สามารถเข้าใจได้เป็นอักขระยูนิโค้ดเท่านั้นเรากำลังบังคับให้ IE ดูแอตทริบิวต์ accept-charset ซึ่งจะบอกให้เข้ารหัสอักขระทั้งหมดเป็น UTF-8 แม้แต่ตัวที่สามารถเข้ารหัสได้ ในละติน -1

โปรดจำไว้ว่าใน Ruby 1.8 นั้นเป็นเรื่องง่ายมากที่จะนำข้อมูล Latin-1 ไปไว้ในฐานข้อมูล UTF-8 ของคุณ (เนื่องจากไม่มีสิ่งใดในสแต็กทั้งหมดตรวจสอบว่าไบต์ที่ผู้ใช้ส่ง ณ จุดใด ๆ เป็นอักขระ UTF-8 ที่ถูกต้อง) ดังนั้นจึงเป็นเรื่องธรรมดามากสำหรับแอปพลิเคชั่น Ruby (และแอปพลิเคชั่น PHP และอื่น ๆ ) เพื่อแสดงบั๊กที่ผู้ใช้พบเจอดังนั้นจึงเป็นเรื่องธรรมดามากที่ผู้ใช้จะพยายามเปลี่ยนการเข้ารหัสเป็นแบบประคับประคอง

ทุกอย่างที่กล่าวว่าเมื่อฉันเขียนโปรแกรมแก้ไขนี้ฉันไม่ทราบว่าชื่อของพารามิเตอร์จะปรากฏในที่ที่ผู้ใช้หันหน้าไปทาง (มันใช้รูปแบบที่ใช้การกระทำของ GET เช่นแบบฟอร์มการค้นหา) เนื่องจากเป็นเช่นนั้นเราจะเปลี่ยนชื่อพารามิเตอร์นี้เป็น_eและใช้อักขระ unicode ที่ดูไม่น่ากลัวยิ่งขึ้น


1
หากสิ่งนี้กลายเป็นพารามิเตอร์โปร่งใสเช่น _method มันอาจจะทำให้สับสนน้อยลง แม้ว่าจะเป็นเรื่องบ้าอะไรที่ต้องแก้ไข
tadman

1
ขอบคุณสำหรับการตอบสนองอย่างละเอียด Yehuda - แม้ว่าฉันคิดว่าการรักษามนุษย์หิมะเป็นผลลัพธ์ที่ดีที่สุดมันน่าจะเป็นหนึ่งใน 'องค์กร' ที่โง่ ๆ ที่จะเลือก - 'อะไรคือสิ่งที่มนุษย์หิมะนี้ นี่คือธุรกิจไม่ใช่เกม! '.. ฮึ
Matthew Savage

1
@ แมทธิวพอคุณพูดถูก แต่ฉันรู้สึกว่าทางออกนั้นค่อนข้างน่าประทับใจ
JP Silvashy

10
Snowman ได้ถูกแทนที่ด้วยอินพุตที่ซ่อนอยู่ชื่อ utf8 พร้อมค่าที่ตั้งเป็น "& # x2713" ฉันใช้ form_tag สำหรับ switcher ภาษาของฉันและเริ่มได้รับข้อยกเว้นมากมายเนื่องจาก crawler ตัวหนึ่งดูเหมือนว่ามีปัญหากับค่านี้และเชื่อมต่อพารามิเตอร์ utf8 และค่าของตัวเลือกการเลือกในแบบฟอร์มไม่ถูกต้อง
Christer Fernstrom

56

นี่คือการสนับสนุน Internet Explorer 5 และสนับสนุนให้ใช้UTF-8สำหรับแบบฟอร์ม

ข้อความคอมมิทที่เห็นที่นี่มีรายละเอียดดังนี้:

แก้ไขปัญหาการเข้ารหัสเว็บที่รู้จักหลายประการ:

  • ระบุ accept-charset ในทุกรูปแบบ เบราว์เซอร์ล่าสุดทั้งหมดรวมถึง IE5 + จะใช้การเข้ารหัสที่ระบุสำหรับพารามิเตอร์ของฟอร์ม
  • น่าเสียดายที่ IE5 + จะไม่ดู accept-charset เว้นแต่อย่างน้อยหนึ่งอักขระในค่าของแบบฟอร์มไม่ได้อยู่ในชุดอักขระของหน้า เนื่องจากผู้ใช้สามารถลบล้าง
    ชุดอักขระเริ่มต้น(ซึ่ง Rails ตั้งค่าเป็น UTF-8) เราจึงจัดเตรียมอินพุตที่ซ่อนอยู่ซึ่งมีอักขระยูนิโค้ดบังคับให้ IE ดูที่ชุดอักขระยอมรับ
  • ตอนนี้ส่วนใหญ่ของการป้อนข้อมูลเว็บเป็น UTF-8 เราตั้งค่าพารามิเตอร์ขาเข้าเป็น UTF-8 สิ่งนี้จะกำจัดการเข้ารหัสที่เข้ากันไม่ได้ระหว่าง ASCII-8BIT และ
    UTF-8
  • คุณสามารถละเว้น params ได้อย่างปลอดภัย [: _ snowman]

ในระยะสั้นคุณสามารถละเว้นพารามิเตอร์นี้ได้อย่างปลอดภัย

ถึงกระนั้นฉันก็ยังไม่แน่ใจว่าทำไมเราถึงสนับสนุนเทคโนโลยีเก่า ๆ เช่น Internet Explorer 5 ดูเหมือนว่าจะไม่ใช่ Ruby on Rails ถ้าคุณถามฉัน


7
ใบเสนอราคาแจ้งว่า“ IE5 +” ดังนั้นปัญหาอาจเกิดขึ้นใน IE เวอร์ชันใหม่กว่าด้วยใช่ไหม
ฟิลิปป์

5
สำหรับคำตอบที่ยาวกว่านี้โปรดดูที่github.com/rails/rails/commit/… (ดูคำตอบของฉันด้านล่าง)
Yehuda Katz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.