raw vs. html_safe vs. h เป็น unescape html


323

สมมติว่าฉันมีสตริงต่อไปนี้

@x = "<a href='#'>Turn me into a link</a>"

ในมุมมองของฉันฉันต้องการลิงค์ที่จะแสดง นั่นคือฉันไม่ต้องการให้ทุกสิ่งทุกอย่างใน @x ไม่สามารถใช้ค่า Escape และแสดงเป็นสตริงได้ ความแตกต่างระหว่างการใช้งานคืออะไร

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?


เนื่องจากไม่มีใครพูดถึงมันฉันคิดว่าฉันยังพูดถึงว่ามี<%== @x %>ชื่ออื่นให้กับ<%= raw(@x) %> edgeguides.rubyonrails.org/ อย่างไร
CTS_AE

คำตอบ:


386

พิจารณา Rails 3:

html_safeจริงๆแล้ว "ตั้งค่าสตริง" เป็น HTML Safe (มีความซับซ้อนมากกว่านั้นเล็กน้อย แต่โดยพื้นฐานแล้ว) ด้วยวิธีนี้คุณสามารถส่งคืนสตริง HTML ที่ปลอดภัยจากผู้ช่วยเหลือหรือรุ่นตามที่ต้องการ

hสามารถใช้ได้จากภายในตัวควบคุมหรือมุมมองเท่านั้นเนื่องจากมาจากตัวช่วย มันจะบังคับเอาท์พุทที่จะหลบหนี มันไม่ได้ถูกคัดค้านจริงๆ แต่คุณมักจะไม่ใช้อีกต่อไป: การใช้งานเพียงอย่างเดียวคือ "ยกเลิกการhtml_safeประกาศ" ซึ่งเป็นเรื่องที่ผิดปกติ

การจัดเตรียมนิพจน์ของคุณด้วยrawนั้นเทียบเท่ากับการเรียกการto_sโยงกับhtml_safeมัน แต่ถูกประกาศบนผู้ช่วยเช่นhนั้นดังนั้นจึงสามารถใช้กับตัวควบคุมและมุมมองเท่านั้น

" SafeBuffers และ Rails 3.0 " เป็นคำอธิบายที่ดีเกี่ยวกับวิธีการที่SafeBuffers (คลาสที่ใช้html_safeเวทย์มนตร์) ทำงานได้ดี


42
ฉันจะไม่พูดแบบนั้นhตลอดไป การใช้งาน"Hi<br/>#{h@ user.name}".html_safeค่อนข้างบ่อยและเป็นที่ยอมรับ
maletor

1
@Maletor การใช้งานที่น่าสนใจแม้ว่าฉันยังคิดว่ามันอยู่ในหมวดหมู่ "ผิดปกติ"
Fábio Batista

5
String # html_safe จริง ๆ แล้วคืนค่าอินสแตนซ์ของ ActiveSupport :: SafeBuffer ซึ่งล้อมสตริงเดิมและเป็น #html_safe? . สตริงเดิมไม่กลายเป็น #html_safe? หลังจากโทร #html_safe แล้ว
jmaxyz

9
โปรดทราบว่ามีความแตกต่างเล็กน้อยระหว่างrawและhtml_safeในทางปฏิบัติ: raw(nil)ส่งกลับสตริงที่ว่างเปล่าในขณะที่nil.html_safeโยนข้อยกเว้น
Van der Hoorn

2
hจะไม่ "ย้อนกลับ" การประกาศ html_safe เมื่อสตริงhtml_safe, hจะทำอะไร
GuiGS

113

ฉันคิดว่ามันหมีซ้ำ: html_safeไม่ไม่ HTML-หนีสายของคุณ ในความเป็นจริงมันจะป้องกันไม่ให้สตริงของคุณถูกหลบหนี

<%= "<script>alert('Hello!')</script>" %>

จะใส่:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

ลงในซอร์ส HTML ของคุณ (ใช่ปลอดภัยมาก!) ขณะที่:

<%= "<script>alert('Hello!')</script>".html_safe %>

จะปรากฏข้อความแจ้งเตือนขึ้นมา (คุณแน่ใจหรือไม่ว่าเป็นสิ่งที่คุณต้องการ?) ดังนั้นคุณอาจไม่ต้องการเรียกสายhtml_safeที่ผู้ใช้ป้อน


81
กล่าวอีกนัยหนึ่ง html_safe ไม่ใช่ "โปรดทำให้ html นี้ปลอดภัย" มันตรงกันข้ามนั่นคือคุณเป็นโปรแกรมเมอร์ที่บอกกับรางว่า "สตริงนี้ปลอดภัย html สัญญา!"
PaulMurrayCbr

ที่จริงผมมาที่นี่เพื่อคิดออกถ้ามันไม่จริงunescapeหรือถ้ามันก็ทำให้เครื่องหมายว่ามันไม่จำเป็นto_escape ค่อนข้างแตกต่าง โอ้ดีที่จะอ่านซอร์สโค้ดแล้ว
Simon B.

แนวคิดของ "html_safe" เป็นเพียงธงเมตาบนสตริง ทำเครื่องหมายสิ่งที่html_safeไม่สามารถหลบหลีกหรือไม่ได้ทิวทัศน์ ในขณะที่ผลลัพธ์สุดท้ายของการทำเครื่องหมายสิ่งที่ไม่ปลอดภัย HTML จากนั้นการใช้การหลีกเลี่ยงโดยนัยของแท็ก ERB <% = อาจเหมือนกับข้อมูลที่ไม่ใช้การหลบหลีกจากนั้นจึงหลีกหนีไปที่เอาต์พุตอีกครั้ง ชนิดของความแตกต่างของ (6 * -1 * -1) กับ 6
Ben Zittlau

46

ความแตกต่างคือระหว่างทางรถไฟและhtml_safe() raw()มีการโพสต์ที่ยอดเยี่ยมโดย Yehuda Katz เกี่ยวกับเรื่องนี้และจริง ๆ แล้วมันลงไปที่:

def raw(stringish)

  stringish.to_s.html_safe

end

ใช่raw()เป็นตัวล้อมรอบhtml_safe()ที่บังคับให้อินพุตกับสตริงจากนั้นเรียกhtml_safe()ใช้ เป็นกรณีที่raw()เป็นผู้ช่วยในโมดูลในขณะที่html_safe()เป็นวิธีการในชั้นเรียน String ซึ่งทำให้อินสแตนซ์ ActiveSupport :: SafeBuffer ใหม่ - ที่มีการ@dirtyตั้งค่าสถานะในมัน

อ้างอิงถึง " Rails 'html_safe กับ raw "


30
  1. html_safe :

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

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
  2. raw :

    rawhtml_safeเป็นเพียงเสื้อคลุมรอบ ใช้ถ้ามีโอกาสที่สายจะเป็นrawnil

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. hนามแฝงสำหรับhtml_escape:

    วิธีการยูทิลิตี้สำหรับการหลบหนีตัวละครแท็ก HTML ใช้วิธีนี้เพื่อหลีกเลี่ยงเนื้อหาที่ไม่ปลอดภัย

    ใน Rails 3 ขึ้นไปมันถูกใช้เป็นค่าเริ่มต้นดังนั้นคุณไม่จำเป็นต้องใช้วิธีนี้อย่างชัดเจน



2

ในเงื่อนไข Simple Rails:

h ลบแท็ก html ออกเป็นอักขระตัวเลขเพื่อให้การแสดงผลไม่ทำลาย html ของคุณ

html_safe ตั้งค่าบูลีนในสตริงเพื่อให้สตริงนั้นถือเป็น html save

raw มันจะแปลงเป็น html_safe เป็นสตริง


hคือhtml_safeซึ่งหมายความว่า HTML จะแสดงผลตามที่เป็น
Dave Newton

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