Kemas kini templat js.erb untuk pilihan kotak pilihan - kendalikan XSS dengan selamat dan paparkan teks dengan betul
P粉674757114
P粉674757114 2024-03-31 00:36:22
0
1
569

Saya sedang memaparkan fail .js.erb dalam aplikasi Rails. Dalam fail ini, saya sedang mengemas kini pilihan kotak pilihan.

Yang paling penting ialah saya melakukannya dengan cara selamat XSS. Berdasarkan penyelesaian Stack Overflow ini, merujuk kepada Lembaran Cheat Pencegahan XSS berasaskan OWASP DOM, saya mengemas kini pilihan kotak pilihan dengan cara berikut:

Cuba 1

// app/views/blogs/blogs_select_listing.js.erb

// 删除所有选项
$('#blog_select_box').children().remove();

// 遍历@blogs集合,将每个博客项目作为选项添加到选择框中
<% @blogs.each do |blog| %>
  var opt = document.createElement("option");
  opt.setAttribute("value", "<%= blog.id %>");
  opt.textContent = "<%= blog.name %>";
  $('#blog_select_box').append(opt);
<% end %>
  • Masalah: blog.name的显示文本被进行了HTML编码。例如,"Johnson & Johnson"的文本显示为:"Johnson &amp; Johnson". Watak istimewa lain seperti apostrof juga akan mengalami masalah paparan yang sama.

Cuba 2

Saya tahu Rails ada satu html_safe方法,所以我尝试使用它:我将"<%= blog.name %>";更新为"<%= blog.name.html_safe %>";.

  • Masalah: Apabila saya lulus blog.name设置为alert("Gotcha");来测试XSS时,它会出错:选项根本没有被更新。最终似乎问题是在这种上下文中使用html_safe, aplikasi tidak tahu apa yang perlu dilakukan dengan petikan berganda.

Cuba 3

Kaedah ini nampaknya berkesan. Ia mengemas kini pilihan dan teks rancangan berfungsi dengan baik, manakala pilihan dengan teks rancangan alert("gotcha"); hanya muncul sebagai teks dan tidak dilaksanakan sebagai kod:

// app/views/blogs/blogs_select_listing.js.erb

// 删除所有选项
$('#blog_select_box').children().remove();

// 遍历@blogs集合,将每个博客项目作为选项添加到选择框中
$('#blog_select_box')
.html("<%= j options_from_collection_for_select(@blogs, :id, :name) %>");
  • Soalan: Saya tidak pasti sama ada ini selamat. Saya tidak pasti kerana saya melihat artikel ini yang menyatakan bahawa alias untuk jescape_javascript) adalah tidak selamat.

Tidak jelas bagaimana saya boleh mengemas kini pilihan pemilihan daripada templat .js.erb dalam cara yang selamat dan memaparkan teks dengan betul.

P粉674757114
P粉674757114

membalas semua(1)
P粉594941301

Cuba berikan pemahaman saya:

  • Cuba 1

Walaupun anda boleh menyahkod aksara khas, itu bukan cara Rails.

  • Cuba 2

html_safe tidak memastikan bahawa hasil rentetan selamat, tetapi anda dengan jelas menyatakan bahawa rentetan itu selamat supaya teg HTML dalam rentetan boleh dipaparkan sebagai HTML, jadi ia tidak menyelesaikan masalah XSS.

string = '<div>html with string</div>'
<%= string.html_safe %> # 以HTML形式显示
<%= string %> # 以字符串形式显示
  • Cuba 3

Mengikut artikel ini, ia selamat digunakan escape_javascript di dalam petikan tunggal atau berganda.

# 安全
'<%= j string %>' # 或者
"<%= j string %>"

# 不安全
<%= j string %>  # 或者
`<%= j string %>`

Jadi cuba 3 adalah XSS selamat dan cara Rel dan lebih diutamakan.

Kod anda boleh dipermudahkan kepada:

# html()方法会替换原始内容,所以你不需要先删除它
$('#blog_select_box')
  .html("<%= j options_from_collection_for_select(@blogs, :id, :name) %>");
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan