Golang을 사용하여 사용자 지정 헤더로 정적 파일 제공

10907 단어 owaspsecuritygo

기본 Golang 정적 파일 서버



Golang의 일반적인 용도 중 하나는 콘텐츠를 제공하는 서버를 생성하는 것입니다. 이는 API이거나 일부 파일을 제공하는 것입니다. API를 충분히 오래 개발하면 곧 HTML, JS, CSS와 같은 정적 콘텐츠를 제공해야 하는 자신을 발견하게 될 것입니다.

다음을 예로 들어 보겠습니다.

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Basic HTML Document</title>
  </head>
  <link
    href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
    rel="stylesheet"
    integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x"
    crossorigin="anonymous"
  />
  <link rel="stylesheet" href="style.css">
  <body>
    <h1><TITLE></TITLE></h1>
    <script src="script.js"></script>
    <div class="blue">This is Blue</div>
    <button class="btn btn-primary m-5">Bootstrap Button</button>
  </body>
</html>


script.js:

document.write('this comes from a script')


스타일.css:

.blue {
  background-color: blue;
  color: white;
}


첫 번째 단계는 다음 파일을 우리가 편리하게 이름을 지정한 폴더 안에 넣는 것입니다 static . 다음으로 루트 디렉터리에 main.go를 만들고 프로젝트의 폴더 구조는 다음과 같습니다.

.
├── main.go
└── static
    ├── index.html
    ├── script.js
    └── style.css


Go로 작성된 파일 제공 서버의 간단한 버전은 http.FileServer 방법을 활용합니다.

main.go:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("./static"))
    http.Handle("/", fs)

    fmt.Printf("Server started at port 3000")
    err := http.ListenAndServe(":3000", nil)
    if err == nil {
        log.Fatal(err)
    }
}

go run main.go로 위를 실행하고 http://localhost:3000 탐색하면 다음 페이지가 표시됩니다.


정적 사이트 예



이제 그것이 당신에게 필요한 전부라면 여기서 멈추고 당신의 즐거운 길을 가는 것이 좋을 것입니다. 그러나 프로덕션 환경에서 문서에 특정 헤더를 추가해야 하는 경우가 종종 있습니다.
nt는 보안 목적으로 응답을 요청합니다.

X-Frame-Options 헤더 램블링



이러한 헤더의 예는 X-Frame-Options 헤더입니다. 클릭재킹 공격의 일부는 공격자가 기본 사이트를 <iframe> 태그에 포함할 수 있으므로 공격자의 사이트가 다른 사이트를 사칭하면서 사용자의 입력을 스누핑할 수 있다는 것입니다.


클릭재킹 예

X-Frame-Options 헤더가 하는 일은 legitsite.com의 도메인만 <iframe> 태그 안에 응답을 넣을 수 있도록 허용한다고 브라우저에 알려주는 것입니다. 따라서 불법leg1tsite.comlegitsite.com 내부의 <iframe> 브라우저가 렌더링에 동의하지 않기 때문입니다.


클릭재킹 방지


물론 이것은 웹 사이트를 보호하는 데 필요한 유일한 보안 헤더는 아니지만 일반적인 웹 취약성에 대한 자세한 내용은 확인하십시오owasp.org.

http.FileServer를 사용하여 헤더 구현



따라서 헤더를 구현한다는 아이디어는 미들웨어 역할을 하는 fs 변수 위에 래퍼를 만드는 것입니다. 물론 래퍼에 X-Frame-Options 헤더를 적용하는 동안 래퍼에서 모든 종류의 전처리를 수행할 수 있으므로 단순히 헤더를 추가하는 것보다 더 많은 문제를 해결할 수 있습니다. main.go는 다음과 같이 변경됩니다.

main.go:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    fs := http.FileServer(http.Dir("./static"))
    http.Handle("/", addHeaders(fs))

    fmt.Printf("Server started at port 3000")
    err := http.ListenAndServe(":3000", nil)
    if err == nil {
        log.Fatal(err)
    }
}

func addHeaders(fs http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        w.Header().Add("X-Frame-Options", "DENY")
        fs.ServeHTTP(w, r)
    }
}


이렇게 변경하면 완료됩니다! localhost에 대한 모든 문서 요청에는 X-Frame-Options 헤더와 추가하려는 헤더가 있습니다.


헤더가 추가된 응답

좋은 웹페이지 즐겨찾기