从零学网络安全 - Web 技术核心与安全风险(四)后端 Python
一、Python 基础语法
1. Python 介绍
Python 是⼀种解释型、⾯向对象、动态数据类型的⾼级编程语⾔。它被设计为可读性强、 简洁且易于学习,具有⾼效的⾼级数据结构,并且⽀持简单有效的⾯向对象编程。
特点:
- 易于学习:Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
- 易于阅读:Python 代码定义的更清晰。
- 易于维护:Python 的成功在于它的源代码是相当容易维护的。
应用领域:
web 开发、数据科学、人工智能和机器学习、自动化运维和测试、游戏开发、系统运维。
2. Python 基本语法
1. 变量与数据类型
Python 最大的特点是无需声明变量类型,直接赋值即可。
age = 30 # 整数 (Int)
pi = 3.14159 # 浮点数 (Float)
name = 'niko' # 字符串 (String)
is_student = True # 布尔值 (Boolean)
# 输出括号中的内容
print(f"姓名: {name}, 年龄: {age}")
单行注释:以“#”开始,到该行末尾结束。
单⾏注释: #
2. 类型转换
语法:
Python f-string:是在字符串前加f或F修饰符,Python 会自动将其值转换为字符串插入。
(1)允许在字符串中直接嵌入变量、表达式或函数调用的一种字符串格式化方法。
(2)语法:字符串前添加f,使用花括号{}包裹内容。
(3)另一种方式:+号拼接。
(4)注意:必须使用 str() 将数字转换为字符串后,才能进行字符串连接。
str_num = "123"
int_num = int(str_num) # 字符串转换为整数
print(f"字符串 '{str_num}' 转换为整数: {int_num}")
new_message = "我的分数是: " + str(int_num) # 数字转换为字符串
print(new_message)
3. 数据类型 list\tuple\dict
list:list 列表用[ ]标识,可以修改
# 定义一个待办事项列表
todo_list = ["买牛奶", "取快递", "写代码"]
# 添加新项
todo_list.append("运动30分钟")
# 修改第二项
todo_list[1] = "取快递(顺丰)"
# 删除第三项
del todo_list[2]
print(todo_list) # 输出:['买牛奶', '取快递(顺丰)', '运动30分钟']
tuple:tuple 元组用( )标识,是不可变序列,只能读取,适合存储固定数据
# 定义个人核心信息元组
person_info = ("zs", "110101199001011234", "1990-01-01")
print(person_info[0]) # 查看姓名
# 尝试修改元组元素(会报错,体现不可变性)
person_info[1] = "110101199001015678" # TypeError: 'tuple' object does not support item assignment
dict:dict 字典用{ }标识,以键值对形式存在。
# 定义通讯录字典
contact = {"zs": "13800138000"}
# 新增联系人
contact["lisi"] = "13700137000"
# 修改手机号
contact["wu"] = "13900139999"
# 通过键取值
print(contact["zs"]) # 输出:13800138000
4. 条件判断语句
核心规则:缩进!
- Python 不使用大括号 `{}`,而是依赖缩进(通常是 4 个空格)来定义代码块。
- 缩进的空白数量是可变的,但是所有代码块语句必须包含相同的缩进空白数量,这个必须严格执行。
语法:
#if-elif-else 语句
if 条件 1 :
条件 1 为真执⾏的语句
elif 条件 2 :
条件 2 为真执⾏的语句
elif 条件 3 :
条件 3 为真执⾏的语句
elif 条件 4 :
条件 4 为真执⾏的语句
else:
以上条件为假执⾏的语句
示例:
user_score = 85
if user_score >= 90:
print("成绩优秀")
elif user_score >= 80:
print("成绩良好") # 缩进划分代码块
else:
print("需要努力")
5. while 循环
语法:
while 条件 :
条件为真 重复执⾏的代码
示例:
# while 循环
count = 3
while count > 0:
print(f"While倒计时: {count}")
count -= 1
6. for 循环
语法:
for 临时变量 in 容器 :
重复执⾏的代码
示例1:
# for 循环遍历范围 (左闭右开)
for i in range(1, 6): # 遍历 1, 2, 3, 4, 5
print(f"For循环数字: {i}")
示例2:
#遍历列表
fruits=["apple","banana","orange","peach","watermelon"]
for fruit in fruits: # 遍历列表中的每个元素
print(fruit)
示例3:
# 遍历元组
tuple = ("zs", "110101199001011234", "1990-01-01")
for tup in tuple: # 遍历元组中的每个元素
print(tup)
示例4:
#遍历字典
iddict = {'name':'zs','age':'18'}
#遍历字典的键
for key in iddict:
print(key)
#遍历字典的值
for value in iddict.values():#需要使用.values进行取值
print(value)
二、面相对象实战
1. Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
自定义函数格式:
def 函数名(参数列表):
# 函数体
# 包含一系列缩进的语句
return 返回值 # 可选,用于返回结果给调用者
示例1:
# 定义函数
def printme(name) :
"打印传⼊的字符串"
print('我的名字叫:',name)
# 调用函数
printme('张三')
示例2:
# 定义函数 sum,返回 2 个参数的和
def sum(arg1, arg2) :
total = arg1 + arg2
print("函数内 : ", total)
return total
# 调⽤ sum 函数
total = sum(10, 20)
print(total)
2. 类\实例化\构造函数
类(Class)
类是⼀个模板或蓝图,它定义了对象的结构和⾏为。类包含了属性和⽅法,这些属性和⽅法定义了对象将拥有的数据(状态)以及可以执⾏的操作(行为)。
Python中的魔术方法,也被称为双下划线方法或特殊方法,这些方法的名称前后都带有两个下划线,例如__init__、__str__等。
- 主要作用是为Python中的对象提供内置的、特殊的行为。
- 构造函数: 固定命名为 __init__(可以将类中需要外部赋值的放入到其中)。
- self: 必须是所有实例方法和构造函数的第一个参数,代表当前对象。
示例1:
class Dog:
species = "犬科" # 类属性
def __init__(self, name, age): # 构造函数
self.name = name # 实例属性
self.age = age
def bark(self): # 实例方法
print(f"{self.name}在汪汪叫")
# 创建对象
dog1 = Dog("小黑", 3)
dog1.bark() # 输出:小黑在汪汪叫
示例2:
class Dog:
species = "犬科" # 类属性
def __init__(self, name, age): # 构造函数
self.name = name # 实例属性
self.age = age
def bark(self): # 实例方法
print(f"{self.name}在汪汪叫")
def __str__(self): # 实例方法
return f"{self.name}今年{self.age}岁了"
# 创建对象
dog1 = Dog("小黑", 3)
dog1.bark() # 输出:小黑在汪汪叫
# 当你对一个对象执行print() 操作时,Python 会自动查找并调用该对象的 `__str__` 方法
print(dog1) # 输出:小黑今年3岁了
3. PHP 与 Python 核心区别:选择合适的工具
| 特性 | PHP | Python | 适用场景 |
|---|---|---|---|
| 语法快 | 大括号{} | 缩进 | PHP 更接近 C 系语言,Python 更简洁 |
| 变量 | 必须带$ | 直接命名 | Python 学习门槛更低 |
| 应用领域 | 专注 Web 后端 | 全领域(Web、AI、数据分析等) | 建网站优先 PHP,复杂系统考虑 Python |
| 字符串连接 | 点号. | 加号 + 或 f-string | Python 的字符串处理更直观 |
三、Python模块
1. 什么是 Python 模块
Python 模块是包含Python代码的文件,其扩展名通常为`.py`。
- 模块是 Python 程序的基本组成部分,它们提供了封装代码的方式,使得代码更加组织化、易于重用和维护。
- 模块可以包含函数、类和变量,也可以包含可执⾏的代码。
- 常见模块类型:系统内置模块、自定义模块、第三方模块。
Python 模块特点
- 封装性:模块可以将相关的函数、类和变量封装在⼀起,形成⼀个独⽴的代码单元。这有助于保持代码的整洁和组织性。
- 重⽤性:⼀旦⼀个模块被编写和测试完毕,它就可以被多个程序重复使⽤,⽽⽆需重复编写相同的代码。
- 可维护性:模块化的代码更容易维护和更新。如果需要修改某个功能,只需要修改相应的模块,而不需要修改整个程序。
- 命名空间管理:每个模块都有⼀个独⽴的命名空间,这有助于避免命名冲突。当两个模块包含相同名称的函数或变量时,它们不会相互⼲扰,因为它们是在不同的命名空间中定义的。
2. 系统内置模块
是 Python 自带的标准库,它们提供了丰富的功能和工具,用于执行各种常见的任务。系统内置模块包括:os模块、sys模块、random模块、time模块。
示例:
#导入math模块
import math
#求平方根
num=math.sqrt(4)
print(num)
3. 自定义模块
⾃定义模块是开发者⾃⼰编写的模块,⽤于封装特定的功能或逻辑。⾃定义模块可以是任何有效的Python⽂件(以“.py”为后缀名),⾥⾯可以包含全局变量、函数、类等。
示例:
第一步:定义一个新的 my_sum.py 文件,注意不要与系统内置模块重名
#求两个数的和
def add(num1,num2):
return num1 + num2
第二步:导入新定义的 my_sum.py 文件
import my_sum
#调用自定义模块内函数
num = my_sum.add(1,2)
print(num)
4. 通过 pip 命令下载第三方模块
是由其他开发者或组织编写的,并发布到 Python 包索引等公共仓库中的模块。pip 是 Python 中的标准库管理器。它允许你安装和管理不属于 Python 标准库的其它软件包。
命令格式:
pip install 库名
pip install 库名 -i 镜像源 #-i 更换安装源(默认是使用国外的源,下载速度慢)
常见的国内的镜像源:
- 清华:https://pypi.tuna.tsinghua.edu.cn/simple
- 阿⾥云:http://mirrors.aliyun.com/pypi/simple/
- 中国科技⼤学 https://pypi.mirrors.ustc.edu.cn/simple/
- 华中理⼯⼤学:http://pypi.hustunique.com/
- ⼭东理⼯⼤学:http://pypi.sdutlinux.org/
- ⾖瓣:http://pypi.douban.com/simple/
5. requests 库
requests 是 Python 常⽤的⽹络请求库,核心功能是模拟浏览器向⽹站发送请求、获取数据。
示例:
第一步:
pip install requests
第二步:
import requests
domain="https://www.zhibangyang.cn/"
r=requests.get( domain )
#获取状态码
print(r.status_code);
#获取 HTTP 响应的文本内容
print(r.text);
6. 第三方工具 oneforall
OneForAll 是一款基于 Python 开发的、功能全面的域名信息收集与爆破工具。
- 可高效枚举目标域名的子域名、获取相关解析记录与资产信息。
- 常用于网络安全渗透测试。
如何使用?
-
安装
(1)cd D:\Oneforall\OneForAll-master
(2)通过指定的依赖清单文件requirements.txt,批量安装项目依赖。
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
- 版本不兼容、安装报错:可以使用虚拟环境
以 Win11 举例,以管理员打开 cmd 后,进入 oneforall 所在的目录,然后执行以下命令
python -m venv oneforall_env #创建一个虚拟环境。
oneforall_env\Scripts\activate #进入oneforall使用的虚拟环境,之后每次使用需执行这条命令。
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ #通过镜像安装依赖。
- 简单例子
方式一:使用默认字典扫描
python oneforall.py --target 域名 run
python oneforall.py --target https://www.baidu.com run
方式二:使用自定义字典扫描
python oneforall.py --target 域名 --wordlist=字典完整路径\字典文件完整名称 run