= XSS Shield
This Rails plugin provides automatic cross site scripting
({XSS}[http://en.wikipedia.org/wiki/Cross-site_scripting]) protection for your
views. Once installed, you no longer have to manually and painstakingly sanitize
all your views with HTML escaping (eg. <%= h(foo) %>). Currently only
{ERB}[http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/index.html] templates are
supported.
For example with XSS Shield:
<%= link_to "A & B", "/foo" %>
will return a +SafeString+:
A & B
and not a plain, unsafe +String+:
A & B
This version has been tested to work with Rails 2.3.4. Your milage
may vary.
DISCLAIMER: Note that while no effort is spared to ensure that this plugin works as
advertised, we cannot guarantee that all your views are 100% XSS safe. Use it at
your own risk, but remember that {bug
reports}[http://github.com/jamestyj/xss_shield/issues] and patches are welcomed.
== How it works
It works by subclassing +String+ into +SafeString+. When the ERB engine sees a
<%= foo %> fragment, it checks if the result of executing +foo+ is a
+SafeString+. If so, it just uses it. Otherwise the string is HTML escaped
first.
The use of +SafeString+ avoids potential double-escaping. For example, with XSS
Shield, <%= @foo %> is the same as <%= h(@foo) %>.
If your string contains HTML that you don't want to escape (and you trust it),
just append .xss_safe:
<%= "foobar".xss_safe %>
It would be cumbersome to require xss_safe every time you use some helper like
render(:partial) or +link_to+, so some helpers are modified to return
+SafeString+.
If you trust your helpers, you can mark them as XSS safe:
module Some::Module
mark_methods_as_xss_safe :text_field, :check_box
end
You may need to manually tweak your helpers, views and layouts to avoid
unnecessary escaping.
== Other template engines
Currently only ERB templates is supported, but support for other templating
engines should be relatively straightforward. It's mostly a matter of changing
to_s to to_xss_safe in a few places in their source.
Patches that add support for other templating engines (along with supporting
tests) are welcomed.
== Running tests
This plugin monkey patches ERB in order to do its magic, so it's a good idea to
at least run the included tests to verify that things work in your environment.
You can run the XSS Shield tests by simply running:
rake
which should generate output looking like this:
(in /xss_shield)
/usr/bin/ruby -I"lib:lib" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" ...
Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader
Started
..........................................................................................
Finished in 0.163422 seconds.
90 tests, 135 assertions, 0 failures, 0 errors
If you place this plugin inside the vendor/plugin directory of your Rails
application, the test suite will load your application environment by requiring
RAILS_ROOT/test/test_helper.rb.
Of course, you should also verify that your existing application tests still
pass with XSS Shield enabled.
== Bugs and feedback
Please report bugs and feature requests
{here}[http://github.com/jamestyj/xss_shield/issues]. Patches and suggestions
are welcomed too.
== Authors
- Updated to support Rails 2.1 and maintained by {James
Tan}[http://github.com/jamestyj], Novell.
- {Original code}[http://code.google.com/p/xss-shield/] written by {Tomasz
Wegrzanowski}[http://code.google.com/u/Tomasz.Wegrzanowski/], Trampoline Systems.
== License
Copyright (c) 2009 Novell. See MIT-LICENSE in this directory.