Makotemplate et les protections XSS

Le jeu. 09 décembre 2010 par Kasey

Comme vous le savez peut-être, j'utilise maintenant depuis quelque temps le moteur de template python makotemplate. Étant plutôt sensible à la sécurité, j'utilisais un petit ensemble de fonctions me permettant de protéger mes codes contre les XSS. Cependant en lisant une page web de l'OWASP (http://www.pythonsecurity.org/wiki/mako/), je suis tombé sur un article intéressant traitant des mécanismes inclus dans Mako :)

Mako inclus donc une série de filtres protègent du XSS (entre autres).

Comment les mettre en place ?

Dès la configuration

render = render_mako(directories=['templates'],input_encoding='utf-8',output_encoding='utf-8',default_filters=['u'])

Dans les templates pour un filtrage ciblé

${ma_variable|u}

Ainsi

<script>alert('coucou');</script>

Deviens :

%3Cscript%3Ealert%28%27coucou%27%29%3B%3C%2Fscript%3E

Attention au double filtrage si vous cumulez configuration et filtre manuel :

%253Cscript%253Ealert%2528%2527coucou%2527%2529%253B%253C%252Fscript%253E

Protection générale

De manière générale si vous souhaitez vous protéger des XSS en python, vous pouvez récupérer les deux fonctions suivantes issues du code source de mako :

# This module is part of Mako and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php

xml_escapes = {
    '&' : '&',
    '>' : '>', 
    '<' : '<', 
    '"' : '"',   # also " in html-only
    "'" : '''    # also ' in html-only    
}
# XXX: " is valid in HTML and XML
#      ' is not valid HTML, but is valid XML

def xml_escape(string):
    return re.sub(r'([&<"\'>])', lambda m: xml_escapes[m.group()], string)