Markup方法是对HTML的一种安全标记,并将其转化为str类型
其目的是为了防止XSS攻击
XSS攻击是指利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序
>>>from flask import Markup
>>>Markup('Hello,<em>World</em>!')
Markup('Hello,<em>World</em>!')
>>>Markup(42)
Markup('42')
上述代码单纯的将Markup的参数转换为了str类型
>>> Markup.escape('Hello,<em>World</em>!')
Markup('Hello,<em>World</em>!')
使用escape()类方法,可以将文本字符串转义
也就是在html中& lt;是代表着<,其它符号类似
如果信任某个变量,可以为该变量设置safe过滤器
这将会关闭HTML的自动转义,如下:
<p>{{'<em>name</em>'|safe}}</p>
Markup的源码分析(python)
#Markup是个类
class Markup(text_type):
'''
text_type参数:一个文本类型,或者一个已经准备好安全地插入HTML或XML文档的字符串
'''
# 创建__new__方法
def __new__(cls, base=u"", encoding=None, errors="strict"):
# hasattr():返回对象是否具有给定名称的属性。
# 如果base具有__html__属性,则将属性实例化给base
if hasattr(base, "__html__"):
base = base.__html__()
# 如果 encoding 编码是 None;
# 为类方法的参数‘text_type’创建一个新的参数值‘base’
# 也就是说,如果没有对参数设置,默认输出base.__html__的属性值。
if encoding is None:
return text_type.__new__(cls, base)
# 最终返回默认值
return text_type.__new__(cls, base, encoding, errors)
# unescape:转换回文本字符串
# 即unescape('<')会输出<
def unescape(self):
"""
将转义的标记转换回文本字符串。将HTML实体替换为它们所代表的字符。
HTML实体:有些字符(如'<'小于号)是不允许在文本中使用的。要在HTML中显示(<)这个字符,我们就必须使用实体字符。
"""
return _entity_re.sub(handle_match, text_type(self))
# striptags():剥离标签
# Markup.striptags('<em>hello</em>')会输出'hello'
def striptags(self):
"""
删除标记,并将空格标准化为单个空格。例如:
>>> Markup('Main »\t<em>About</em>').striptags()
'Main » About'
"""
stripped = u" ".join(_striptags_re.sub("", self).split())
return Markup(stripped).unescape()
#escape():转义字符串,做的是unescape()相反的工作
def escape(cls, s):
rv = escape(s)
if rv.__class__ is not cls:
return cls(rv)
return rv