How to whitelist SVG tag with js-xss library

Posted on February 3, 2021

Js-xss library is a very good piece of software to filter-out unwanted user-provided HTML tags in your application.

It comes with a pre-defined default set of blacklisted tags and attributes out of the box.

Problem

In my case, I wanted to allow the user writing raw SVG, and its inner tags as well, with all the available attributes.

Whitelisting all the SVG specification in js-xss is quite pedantic if using its default object:

import xss from 'xss'

// allow the `iframe` tag with only the attribute `src`
xss.whiteList.iframe = ['src']

If I had want to allow the SVG I'd do something like:

xss.whiteList.circle = ['r', 'cx', 'cy', 'fill', 'stroke']
xss.whiteList.rect = ['width', 'height', 'x', 'y', 'fill', 'stroke']
...

... not very comfortable.

Let's use onIgnoreTagAttr

Here the way to configure it properly to allow the SVG compatible tags and all the possible atributes:

import xss from 'xss'

const whiteListAttrForTags = ['svg', 'circle', 'rect', 'polygon', 'path', ...]

let sanitize = new xss.FilterXSS({
    onIgnoreTagAttr: function (tag, name, value, isWhiteAttr) {
        if(whiteListAttrForTags.indexOf(tag) >= 0 && value){
            return `${name}="${value}"`
        }
    }
})

The above configuration still takes into account the tags whitelisted in the whiteListAttrForTags array allowing any attribute written within.