raw so với html_safe so với h để unescape html


323

Giả sử tôi có chuỗi sau

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

Theo quan điểm của tôi, tôi muốn một liên kết được hiển thị. Đó là, tôi không muốn mọi thứ trong @x không bị hủy bỏ và hiển thị dưới dạng một chuỗi. Sự khác biệt giữa việc sử dụng

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

?


Vì không ai đề cập đến nó nên tôi nghĩ rằng tôi cũng đề cập đến <%== @x %>đó là bí danh của <%= raw(@x) %> edgeguides.rubyonrails.org/iêu
CTS_AE

Câu trả lời:


386

Xem xét đường ray 3:

html_safethực sự "đặt chuỗi" là HTML Safe (phức tạp hơn thế một chút, nhưng về cơ bản là như vậy). Bằng cách này, bạn có thể trả về chuỗi HTML Safe từ người trợ giúp hoặc mô hình theo ý muốn.

hchỉ có thể được sử dụng từ trong bộ điều khiển hoặc chế độ xem, vì nó từ trình trợ giúp. Nó sẽ buộc đầu ra phải được thoát. Nó không thực sự bị phản đối, nhưng rất có thể bạn sẽ không sử dụng nó nữa: cách sử dụng duy nhất là "hoàn nguyên" một html_safetuyên bố, khá bất thường.

Chuẩn bị biểu thức của bạn rawthực sự tương đương với việc gọi to_schuỗi với html_safenó, nhưng được khai báo trên một trình trợ giúp, giống như hvậy, vì vậy nó chỉ có thể được sử dụng trên các bộ điều khiển và khung nhìn.

" SafeBuffers và Rails 3.0 " là một lời giải thích hay về cách hoạt động SafeBuffercủa lớp (lớp thực hiện html_safephép thuật).


42
Tôi sẽ không nói rằng hsẽ không bao giờ được phản đối. Sử dụng "Hi<br/>#{h@ user.name}".html_safelà khá phổ biến và sử dụng được chấp nhận.
maletor

1
@Maletor sử dụng thú vị, mặc dù tôi vẫn nghĩ rằng nó thuộc loại "không bình thường".
Fábio Batista

5
Chuỗi # html_safe thực sự trả về một phiên bản của ActiveSupport :: SafeBuffer bao bọc chuỗi gốc và là #html_safe? . Chuỗi ban đầu không trở thành #html_safe? sau khi gọi #html_safe trên đó.
jmaxz

9
Lưu ý rằng có một sự khác biệt tinh tế giữa rawhtml_safetrong thực tế: raw(nil)trả về một chuỗi rỗng, trong khi nil.html_safeném một ngoại lệ.
Van der Hoorn

2
hsẽ không "hoàn nguyên" một khai báo html_safe. Khi một chuỗi là html_safe, hsẽ không làm gì.
GuiGS

113

Tôi nghĩ rằng nó nhắc lại: html_safekhông không HTML-thoát khỏi chuỗi của bạn. Trong thực tế, nó sẽ ngăn chặn chuỗi của bạn được thoát.

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

sẽ đặt:

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

vào nguồn HTML của bạn (yay, rất an toàn!), trong khi:

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

sẽ bật lên hộp thoại cảnh báo (bạn có chắc chắn đó là những gì bạn muốn không?). Vì vậy, bạn có thể không muốn gọi html_safebất kỳ chuỗi nào do người dùng nhập.


81
Nói cách khác, html_safe không phải là "vui lòng làm cho html này an toàn", điều ngược lại - đó là bạn lập trình viên nói với rails rằng "chuỗi này là html an toàn, xin hứa!"
PaulM bồCbr

thực sự tôi đến đây để tìm ra nếu nó thực sự làm unescape hoặc nếu nó chỉ làm cho một dấu ấn mà nó không phải là cần thiết to_escape . Hoàn toàn khác biệt. Oh tốt, tắt để đọc mã nguồn sau đó.
Simon B.

Khái niệm "html_safe" chỉ là một cờ meta trên chuỗi. Đánh dấu một cái gì đó như html_safekhông không thoát cũng không unescape. Mặc dù kết quả cuối cùng của việc đánh dấu một cái gì đó là không an toàn HTML, và sau đó sử dụng thoát ẩn ẩn của thẻ ERB <% =, có thể giống như dữ liệu không xác định và sau đó thoát lại trên đầu ra, về mặt chức năng, nó cũng không hoạt động. Kiểu như sự khác biệt của (6 * -1 * -1), so với 6.
Ben Zittlau

46

Sự khác biệt là giữa Rails ' html_safe()raw(). Có một bài viết tuyệt vời của Yehuda Katz về điều này, và nó thực sự sôi nổi về điều này:

def raw(stringish)

  stringish.to_s.html_safe

end

Vâng, raw()là một bao bọc xung quanhhtml_safe() buộc đầu vào thành Chuỗi và sau đó gọi html_safe()nó. Đây cũng là trường hợp của raw()một trình trợ giúp trong một mô-đun trong khi đó html_safe()là một phương thức trên lớp String tạo ra một cá thể ActiveSupport :: SafeBuffer mới - có một @dirtycờ trong đó.

Tham khảo " Rails 'html_safe so với raw ".


30
  1. html_safe :

    Đánh dấu một chuỗi là an toàn đáng tin cậy. Nó sẽ được chèn vào HTML mà không có lối thoát bổ sung nào được thực hiện.

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

    rawchỉ là một bao bọc xung quanh html_safe. Sử dụng rawnếu có cơ hội mà chuỗi sẽ được nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. hbí danh cho html_escape:

    Một phương thức tiện ích để thoát các ký tự thẻ HTML. Sử dụng phương pháp này để thoát khỏi bất kỳ nội dung không an toàn.

    Trong Rails 3 trở lên, nó được sử dụng theo mặc định, do đó bạn không cần sử dụng phương pháp này một cách rõ ràng



2

Trong thuật ngữ Rails đơn giản:

h xóa các thẻ html thành các ký tự số để kết xuất sẽ không phá vỡ html của bạn

html_safe thiết lập một boolean trong chuỗi để chuỗi được coi là lưu html

raw Nó chuyển đổi thành html_safe thành chuỗi


hhtml_safe, có nghĩa là HTML được hiển thị nguyên trạng.
Dave Newton

Câu trả lời là đúng: h là html_escape ... từ cơ sở mã Rails
notapatch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.