diff options
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/tool/path.go | 9 | ||||
-rw-r--r-- | pkg/tool/path_test.go | 16 |
2 files changed, 25 insertions, 0 deletions
diff --git a/pkg/tool/path.go b/pkg/tool/path.go index e478abc5..3c0d2d02 100644 --- a/pkg/tool/path.go +++ b/pkg/tool/path.go @@ -4,9 +4,18 @@ package tool +import ( + "strings" +) + // IsSameSiteURLPath returns true if the URL path belongs to the same site, false otherwise. // False: //url, http://url, /\url // True: /url func IsSameSiteURLPath(url string) bool { return len(url) >= 2 && url[0] == '/' && url[1] != '/' && url[1] != '\\' } + +// SanitizePath sanitizes user-defined file paths to prevent remote code execution. +func SanitizePath(path string) string { + return strings.TrimLeft(path, "./") +} diff --git a/pkg/tool/path_test.go b/pkg/tool/path_test.go index 530238ce..c9e18294 100644 --- a/pkg/tool/path_test.go +++ b/pkg/tool/path_test.go @@ -30,3 +30,19 @@ func Test_IsSameSiteURLPath(t *testing.T) { } }) } + +func Test_SanitizePath(t *testing.T) { + Convey("Sanitize malicious user-defined path", t, func() { + testCases := []struct { + path string + expect string + }{ + {"../../../../../../../../../data/gogs/data/sessions/a/9/a9f0ab6c3ef63dd8", "data/gogs/data/sessions/a/9/a9f0ab6c3ef63dd8"}, + + {"data/sessions/a/9/a9f0ab6c3ef63dd8", "data/sessions/a/9/a9f0ab6c3ef63dd8"}, + } + for _, tc := range testCases { + So(SanitizePath(tc.path), ShouldEqual, tc.expect) + } + }) +} |