Js.erb-Vorlage für Auswahlfeldoptionen aktualisieren – XSS sicher verarbeiten und Text korrekt anzeigen
P粉674757114
P粉674757114 2024-03-31 00:36:22
0
1
568

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 %>
  • Problem: blog.name的显示文本被进行了HTML编码。例如,"Johnson & Johnson"的文本显示为:"Johnson &amp; Johnson". Andere Sonderzeichen wie Apostrophe haben ebenfalls das gleiche Anzeigeproblem.

Versuchen Sie es mit 2

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

  • Problem: Wenn ich bestanden habe blog.name设置为alert("Gotcha");来测试XSS时,它会出错:选项根本没有被更新。最终似乎问题是在这种上下文中使用html_safe, weiß die Anwendung nicht, was sie mit doppelten Anführungszeichen tun soll.

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) %>");
  • Frage: Ich bin mir nicht sicher, ob das sicher ist. Ich bin mir nicht sicher, weil ich diesen Artikel gesehen habe, in dem es heißt, dass Aliase für jescape_javascript) unsicher sind.

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粉674757114
P粉674757114

Antworte allen(1)
P粉594941301

尝试给出我的理解:

  • 尝试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) %>");
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage