Skip to content

Commit 254b9f8

Browse files
committed
Fix #403, Fix #406
1 parent 31ccfc4 commit 254b9f8

File tree

5 files changed

+52
-9
lines changed

5 files changed

+52
-9
lines changed

_test/extra.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -752,3 +752,22 @@ a <!-- b -->
752752
<pre>
753753
</pre>
754754
//= = = = = = = = = = = = = = = = = = = = = = = =//
755+
756+
59: Raw HTML tag with one new line
757+
//- - - - - - - - -//
758+
<img src=./.assets/logo.svg
759+
/>
760+
//- - - - - - - - -//
761+
<p><img src=./.assets/logo.svg
762+
/></p>
763+
//= = = = = = = = = = = = = = = = = = = = = = = =//
764+
765+
60: Raw HTML tag with multiple new lines
766+
//- - - - - - - - -//
767+
<img src=./.assets/logo.svg
768+
769+
/>
770+
//- - - - - - - - -//
771+
<p>&lt;img src=./.assets/logo.svg</p>
772+
<p>/&gt;</p>
773+
//= = = = = = = = = = = = = = = = = = = = = = = =//

extra_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,3 +203,19 @@ func TestManyCommentPerformance(t *testing.T) {
203203
t.Error("Parsing processing instructions took too long")
204204
}
205205
}
206+
207+
func TestDangerousURLStringCase(t *testing.T) {
208+
markdown := New()
209+
210+
source := []byte(`[Basic](javascript:alert('Basic'))
211+
[CaseInsensitive](JaVaScRiPt:alert('CaseInsensitive'))
212+
`)
213+
expected := []byte(`<p><a href="">Basic</a>
214+
<a href="">CaseInsensitive</a></p>
215+
`)
216+
var b bytes.Buffer
217+
_ = markdown.Convert(source, &b)
218+
if !bytes.Equal(expected, b.Bytes()) {
219+
t.Error("Dangerous URL should ignore cases:\n" + string(testutil.DiffPretty(expected, b.Bytes())))
220+
}
221+
}

parser/raw_html.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ func (s *rawHTMLParser) Parse(parent ast.Node, block text.Reader, pc Context) as
4848
}
4949

5050
var tagnamePattern = `([A-Za-z][A-Za-z0-9-]*)`
51-
51+
var spaceOrOneNewline = `(?:[ \t]|(?:\r\n|\n){0,1})`
5252
var attributePattern = `(?:[\r\n \t]+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:[\r\n \t]*=[\r\n \t]*(?:[^\"'=<>` + "`" + `\x00-\x20]+|'[^']*'|"[^"]*"))?)`
53-
var openTagRegexp = regexp.MustCompile("^<" + tagnamePattern + attributePattern + `*[ \t]*/?>`)
54-
var closeTagRegexp = regexp.MustCompile("^</" + tagnamePattern + `\s*>`)
53+
var openTagRegexp = regexp.MustCompile("^<" + tagnamePattern + attributePattern + `*` + spaceOrOneNewline + `*/?>`)
54+
var closeTagRegexp = regexp.MustCompile("^</" + tagnamePattern + spaceOrOneNewline + `*>`)
5555

5656
var openProcessingInstruction = []byte("<?")
5757
var closeProcessingInstruction = []byte("?>")

renderer/html/html.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -901,20 +901,24 @@ var bVb = []byte("vbscript:")
901901
var bFile = []byte("file:")
902902
var bData = []byte("data:")
903903

904+
func hasPrefix(s, prefix []byte) bool {
905+
return len(s) >= len(prefix) && bytes.Equal(bytes.ToLower(s[0:len(prefix)]), bytes.ToLower(prefix))
906+
}
907+
904908
// IsDangerousURL returns true if the given url seems a potentially dangerous url,
905909
// otherwise false.
906910
func IsDangerousURL(url []byte) bool {
907-
if bytes.HasPrefix(url, bDataImage) && len(url) >= 11 {
911+
if hasPrefix(url, bDataImage) && len(url) >= 11 {
908912
v := url[11:]
909-
if bytes.HasPrefix(v, bPng) || bytes.HasPrefix(v, bGif) ||
910-
bytes.HasPrefix(v, bJpeg) || bytes.HasPrefix(v, bWebp) ||
911-
bytes.HasPrefix(v, bSvg) {
913+
if hasPrefix(v, bPng) || hasPrefix(v, bGif) ||
914+
hasPrefix(v, bJpeg) || hasPrefix(v, bWebp) ||
915+
hasPrefix(v, bSvg) {
912916
return false
913917
}
914918
return true
915919
}
916-
return bytes.HasPrefix(url, bJs) || bytes.HasPrefix(url, bVb) ||
917-
bytes.HasPrefix(url, bFile) || bytes.HasPrefix(url, bData)
920+
return hasPrefix(url, bJs) || hasPrefix(url, bVb) ||
921+
hasPrefix(url, bFile) || hasPrefix(url, bData)
918922
}
919923

920924
func nodeToHTMLText(n ast.Node, source []byte) []byte {

text/reader.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,10 @@ func findSubMatchReader(r Reader, reg *regexp.Regexp) [][]byte {
554554
bs := bb.Bytes()
555555
var result [][]byte
556556
for i := 0; i < len(match); i += 2 {
557+
if match[i] < 0 {
558+
result = append(result, []byte{})
559+
continue
560+
}
557561
result = append(result, bs[match[i]:match[i+1]])
558562
}
559563

0 commit comments

Comments
 (0)