Misalkan saya memiliki string berikut
@x = "<a href='#'>Turn me into a link</a>"
Dalam pandangan saya, saya ingin tautan ditampilkan. Yaitu, saya tidak ingin semua yang ada di @x tidak terhapus dan ditampilkan sebagai string. Apa perbedaan antara menggunakan
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
ruby-on-rails
erb
grautur
sumber
sumber
<%== @x %>
yang merupakan alias untuk<%= raw(@x) %>
edgeguides.rubyonrails.org/…Jawaban:
Mengingat Rel 3:
html_safe
sebenarnya "set the string" sebagai HTML Safe (ini sedikit lebih rumit dari itu, tetapi pada dasarnya itu). Dengan cara ini, Anda dapat mengembalikan string HTML Safe dari helper atau model sesuka hati.h
hanya dapat digunakan dari dalam controller atau view, karena itu dari helper. Itu akan memaksa output untuk keluar. Itu tidak benar-benar usang, tetapi Anda kemungkinan besar tidak akan menggunakannya lagi: satu-satunya penggunaan adalah untuk "mengembalikan"html_safe
deklarasi, sangat tidak biasa.Menempatkan ekspresi Anda dengan
raw
sebenarnya sama dengan memanggilto_s
dirantaihtml_safe
dengannya, tetapi dideklarasikan pada helper, sama sepertih
, jadi itu hanya dapat digunakan pada pengontrol dan tampilan." SafeBuffers and Rails 3.0 " adalah penjelasan yang bagus tentang bagaimana
SafeBuffer
s (kelas yang melakukanhtml_safe
sihir) bekerja.sumber
h
akan ditinggalkan. Penggunaannya"Hi<br/>#{h@ user.name}".html_safe
cukup umum dan penggunaannya diterima.raw
danhtml_safe
dalam praktiknya:raw(nil)
mengembalikan string kosong, sambilnil.html_safe
melempar pengecualian.h
tidak akan "mengembalikan" deklarasi html_safe. Ketika sebuah stringhtml_safe
,h
tidak akan melakukan apa pun.Saya pikir itu diulang:
html_safe
tidak tidak HTML-melarikan diri string Anda. Bahkan, itu akan mencegah string Anda lolos.akan menempatkan:
ke sumber HTML Anda (yay, sangat aman!), sementara:
akan memunculkan dialog peringatan (apakah Anda yakin itu yang Anda inginkan?). Jadi, Anda mungkin tidak ingin memanggil
html_safe
string yang dimasukkan pengguna.sumber
html_safe
tidak tidak melarikan diri atau unescape. Sementara hasil akhir dari menandai sesuatu sebagai bukan HTML aman, dan kemudian menggunakan pelepasan ERB <% = tag secara implisit, mungkin sama dengan menghapus data dan kemudian kembali melarikannya pada output, secara fungsional tidak melakukan keduanya. Jenis suka perbedaan (6 * -1 * -1), vs 6.Perbedaannya adalah antara Rails
html_safe()
danraw()
. Ada sebuah pos yang sangat bagus oleh Yehuda Katz tentang ini, dan itu benar-benar bermuara pada ini:Ya,
raw()
adalah pembungkushtml_safe()
yang memaksa input ke String dan kemudian memanggilnyahtml_safe()
. Ini juga merupakan kasus yangraw()
merupakan penolong dalam modul sedangkanhtml_safe()
merupakan metode pada kelas String yang membuat contoh ActiveSupport :: SafeBuffer baru - yang memiliki@dirty
tanda di dalamnya.Lihat " Rails 'html_safe vs. raw ".
sumber
html_safe
:Menandai string sebagai brankas tepercaya. Ini akan dimasukkan ke dalam HTML tanpa pelolosan tambahan dilakukan.
raw
:raw
hanyalah pembungkus di sekitarhtml_safe
. Gunakanraw
jika ada kemungkinan string akan munculnil
.h
alias untukhtml_escape
:Metode utilitas untuk keluar dari karakter tag HTML. Gunakan metode ini untuk menghindari konten yang tidak aman.
Di Rails 3 dan di atasnya digunakan secara default sehingga Anda tidak perlu menggunakan metode ini secara eksplisit
sumber
Cara aman terbaik adalah:
<%= sanitize @x %>
Itu akan menghindari XSS!
sumber
Dalam istilah Simple Rails:
h
hapus tag html menjadi karakter angka sehingga rendering tidak akan merusak html Andahtml_safe
menetapkan boolean dalam string sehingga string tersebut dianggap sebagai html saveraw
Itu dikonversi ke html_safe ke stringsumber
h
ishtml_safe
, yang berarti HTML diterjemahkan apa adanya.