suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Js.erb-Vorlage für Auswahlfeldoptionen aktualisieren – XSS sicher verarbeiten und Text korrekt anzeigen

Ich rendere eine .js.erb Datei in einer Rails-Anwendung. In dieser Datei aktualisiere ich die Optionen eines Auswahlfelds.

Das Wichtigste ist, dass ich es XSS-sicher mache. Basierend auf dieser Stack Overflow-Lösung, die auf das OWASP DOM-basierte XSS Prevention Cheat Sheet verweist, aktualisiere ich die Optionen des Auswahlfelds wie folgt:

Versuchen Sie es mit 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 %>

Versuchen Sie es mit 2

Ich weiß, dass Rails eines hat html_safe方法,所以我尝试使用它:我将"<%= blog.name %>";更新为"<%= blog.name.html_safe %>";.

Versuchen Sie es mit 3

Diese Methode scheint zu funktionieren. Die Optionen wurden aktualisiert und der Text anzeigen funktioniert einwandfrei, während die Option mit Text anzeigen alert("gotcha"); nur als Text angezeigt und nicht als Code ausgeführt wird:

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

Es ist unklar, wie ich die Auswahloptionen der .js.erbVorlage auf eine Weise aktualisieren kann, die sowohl sicher ist als auch den Text korrekt anzeigt.

P粉674757114P粉674757114233 Tage vor580

Antworte allen(1)Ich werde antworten

  • P粉594941301

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

    尝试给出我的理解:

    • 尝试1

    虽然你可以解码特殊字符,但这不是Rails的方式。

    • 尝试2

    html_safe并不能确保字符串结果是安全的,而是你明确指定字符串是安全的,这样字符串中的HTML标签才能以HTML形式显示,因此它不能解决XSS问题。

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

    根据这篇文章,在单引号或双引号中使用escape_javascript是安全的。

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

    因此,尝试3是XSS安全的,也是Rails的方式,是首选的。

    你的代码可以简化为:

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

    Antwort
    0
  • StornierenAntwort