summaryrefslogtreecommitdiff
path: root/vendor/github.com/microcosm-cc/bluemonday/policy.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/microcosm-cc/bluemonday/policy.go')
-rw-r--r--vendor/github.com/microcosm-cc/bluemonday/policy.go40
1 files changed, 39 insertions, 1 deletions
diff --git a/vendor/github.com/microcosm-cc/bluemonday/policy.go b/vendor/github.com/microcosm-cc/bluemonday/policy.go
index 995f46c2d..b4f09879a 100644
--- a/vendor/github.com/microcosm-cc/bluemonday/policy.go
+++ b/vendor/github.com/microcosm-cc/bluemonday/policy.go
@@ -118,9 +118,18 @@ type Policy struct {
allowURLSchemes map[string][]urlPolicy
// These regexps are used to match allowed URL schemes, for example
- // if one would want to allow all URL schemes, they would add `.+`
+ // if one would want to allow all URL schemes, they would add `.+`.
+ // However pay attention as this can lead to XSS being rendered thus
+ // defeating the purpose of using a HTML sanitizer.
+ // The regexps are only considered if a schema was not explicitly
+ // handled by `AllowURLSchemes` or `AllowURLSchemeWithCustomPolicy`.
allowURLSchemeRegexps []*regexp.Regexp
+ // If srcRewriter is not nil, it is used to rewrite the src attribute
+ // of tags that download resources, such as <img> and <script>.
+ // It requires that the URL is parsable by "net/url" url.Parse().
+ srcRewriter urlRewriter
+
// If an element has had all attributes removed as a result of a policy
// being applied, then the element would be removed from the output.
//
@@ -196,6 +205,8 @@ type stylePolicyBuilder struct {
type urlPolicy func(url *url.URL) (allowUrl bool)
+type urlRewriter func(*url.URL)
+
type SandboxValue int64
const (
@@ -575,6 +586,33 @@ func (p *Policy) AllowURLSchemesMatching(r *regexp.Regexp) *Policy {
return p
}
+// RewriteSrc will rewrite the src attribute of a resource downloading tag
+// (e.g. <img>, <script>, <iframe>) using the provided function.
+//
+// Typically the use case here is that if the content that we're sanitizing
+// is untrusted then the content that is inlined is also untrusted.
+// To prevent serving this content on the same domain as the content appears
+// on it is good practise to proxy the content through an additional domain
+// name as this will force the web client to consider the inline content as
+// third party to the main content, thus providing browser isolation around
+// the inline content.
+//
+// An example of this is a web mail provider like fastmail.com , when an
+// email (user generated content) is displayed, the email text is shown on
+// fastmail.com but the inline attachments and content are rendered from
+// fastmailusercontent.com . This proxying of the external content on a
+// domain that is different to the content domain forces the browser domain
+// security model to kick in. Note that this only applies to differences
+// below the suffix (as per the publix suffix list).
+//
+// This is a good practise to adopt as it prevents the content from being
+// able to set cookies on the main domain and thus prevents the content on
+// the main domain from being able to read those cookies.
+func (p *Policy) RewriteSrc(fn urlRewriter) *Policy {
+ p.srcRewriter = fn
+ return p
+}
+
// RequireNoFollowOnLinks will result in all a, area, link tags having a
// rel="nofollow"added to them if one does not already exist
//