Skip to content

Commit

Permalink
Fix #1693: file.Filename should not be trusted (#1699)
Browse files Browse the repository at this point in the history
  • Loading branch information
ganlvtech authored and thinkerou committed Dec 17, 2018
1 parent f67d7a9 commit 1542eff
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 2 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,10 @@ ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou]

References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](examples/upload-file/single).

`file.Filename` **SHOULD NOT** be trusted. See [`Content-Disposition` on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Directives) and [#1693](https://github.com/gin-gonic/gin/issues/1693)

> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done.
```go
func main() {
router := gin.Default()
Expand Down
4 changes: 3 additions & 1 deletion examples/upload-file/multiple/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"fmt"
"net/http"
"path/filepath"

"github.com/gin-gonic/gin"
)
Expand All @@ -25,7 +26,8 @@ func main() {
files := form.File["files"]

for _, file := range files {
if err := c.SaveUploadedFile(file, file.Filename); err != nil {
filename := filepath.Base(file.Filename)
if err := c.SaveUploadedFile(file, filename); err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))
return
}
Expand Down
4 changes: 3 additions & 1 deletion examples/upload-file/single/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package main
import (
"fmt"
"net/http"
"path/filepath"

"github.com/gin-gonic/gin"
)
Expand All @@ -23,7 +24,8 @@ func main() {
return
}

if err := c.SaveUploadedFile(file, file.Filename); err != nil {
filename := filepath.Base(file.Filename)
if err := c.SaveUploadedFile(file, filename); err != nil {
c.String(http.StatusBadRequest, fmt.Sprintf("upload file err: %s", err.Error()))
return
}
Expand Down

0 comments on commit 1542eff

Please sign in to comment.