yahoo/secure-handlebars

Name: secure-handlebars

Owner: Yahoo Inc.

Description: Handlebars Context Pre-compiler

Created: 2015-02-09 19:35:28.0

Updated: 2018-05-19 18:24:04.0

Pushed: 2016-09-14 22:21:14.0

Homepage:

Size: 2311

Language: JavaScript

GitHub Committers

UserMost Recent Commit# Commits

Other Committers

UserEmailMost Recent Commit# Commits

README

SecureHandlebars

Automatically applying context-sensitive output escaping to prevent XSS!

npm version dependency status Build Status

Introduction

Check out the latest slide deck, presented in the OWASP AppSec USA 2015.

Security is of utmost importance!

Imagine a template is written like so: <a href="{{url}}">{{url}}</a>. When it is compiled with an untrusted user data like {"url": "javascript:alert(666)"}, secure-handlebars automatically applies contextual escaping and generates the HTML <a href="x-javascript:alert(666)">javascript:alert(666)</a> as a result.

Clearly, the same {{url}} must be escaped according to different output contexts to prevent malicious script executions, which otherwise would be vulnerable if the original Handlebars is used alone.

This is archived by enhancing the original Handlebars to perform the following steps:

alt Visualizing the architecture of secure-handlebars

Supported Contexts

| Context | Examples | |—|—| | HTML Data | <div>{{output}}</div> | | HTML Comment | <!-- {{output}} --> | | HTML Attribute Value
(unquoted, single-quoted and double-quoted) | <a class={{output}}>
<div class='{{output}}'>
<div class="{{output}}"> | | URI in Attribute Value
(unquoted, single-quoted and double-quoted) | <a href={{output}}>
<a href='{{output}}'>
<a href="{{output}}"> | | CSS in Attribute Value
(unquoted, single-quoted and double-quoted) | <div style="color:{{output}}">
<div style="backgrount:url({{output}})"> | It is generally a bad idea to place an {{expression}} inside those scriptable contexts (e.g., <script>{{script}}</script> or <div onclick="{{onclick}}"). Check out the Section of Warnings and Workarounds for resolutions.

Quick Start
Server-side Use for Express w/Handlebars

We highly recommend using the express-secure-handlebars npm for a streamlined experience of template pre-processing, compilating, context-sensitive output escaping, and data binding.

Client-side Use

Automatically apply Contextual XSS Escaping for Handlebars templates on client-side

 Disable <script src="dist/handlebars.min.js"></script> -->
ipt src="dist/secure-handlebars.min.js"></script>

ipt>
iven data stores a handlebars template as string
html = '<a href="{{url}}">{{url}}</a>',
data = {url: 'javascript:alert(666)'};

ompile the template and apply data binding w/automatic contextual escaping
he resulted html is '<a href="x-javascript:alert(666)">javascript:alert(666)</a>'
html = Handlebars.compile(html)(data);
ript>
Advanced Usage for Pre-processing Templates Only

You can perform offline pre-processing for your templates using the provided CLI utility, which rewrites the templates to insert contextual output escaping filter markups. Fully compatible with the original Handlebars, the rewritten templates can be further compiled and data-binded with secure-handlebars-helpers.

To achieve this, install the secure-handlebars npm globally, so it can be used in any project.

install secure-handlebars -g

Given a handlebars template file named sample.hbs like so:

ctype html>
l><title>{{title}}</title></html>

Get the template with contextual escaping filters inserted:

lebarspp sample.hbs > sample.shbs

The pre-processed template file sample.shbs that is fully-compatible with the original (runtime) Handlebars:

ctype html>
l><title>{{{yd title}}}</title></html>

These rewritten templates can then go through the standard Handlebars pre-compilation process, and be used with secure-handlebars-helpers during runtime compilation. On the other hand, this utility also faciilates statistics collection. For instance, you can write a simple script to count the number of dangerous contexts (such as <script>{{script}}</script>).

Development
How to test
test
Known Limitations & Issues
Warnings and Workarounds

When output expressions are found inside dangerous (yet-to-be-supported) contexts, we echo warnings and gracefully fallback to apply the default Handlebars escapeExpression(). These warnings are indications of potential security exploits, and thus require closer inspections. Instead of simply abusing {{{raw_expression}}} to suppress the warnings, here are some alternative suggestions to secure your applications.

License

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


This work is supported by the National Institutes of Health's National Center for Advancing Translational Sciences, Grant Number U24TR002306. This work is solely the responsibility of the creators and does not necessarily represent the official views of the National Institutes of Health.