ホームページ >バックエンド開発 >Golang >golang静的サービスが隠されています

golang静的サービスが隠されています

WBOY
WBOYオリジナル
2023-05-10 15:41:37653ブラウズ

Go 言語を使用してプロジェクトやサービスを開発する場合、スタイル シート、画像、HTML ファイルなどの静的ファイルやリソースをプロジェクトに提供する必要がある場合があります。ただし、これらのリソースを提供している間は、セキュリティ上の問題が発生する可能性があるため、これらのファイルをパブリック ネットワークに公開したくありません。そこで、この記事では、Go 言語を使用して静的ファイルまたはリソースを提供し、それらを非表示にする方法を検討します。

従来の方法

従来の方法では、プログラム内で静的ファイルまたはリソースのパスを読み取り、これらのパスをブラウザーに送信することで、静的ファイルまたはリソースを提供できます。このプロセスには、多くの場合、次の手順が含まれます。

  1. ルート プロセッサを作成します。
  2. リクエスト パスを解析し、ローカル ファイル パスにマップします。
  3. ファイルが存在する場合は、それを開いてブラウザに送信します。
  4. ファイルが存在しない場合は、404 エラー コードを返します。

この方法の欠点は、ファイルにアクセスすると、ファイルの完全なパスがブラウザのアドレス バーに表示されることです。攻撃者はブラウザからパス情報を取得して攻撃を開始できるため、このセキュリティ上の欠陥が脆弱性を引き起こす可能性があります。

ファイルを隠す

ファイル ディレクトリを隠すには、Go 言語の組み込み net/http パッケージの FileServer 関数を使用できます。 FileServer 関数は、ローカル ファイル システム ディレクトリにアクセスしてファイルの内容を返すことができ、HTTP リクエストなども自動的に処理します。 FileServer 関数を使用するには、まず新しいルート プロセッサを作成し、それをファイル サーバーにマップする必要があります。

func main() {
    http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
    http.ListenAndServe(":8080", nil)
}

ここで、/static/ は使用する仮想ディレクトリ、static はローカル ファイルです。システム内の実際のディレクトリ。 http.StripPrefix() 関数を使用すると、静的ファイルのパス プレフィックスを削除できます。 http.FileServer() 関数は、新しいファイル サーバー インスタンスを作成します。

ファイルパス

この方法を使用すると、ブラウザに表示されるパスには、設定した仮想ディレクトリのみが表示されます。このようにして、ファイル ディレクトリを非表示にすることができます。たとえば、test.html というファイルの場合、ローカル ファイル システムの /static ディレクトリに配置すると、http://localhost:8080/static/test.html からアクセスできるようになります。

gzip 圧縮を使用する

ファイル パスを隠すことに加えて、gzip 圧縮テクノロジを使用してパフォーマンスをさらに向上させることもできます。 gzip 圧縮を使用すると、クライアントに送信されるファイル サイズを削減できるため、読み込み速度とクライアントの応答時間が向上します。 gzip 圧縮を使用するには、ルート プロセッサにコードを追加する必要があります。

func main() {
    staticHandler := http.StripPrefix("/static/", http.FileServer(http.Dir("static")))
    http.Handle("/static/", gzipFileServer(staticHandler))
    http.ListenAndServe(":8080", nil)
}

func gzipFileServer(handler http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
            w.Header().Set("Content-Encoding", "gzip")
            gz := gzip.NewWriter(w)
            defer gz.Close()
            gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w}
            handler.ServeHTTP(gzr, r)
            return
        }
        handler.ServeHTTP(w, r)
    }
}

type gzipResponseWriter struct {
    io.Writer
    http.ResponseWriter
}

func (w gzipResponseWriter) Write(b []byte) (int, error) {
    return w.Writer.Write(b)
}

このルート プロセッサは、リクエストを処理するために新しい gzipFileServer 関数を使用することを除いて、以前のものと同様です。その中で、リクエスト ヘッダーの Accept-Encoding フィールドを解析し、それに gzip が含まれている場合は、gzip 圧縮を使用してファイルを処理します。それ以外の場合は、元のファイルを使用して処理します。

圧縮が完了したら、クライアントが応答を正しく解凍できるように、応答ヘッダーの Content-Encoding を gzip に設定する必要があります。

実際、これは単なる単純な例です。実際には、上記のコードを独自のサービスに統合し、さらにテストと最適化を実施する必要があります。

概要

Go 言語が提供する FileServer 関数を使用すると、静的ファイルやリソースを非表示にしてセキュリティを保護できます。さらに、gzip 圧縮テクノロジーを使用してパフォーマンスを向上させることもできます。これらのテクノロジは、より安全で効率的な静的ファイルやリソース サービスを構築するのに役立ち、Go 言語を使用して開発する場合はすべて非常に実践的なスキルです。

以上がgolang静的サービスが隠されていますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。