// Discussion:
// Package html/template already contextually escapes all pipelines to
// produce HTML output safe against code injection. Manually escaping
// pipeline output using the predefined escapers "html" or "urlquery" is
// unnecessary, and may affect the correctness or safety of the escaped
// pipeline output in Go 1.8 and earlier.
//
// In most cases, such as the given example, this error can be resolved by
// simply removing the predefined escaper from the pipeline and letting the
// contextual autoescaper handle the escaping of the pipeline. In other
// instances, where the predefined escaper occurs in the middle of a
// pipeline where subsequent commands expect escaped input, e.g.
// {{.X | html | makeALink}}
// where makeALink does
// return `
link`
// consider refactoring the surrounding template to make use of the
// contextual autoescaper, i.e.
//
link
//
// To ease migration to Go 1.9 and beyond, "html" and "urlquery" will
// continue to be allowed as the last command in a pipeline. However, if the
// pipeline occurs in an unquoted attribute value context, "html" is
// disallowed. Avoid using "html" and "urlquery" entirely in new templates.
ErrPredefinedEscaper
// ErrEscapeAction: "cannot escape action ..."
// Discussion:
// Error returned while escaping an action using EscaperForContext.
// Refer to error message for more details.
// TODO: remove this error type and replace it with more informative sanitization errors.
ErrEscapeAction
// ErrCSPCompatibility: `"javascript:" URI disallowed for CSP compatibility`,
// "inline event handler ... is disallowed for CSP compatibility
// Examples:
//
A thing.
//
foo
// Discussion:
// Inline event handlers (onclick="...", onerror="...") and
//
links can be used to run scripts,
// so an attacker who finds an XSS bug could inject such HTML
// and execute malicious JavaScript. These patterns must be
// refactored into safer alternatives for compatibility with
// Content Security Policy (CSP).
//
// For example, the following HTML that contains an inline event handler:
//
// A thing.
// can be refactored into:
// A thing.
//
//
// Likewise, the following HTML containng a javascript: URI:
// foo
// can be refactored into:
//
foo
//
ErrCSPCompatibility
// All JS templates inside script literals have to be balanced; otherwise a concatenation such as
// can contain XSS if data contains user-controlled escaped strings (e.g. as JSON).
ErrUnbalancedJsTemplate
)
func (e *Error) Error() string {
switch {
case e.Node != nil:
loc, _ := (*parse.Tree)(nil).ErrorContext(e.Node)
return fmt.Sprintf("html/template:%s: %s", loc, e.Description)
case e.Line != 0:
return fmt.Sprintf("html/template:%s:%d: %s", e.Name, e.Line, e.Description)
case e.Name != "":
return fmt.Sprintf("html/template:%s: %s", e.Name, e.Description)
}
return "html/template: " + e.Description
}
// errorf creates an error given a format string f and args.
// The template Name still needs to be supplied.
func errorf(k ErrorCode, node parse.Node, line int, f string, args ...interface{}) *Error {
return &Error{k, node, "", line, fmt.Sprintf(f, args...)}
}