Maison  >  Questions et réponses  >  le corps du texte

Mettez à jour le modèle js.erb pour les options de la zone de sélection - gérez XSS en toute sécurité et affichez le texte correctement

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

Essayez-en 2

Je sais que Rails en a un html_safe方法,所以我尝试使用它:我将"<%= blog.name %>";更新为"<%= blog.name.html_safe %>";.

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

On ne sait pas comment mettre à jour les options de sélection du .js.erbmodèle d'une manière qui soit à la fois sûre et affiche correctement le texte.

P粉674757114P粉674757114185 Il y a quelques jours371

répondre à tous(1)je répondrai

  • P粉594941301

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

    Essayez de donner ma compréhension :

    • Essayez 1

    Bien que vous puissiez décoder les caractères spéciaux, ce n'est pas la méthode Rails.

    • Essayez-en 2

    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.

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

    Selon cet article, il est sûr d'utiliser escape_javascript entre guillemets simples ou doubles.

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

    Donc, essayez 3 est XSS sûr et la méthode Rails et est préféré.

    Votre code peut être simplifié en :

    # html()方法会替换原始内容,所以你不需要先删除它
    $('#blog_select_box')
      .html("<%= j options_from_collection_for_select(@blogs, :id, :name) %>");
    

    répondre
    0
  • Annulerrépondre