Jinja2模板注入 | python模板注入特殊属性 / 对象讲解

news/2024/7/4 1:20:11 标签: python, SSTI, class
class="baidu_pl">
class="article_content clearfix">
class="markdown_views prism-atom-one-dark">

在进行模板利用的时候需要使用特殊的属性和对象进行利用,这里对这些特殊属性及方法进行讲解
以下实验输出class="tags" href="/tags/PYTHON.html" title=python>python3版本为 3.10.4class="tags" href="/tags/PYTHON.html" title=python>python2版本为 2.7.13

特殊属性

  • __class__ 类实例上使用,它用于获取该实例对应的类
  • __base__ 用于获取父类
  • __mro__ (Method Resolution Order)。__mro__ 属性返回一个元组,其中包含了类的继承链

特殊方法

  • __subclasses__() 获取直接子类

其他

  • __globals__ 一个特殊的变量,不使用在类上,而是用于函数,获取全局变量的字典
  • __builtins__ 它包含了 Python 内置的函数、异常和对象。这个模块使内置函数和对象在全局作用域中可用,无需显式导入

class="toc">

👉 目录

  • 一、特殊属性
    • `__class__`
    • `__base__`
    • `__mro__ `
  • 二、特殊方法
  • 三、其他
    • `__globals__`
    • `__builtins__ `


一、特殊属性

class___22">__class__

使用在实例上,获取该实例对应的类

class="prism language-csharp">class="token keyword">class class="token class-name">Aclass="token punctuation">:
    class="token type-list">class="token class-name">pass
class="prism language-csharp">class="token function">printclass="token punctuation">(Aclass="token punctuation">)	# 类
class="token preprocessor property"># class="token return-type class-name">__main__class="token punctuation">.A

class="token function">printclass="token punctuation">(class="token function">Aclass="token punctuation">(class="token punctuation">)class="token punctuation">)	# 实例
class="token preprocessor property"># <__main__.A instance at 0x0000000002BA2348>

关系如下

class="prism language-csharp">class="token function">Aclass="token punctuation">(class="token punctuation">)class="token punctuation">.__class__ class="token operator">== A
class="token preprocessor property"># True

__base__

使用在类上,获取父类

class="prism language-csharp">class="token keyword">class class="token class-name">Aclass="token punctuation">:
    pass

class="token keyword">class class="token class-name">Bclass="token punctuation">(Aclass="token punctuation">)class="token punctuation">:
    pass

这里分两个情况, class="tags" href="/tags/PYTHON.html" title=python>python2和class="tags" href="/tags/PYTHON.html" title=python>python3

class="tags" href="/tags/PYTHON.html" title=python>python2

class="prism language-csharp">class="token function">printclass="token punctuation">(Bclass="token punctuation">)
class="token preprocessor property"># __main__.B

class="tags" href="/tags/PYTHON.html" title=python>python3

class="prism language-csharp">class="token function">printclass="token punctuation">(Bclass="token punctuation">)
class="token preprocessor property"># <class '__main__.B'>

我对这两个表示也不是很理解,但是只有class="tags" href="/tags/PYTHON.html" title=python>python3这种表示方式才能使用 __base__
比如class="tags" href="/tags/PYTHON.html" title=python>python3

class="prism language-csharp">class="token function">printclass="token punctuation">(Bclass="token punctuation">.__base__class="token punctuation">)
class="token preprocessor property"># <class '__main__.A'>

可以看到结果是父类 A

class="tags" href="/tags/PYTHON.html" title=python>python2我这里使用自带的类来演示
() 是tuple的实例
"" 是str的实例
[] 是list的实例

class="prism language-csharp">class="token function">printclass="token punctuation">(class="token punctuation">(class="token punctuation">)class="token punctuation">.__class__class="token punctuation">)
class="token function">printclass="token punctuation">(class="token string">""class="token punctuation">.__class__class="token punctuation">)
class="token function">printclass="token punctuation">(class="token punctuation">[class="token punctuation">]class="token punctuation">.__class__class="token punctuation">)

class="token preprocessor property"># <class 'tuple'>
class="token preprocessor property"># <class 'str'>
class="token preprocessor property"># <class 'list'>

可以发现输出的格式和class="tags" href="/tags/PYTHON.html" title=python>python3输出自定义类的相似
这里就可以使用 __base__

class="prism language-csharp">class="token function">printclass="token punctuation">(class="token punctuation">(class="token punctuation">)class="token punctuation">.__class__class="token punctuation">.__base__class="token punctuation">)
class="token preprocessor property"># <class 'object'>

__mro__

返回类的继承链

class="prism language-csharp">class="token keyword">class class="token class-name">Aclass="token punctuation">:
    pass

class="token keyword">class class="token class-name">Bclass="token punctuation">(Aclass="token punctuation">)class="token punctuation">:
    pass

class="token keyword">class class="token class-name">Cclass="token punctuation">(Bclass="token punctuation">)class="token punctuation">:
    pass

这里使用class="tags" href="/tags/PYTHON.html" title=python>python3演示,因为要以下输出格式才有效

class="prism language-csharp">class="token operator"><class="token keyword">class 'xxx'class="token operator">>

class="tags" href="/tags/PYTHON.html" title=python>python2 创建自定义类时没有这种效果

class="prism language-csharp">class="token function">printclass="token punctuation">(Cclass="token punctuation">.__mro__class="token punctuation">)
class="token preprocessor property"># (<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)

创建类时默认继承Object,所以继承链一共有3个对象
在这里插入图片描述

如果B此时多继承个D,那么C.__mro__ 就会有4个对象
在这里插入图片描述


二、特殊方法

classes___137">__subclasses__()

获取直接子类
__mro__不同,__subclasses__() 是一个方法,获取直接子类

class="prism language-csharp">class="token keyword">class class="token class-name">Aclass="token punctuation">:
    pass

class="token keyword">class class="token class-name">Bclass="token punctuation">(Aclass="token punctuation">)class="token punctuation">:
    pass

class="token keyword">class class="token class-name">Cclass="token punctuation">(Bclass="token punctuation">)class="token punctuation">:
    pass

class="token keyword">class class="token class-name">Dclass="token punctuation">(Aclass="token punctuation">)class="token punctuation">:
    pass

在这里插入图片描述
这里同样使用class="tags" href="/tags/PYTHON.html" title=python>python3做演示,返回的是一个列表

class="prism language-csharp">class="token function">printclass="token punctuation">(Aclass="token punctuation">.class="token function">__subclasses__class="token punctuation">(class="token punctuation">)class="token punctuation">)
class="token preprocessor property"># [<class '__main__.B'>, <class '__main__.D'>]

三、其他

__globals__

一个特殊的变量,不使用在类上,而是用于函数,获取全局变量的字典

class="prism language-csharp">hello class="token operator">= class="token string">"hello"
world class="token operator">= class="token string">"world"
class="prism language-csharp">class="token function">printclass="token punctuation">(testclass="token punctuation">.__globals__class="token punctuation">)
class="token preprocessor property"># {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000211AE5D4A60>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\wlb\\Desktop\\test\\class="tags" href="/tags/PYTHON.html" title=python>python\\7.py', '__cached__': None, 'hello': 'hello', 'world': 'world', 'test': <function test at 0x00000211AE173E20>}

可以看到有很多键值对,几个熟悉的键值对

class="prism language-csharp">'hello'class="token punctuation">: 'hello'class="token punctuation">, 
'world'class="token punctuation">: 'world'class="token punctuation">, 
'test'class="token punctuation">: class="token operator"><function test at class="token number">0x000001FDD5E23E20class="token operator">>

上面有的键都可以直接使用 print打印出来
比如最常见的

class="prism language-csharp">class="token function">printclass="token punctuation">(__name__class="token punctuation">)

__builtins__

它包含了 Python 内置的函数、异常和对象。这个模块使内置函数和对象在全局作用域中可用,无需显式导入

我们直接可以使用的函数和对象都在该变量上

class="prism language-csharp">class="token function">printclass="token punctuation">(__builtins__class="token punctuation">.print class="token operator">== printclass="token punctuation">)
class="token preprocessor property"># True


http://www.niftyadmin.cn/n/5092766.html

相关文章

Python学习----Day07

函数 函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做…

Flink的基于两阶段提交协议的事务数据汇实现

背景 在flink中可以通过使用事务性数据汇实现精准一次的保证&#xff0c;本文基于Kakfa的事务处理来看一下在Flink 内部如何实现基于两阶段提交协议的事务性数据汇. flink kafka事务性数据汇的实现 1。首先在开始进行快照的时候也就是收到checkpoint通知的时候&#xff0c;在…

allegro中shape的一些基本操作(一)——添加和修改shape

添加shape 简单添加shape的方式有3种&#xff0c;如下图所示 点击选择相应的shape模式后可以在option面板中设置相应的shape参数&#xff08;这里不做过多介绍&#xff0c;里面可以设置shape的大小、静态或动态shape等参数&#xff09;&#xff0c;然后再用鼠标在相应的层上添…

报道 | 2023-2024年1月国际运筹优化会议汇总

2023年10月、11月、12月召开会议汇总&#xff1a; 2023 International Conference on Optimization and Applications (ICOA) Location: Abu Dhabi, United Arab Emirates Important dates: Conference: October 05-06, 2023 Details: https://lct.ac.ae/en/icoa/ 2023 INF…

UGUI交互组件ScrollBar

一.ScrollBar的结构 对象说明Scrollbar挂有Image和Scrollbar组件的主体对象Sliding Area表示滑动范围Handle滑块 二.Scrollbar的属性 属性说明Handle Rect控制柄对象的引用Direction拖动控制柄时滚动条值增加的方向Value滚动条的当前值&#xff0c;范围为 0.0 到 1.0Suze控制柄…

CMake教程-第 6 步:添加对测试仪表板的支持

CMake教程-第 6 步&#xff1a;添加对测试仪表板的支持 1 CMake教程介绍2 学习步骤Step 1: A Basic Starting PointStep 2: Adding a LibraryStep 3: Adding Usage Requirements for a LibraryStep 4: Adding Generator ExpressionsStep 5: Installing and TestingStep 6: Addi…

TCP发送接口(如send(),write()等)的返回值与成功发送到接收端的数据量无直接关系

1. TCP发送接口&#xff1a;send() TCP发送数据的接口有send&#xff0c;write&#xff0c;sendmsg。在系统内核中这些函数有一个统一的入口&#xff0c;即sock_sendmsg()。由于TCP是可靠传输&#xff0c;所以对TCP的发送接口很容易产生误解&#xff0c;比如sn send(...); 错误…

创意作品管理软件 Bridge 2024 mac中文版 br2024功能特色

Bridge 2024 mac旨在连接不同的Ad obe应用程序&#xff0c;帮助用户更轻松地管理和编辑他们的创意作品。 Bridge 2024 mac软件特色和功能介绍 一致的用户体验&#xff1a;Bridge 2024现在具有增强的用户界面&#xff0c;可提供与其他Creative Cloud应用程序类似的体验。用户还…