<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged xss</title>
<link>https://coderlegion.com/tag/xss</link>
<description>Powered by Question2Answer</description>
<item>
<title>Rails .html_safe - The Hidden XSS Trap</title>
<link>https://coderlegion.com/4883/rails-htmlsafe-the-hidden-xsstrap</link>
<description>&lt;hr&gt;
&lt;p&gt;Ruby on Rails has your back when it comes to cross-site scripting (XSS) - by default, it escapes all strings in your views so malicious HTML and JavaScript can't execute in your users' browsers.&lt;br&gt;
But there's a sharp tool in Rails' toolbox called .html_safe. Used incorrectly, it can silently remove that protection and leave your app wide open to attack.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;What .html_safe Does&lt;br&gt;
Normally, if you try to output a string with HTML in Rails:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= &quot;&amp;lt;b&amp;gt;Hello&amp;lt;/b&amp;gt;&quot; %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Renders as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;amp;lt;b&amp;amp;gt;Hello&amp;amp;lt;/b&amp;amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you call .html_safe:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= &quot;&amp;lt;b&amp;gt;Hello&amp;lt;/b&amp;gt;&quot;.html_safe %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Renders as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;b&amp;gt;Hello&amp;lt;/b&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's fine for safe, static strings - but deadly for user input.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The Vulnerability in Action&lt;br&gt;
Let's say you have a simple comments feature.&lt;/p&gt;
&lt;p&gt;Controller (comments_controller.rb):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class CommentsController &amp;lt; ApplicationController
  def index
    @comments = Comment.all
  end

  def create
    Comment.create!(body: params[:comment][:body])
    redirect_to comments_path
  end
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Routes (routes.rb)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Rails.application.routes.draw do
  resources :comments, only: [:index, :create]
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;View (views/comments/index.html.erb):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Comments&amp;lt;/h1&amp;gt;
&amp;lt;%= form_with url: comments_path, method: :post do %&amp;gt;
  &amp;lt;%= text_area_tag 'comment[body]' %&amp;gt;
  &amp;lt;%= submit_tag 'Post Comment' %&amp;gt;
&amp;lt;% end %&amp;gt;
&amp;lt;ul&amp;gt;
  &amp;lt;% @comments.each do |comment| %&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;%= comment.body.html_safe %&amp;gt;&amp;lt;/li&amp;gt; &amp;lt;!-- Dangerous --&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;Exploiting the Bug&lt;br&gt;
An attacker submits this as a comment:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert('Hacked!');&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With .html_safe, the browser sees:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;lt;script&amp;gt;alert('Hacked!');&amp;lt;/script&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…and executes the script - you've got an XSS vulnerability.&lt;br&gt;
Without .html_safe, Rails would render:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;amp;lt;script&amp;amp;gt;alert('Hacked!');&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;…showing the script tag as plain text and keeping your users safe.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;How to Fix It&lt;/p&gt;
&lt;p&gt;Never mark raw user input as .html_safe.&lt;br&gt;
Instead:&lt;br&gt;
Safe auto-escaping (Rails default):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;lt;%= comment.body %&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you allow some HTML formatting:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;lt;%= sanitize(comment.body) %&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rails' sanitize strips dangerous tags while keeping safe ones.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Final Thoughts&lt;/p&gt;
&lt;p&gt;Rails' .html_safe is like turning off your seatbelt because it feels restrictive - sure, you have more &quot;freedom,&quot; but one mistake and you're flying through the windshield.&lt;br&gt;
Use it only when you are 100% certain the content is safe. When in doubt, let Rails escape it or sanitize it.&lt;/p&gt;
</description>
<category>Ruby on Rails</category>
<guid isPermaLink="true">https://coderlegion.com/4883/rails-htmlsafe-the-hidden-xsstrap</guid>
<pubDate>Wed, 20 Aug 2025 21:03:28 +0000</pubDate>
</item>
</channel>
</rss>