cari

Rumah  >  Soal Jawab  >  teks badan

Kemas kini templat js.erb untuk pilihan kotak pilihan - kendalikan XSS dengan selamat dan paparkan teks dengan betul

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 %>

Cuba 2

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

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) %>");

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

P粉674757114P粉674757114264 hari yang lalu626

membalas semua(1)saya akan balas

  • P粉594941301

    P粉5949413012024-03-31 11:24:38

    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) %>");
    

    balas
    0
  • Batalbalas