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 %>
blog.name
的显示文本被进行了HTML编码。例如,"Johnson & Johnson"的文本显示为:"Johnson &
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 %>";
.
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) %>");
j
(escape_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.
Cuba berikan pemahaman saya:
Walaupun anda boleh menyahkod aksara khas, itu bukan cara Rails.
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.
Mengikut artikel ini, ia selamat digunakan
escape_javascript
di dalam petikan tunggal atau berganda.Jadi cuba 3 adalah XSS selamat dan cara Rel dan lebih diutamakan.
Kod anda boleh dipermudahkan kepada: