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 %>
blog.name
的显示文本被进行了HTML编码。例如,"Johnson & Johnson"的文本显示为:"Johnson &
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 %>";
.
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) %>");
j
(escape_javascript
) unsicher sind. Es ist unklar, wie ich die Auswahloptionen der .js.erb
Vorlage auf eine Weise aktualisieren kann, die sowohl sicher ist als auch den Text korrekt anzeigt.
尝试给出我的理解:
虽然你可以解码特殊字符,但这不是Rails的方式。
html_safe并不能确保字符串结果是安全的,而是你明确指定字符串是安全的,这样字符串中的HTML标签才能以HTML形式显示,因此它不能解决XSS问题。
根据这篇文章,在单引号或双引号中使用
escape_javascript
是安全的。因此,尝试3是XSS安全的,也是Rails的方式,是首选的。
你的代码可以简化为: