Skip to content

Commit 9f5bb1c

Browse files
committed
Prevent XSS
1 parent 75d66c3 commit 9f5bb1c

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

i18n.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package revel
66

77
import (
88
"fmt"
9+
"html/template"
910
"os"
1011
"path/filepath"
1112
"regexp"
@@ -85,7 +86,18 @@ func Message(locale, message string, args ...interface{}) string {
8586

8687
if len(args) > 0 {
8788
TRACE.Printf("Arguments detected, formatting '%s' with %v", value, args)
88-
value = fmt.Sprintf(value, args...)
89+
safeArgs := make([]interface{}, 0, len(args))
90+
for _, arg := range args {
91+
switch a := arg.(type) {
92+
case template.HTML:
93+
safeArgs = append(safeArgs, a)
94+
case string:
95+
safeArgs = append(safeArgs, template.HTML(template.HTMLEscapeString(a)))
96+
default:
97+
safeArgs = append(safeArgs, a)
98+
}
99+
}
100+
value = fmt.Sprintf(value, safeArgs...)
89101
}
90102

91103
return value

i18n_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package revel
66

77
import (
8+
"html/template"
89
"io/ioutil"
910
"log"
1011
"net/http"
@@ -72,6 +73,14 @@ func TestI18nMessage(t *testing.T) {
7273
if message := Message("nl", "unknown message"); message != "??? unknown message ???" {
7374
t.Error("Message 'unknown message' is not supposed to exist")
7475
}
76+
// XSS
77+
if message := Message("en", "arguments.string", "<img src=a onerror=alert(1) />"); message != "My name is &lt;img src=a onerror=alert(1) /&gt;" {
78+
t.Error("XSS protection for messages is broken:", message)
79+
}
80+
// Avoid escaping HTML
81+
if message := Message("en", "arguments.string", template.HTML("<img src=a onerror=alert(1) />")); message != "My name is <img src=a onerror=alert(1) />" {
82+
t.Error("Passing safe HTML to message is broken:", message)
83+
}
7584
}
7685

7786
func TestI18nMessageWithDefaultLocale(t *testing.T) {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy