flask之Markup()的理解

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,&lt;em&gt;World&lt;/em&gt;!')

使用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('&lt;')会输出< 
    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 &raquo;\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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值