Je rends un fichier .js.erb
dans une application Rails. Dans ce fichier, je mets à jour les options d'une boîte de sélection.
La chose la plus importante est que je le fasse de manière sécurisée XSS. Sur la base de cette solution Stack Overflow, faisant référence à l'aide-mémoire de prévention XSS basé sur OWASP DOM, je mets à jour les options de la zone de sélection de la manière suivante :
Essayez 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". D'autres caractères spéciaux comme les apostrophes auront également le même problème d'affichage. Essayez-en 2
Je sais que Rails en a un html_safe
方法,所以我尝试使用它:我将"<%= blog.name %>";
更新为"<%= blog.name.html_safe %>";
.
blog.name
设置为alert("Gotcha");
来测试XSS时,它会出错:选项根本没有被更新。最终似乎问题是在这种上下文中使用html_safe
, l'application ne sait pas quoi faire avec les guillemets doubles. Essayez 3
Cette méthode semble fonctionner. Il a mis à jour les options et le texte d'affichage fonctionne correctement, tandis que l'option avec texte d'affichage alert("gotcha");
s'affiche simplement sous forme de texte et ne s'exécute pas sous forme de code :
// 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
) ne sont pas sûrs. On ne sait pas comment mettre à jour les options de sélection du .js.erb
modèle d'une manière qui soit à la fois sûre et affiche correctement le texte.
Essayez de donner ma compréhension :
Bien que vous puissiez décoder les caractères spéciaux, ce n'est pas la méthode Rails.
html_safe ne garantit pas que le résultat de la chaîne est sûr, mais vous spécifiez explicitement que la chaîne est sûre afin que les balises HTML de la chaîne puissent être affichées au format HTML, cela ne résout donc pas le problème XSS.
Selon cet article, il est sûr d'utiliser
escape_javascript
entre guillemets simples ou doubles.Donc, essayez 3 est XSS sûr et la méthode Rails et est préféré.
Votre code peut être simplifié en :