Maison  >  Article  >  développement back-end  >  Échapper "/" dans les modèles

Échapper "/" dans les modèles

WBOY
WBOYavant
2024-02-06 09:45:081043parcourir

Échapper / dans les modèles

Contenu de la question

Je souhaite transmettre une chaîne comme "avatars/avatar.png" mais lorsque je la passe au modèle, j'obtiens des échappements de caractères. J'ai donc écrit une fonction passée au template :

var tpl *template.Template

func init() {
    tpl = template.Must(template.ParseGlob("1Forum/static/html/*.html"))
    tpl = tpl.Funcs(template.FuncMap{
        "unescape": func(s string) string {
            unescaped, err := url.PathUnescape(s)
            if err != nil {
                return s
            }
            return unescaped
        },
    })
}

{{unescape .User.Avatar}}

Mais j'obtiens toujours "fonction non définie 'unescape'". L'évasion n'est-elle pas définie ?

"net/url" a été importé.


Bonne réponse


unescape n'est pas défini ?

Techniquement non. Vous l'avez défini, mais vous l'avez fait trop tard. Le fait qu'une fonction soit définie est vérifié lors de l'analyse syntaxique, pas lors de l'exécution. Vous avez . Ce n'est pas normal. parseglob ,然后您执行 tpl.func(...)Faites plutôt ceci :

func init() {
    tpl = template.Must(template.New("t").Funcs(template.FuncMap{
        "unescape": func(s string) string {
            unescaped, err := url.PathUnescape(s)
            if err != nil {
                return s
            }
            return unescaped
        },
    }).ParseGlob("1Forum/static/html/*.html"))
}

Veuillez noter que l'échappement est une fonctionnalité

sûre

qui se produit en fonction du contexte dans lequel vous travaillez avec les données et de la sortieunescape 可能不会帮助您“欺骗”您的方式,因为转义将会完成在 unescape, et non de son entrée. En d'autres termes, lorsque vous faites {{unescape .}}, l'analyseur peut le convertir en {{urlescaper}> selon le contexte (urlescaper est une fonction d'échappement interne). Pour éviter cela, lorsque vous souhaitez utiliser une

chaîne sûre connue

littéralement dans un modèle, vous devez utiliser Entrée chaîne {{unescape .}} 时,解析器可能会根据上下文将其转换为 {{unescape . | urlescaper}}urlescaper 是一个内部转义函数)。为了避免这种情况,当您想要在模板中逐字使用已知的安全字符串时,您应该使用 输入字符串而不是 unescape au lieu de unescape.

Voir Exemple de terrain de jeu.

Pour plus d'informations sur le contexte, l'échappement, la saisie de chaînes, etc., lisez la documentation du package, tout est expliqué clairement.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer