Maison  >  Article  >  développement back-end  >  service statique golang caché

service statique golang caché

WBOY
WBOYoriginal
2023-05-10 15:41:37612parcourir

Lorsque nous utilisons le langage Go pour développer des projets ou des services, nous devons parfois fournir des fichiers ou des ressources statiques dans le projet, tels que des feuilles de style, des images, des fichiers HTML, etc. Cependant, tout en fournissant ces ressources, nous ne souhaitons pas exposer ces fichiers au réseau public car cela pourrait entraîner des problèmes de sécurité. Ainsi, dans cet article, nous allons explorer comment utiliser le langage Go pour servir des fichiers ou des ressources statiques et les masquer.

Méthode traditionnelle

Dans la méthode traditionnelle, nous pouvons servir des fichiers ou des ressources statiques en lisant les chemins des fichiers ou des ressources statiques dans le programme et en envoyant ces chemins au navigateur. Ce processus implique souvent les étapes suivantes :

  1. Créer un processeur d'itinéraire.
  2. Analysez le chemin de la requête et mappez-le à un chemin de fichier local.
  3. Si le fichier existe, ouvrez-le et envoyez-le au navigateur.
  4. Si le fichier n'existe pas, un code d'erreur 404 sera renvoyé.

L'inconvénient de cette méthode est que le chemin complet du fichier sera exposé dans la barre d'adresse du navigateur lors de l'accès au fichier. Cette faille de sécurité peut conduire à des vulnérabilités car les attaquants peuvent obtenir des informations de chemin du navigateur pour lancer des attaques.

Masquer les fichiers

Afin de masquer le répertoire de fichiers, nous pouvons utiliser la fonction FileServer dans le package net/http intégré du langage Go. La fonction FileServer peut accéder au répertoire du système de fichiers local et renvoyer le contenu du fichier, et gère également automatiquement les requêtes HTTP, etc. Pour utiliser la fonction FileServer, nous devons d'abord créer un nouveau processeur de route et le mapper à notre serveur de fichiers :

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

où /static/ est le répertoire virtuel que nous voulons utiliser et static est le répertoire réel dans le système de fichiers local. Table de contenu. L'utilisation de la fonction http.StripPrefix() peut nous aider à supprimer le préfixe de chemin des fichiers statiques. La fonction http.FileServer() crée une nouvelle instance de serveur de fichiers.

Chemin du fichier

Lors de l'utilisation de cette méthode, le chemin affiché sur le navigateur affichera uniquement le répertoire virtuel que nous avons défini. De cette façon, notre répertoire de fichiers peut être masqué. Par exemple, pour un fichier appelé test.html, si nous le plaçons dans le répertoire /static du système de fichiers local, alors il sera accessible via http://localhost:8080/static/test.html.

Utiliser la compression gzip

En plus de masquer les chemins de fichiers, nous pouvons également utiliser la technologie de compression gzip pour améliorer encore les performances. En utilisant la compression gzip, nous pouvons réduire la taille du fichier envoyé au client, améliorant ainsi la vitesse de chargement et le temps de réponse du client. Pour utiliser la compression gzip, nous devons ajouter du code au processeur de route :

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)
}

Ce processeur de route est toujours similaire au précédent, sauf que nous utilisons une nouvelle fonction gzipFileServer pour gérer la requête. Dans celui-ci, nous analysons le champ Accept-Encoding dans l'en-tête de la requête et, s'il contient gzip, traitons le fichier en utilisant la compression gzip. Sinon, nous utiliserons le fichier original pour le traitement.

Une fois la compression terminée, nous devons définir le Content-Encoding dans l'en-tête de réponse sur gzip pour garantir que le client peut décompresser correctement la réponse.

En fait, ce n'est qu'un exemple simple. En pratique, nous devons intégrer le code ci-dessus dans notre propre service et effectuer davantage de tests et d'optimisation.

Résumé

En utilisant la fonction FileServer fournie par le langage Go, nous pouvons masquer des fichiers ou des ressources statiques, protégeant ainsi leur sécurité. De plus, nous pouvons également utiliser la technologie de compression gzip pour améliorer les performances. Ces technologies peuvent nous aider à créer des fichiers statiques ou des services de ressources plus sécurisés et plus efficaces, et ce sont toutes des compétences très pratiques lors du développement à l'aide du langage Go.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn