Home

Awesome

Secure XSS Filters

Just sufficient output filtering to prevent XSS!

npm version dependency status Build Status

Goals

Design

Quick Start

Server-side (nodejs)

Install the xss-filters npm, and include it as a dependency for your project.

npm install xss-filters --save

Require xss-filters, and you may use it with your favorite template engine. Or just use it directly:

var express = require('express');
var app = express();
var xssFilters = require('xss-filters');

app.get('/', function(req, res){
  var firstname = req.query.firstname; //an untrusted input collected from user
  res.send('<h1> Hello, ' + xssFilters.inHTMLData(firstname) + '!</h1>');
});

app.listen(3000);

Client-side (browser)

Simply download the latest minified version from the dist/ folder OR from the <a href="https://cdn.rawgit.com/yahoo/xss-filters/master/dist/xss-filters.js">CDN</a>. Embed it in your HTML file, and all filters are available in a global object called xssFilters.

<!doctype html><!-- You need HTML 5 mode for browser -->
...
<script src="dist/xss-filters.min.js"></script>
<script>
var firstname = "..."; //an untrusted input collected from user
document.write('<h1> Hello, ' + xssFilters.inHTMLData(firstname) + '!</h1>')
</script>

API Documentations

WARNINGS

(1) Filters MUST ONLY be applied to UTF-8-encoded documents.

(2) DON'T apply any filters inside any scriptable contexts, i.e., <script>, <style>, <object>, <embed>, and <svg> tags as well as style="" and onXXX="" (e.g., onclick) attributes. It is unsafe to permit untrusted input inside a scriptable context.

A workaround, if you need to include data for JS, is to use:

<input id="strJS" value="{{{inDoubleQuotedAttr data}}}">

and retrieve your data with document.getElementById('strJS').value.

The API

There are five context-sensitive filters for generic input:

Here we use {{{ }}} to indicate output expression to ease illustrations

Whenever possible, apply the most specific filter that describes your context and data:

Input\ContextHTMLDataHTMLCommentSingleQuotedAttrDoubleQuotedAttrUnQuotedAttr
Full URIuriInHTMLData()uriInHTMLComment()uriInSingleQuotedAttr()uriInDoubleQuotedAttr()uriInUnQuotedAttr()
URI PathuriPathInHTMLData()uriPathInHTMLComment()uriPathInSingleQuotedAttr()uriPathInDoubleQuotedAttr()uriPathInUnQuotedAttr()
URI QueryuriQueryInHTMLData()uriQueryInHTMLComment()uriQueryInSingleQuotedAttr()uriQueryInDoubleQuotedAttr()uriQueryInUnQuotedAttr()
URI ComponenturiComponentInHTMLData()uriComponentInHTMLComment()uriComponentInSingleQuotedAttr()uriComponentInDoubleQuotedAttr()uriComponentInUnQuotedAttr()
URI FragmenturiFragmentInHTMLData()uriFragmentInHTMLComment()uriFragmentInSingleQuotedAttr()uriFragmentInDoubleQuotedAttr()uriFragmentInUnQuotedAttr()

Check out the documentations for more details.

Contributing

To contribute, make changes in src/ and tests/, and then do:

npm test              # run the tests
npm run-script build  # build the minified version for client-side use
npm run-script docs   # build the docs

License

This software is free to use under the Yahoo BSD license. See the LICENSE file for license text and copyright information.