【零基础入门学习Python---Python中安全编程和测试之快速入门实践】

news2024/11/26 13:51:00

在这里插入图片描述

🚀 零基础入门学习Python🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 零基础入门学习Python🚀

在这里插入图片描述

🍔 目录

  • 📑 Python安全编程和测试
    • 📄 安全编程的基本原则和技术
      • 📜 数据验证
      • 📜 减少代码注入风险
      • 📜 防止敏感数据泄露
    • 📄 常见的安全漏洞和攻击方式
      • 📜 SQL 注入攻击
      • 📜 XSS 跨站脚本攻击
    • 📄 使用加密和哈希算法保护数据
    • 📄 编写安全的 Web 应用和 API
    • 📄 单元测试和集成测试的基本概念
      • 📜 单元测试
      • 📜 集成测试
    • 📄 使用 unittest 或 pytest 进行测试
    • 📄 测试驱动开发(TDD)的实践
    • 📄 结论
    • 💬 共勉

📑 Python安全编程和测试

Python 在网络安全和测试领域有着广泛的应用,如 Web 应用开发,安全测试,ETL 流程,数据分析等,本文将介绍 Python 安全编程和测试的基本原则和技术,以及常见的安全漏洞和攻击方式。

📄 安全编程的基本原则和技术

📜 数据验证

在编写 Python 程序时,保证对输入数据的验证是很重要的。数据验证是指对输入数据的正确性和安全性进行检验,从而防止恶意攻击者利用恶意数据破坏程序。

以下是一些常见的数据验证技术:

  • 输入长度验证。
  • 输入指定字符的验证,如数字,字母和符号。
  • 输入数据的格式验证,如邮箱和手机号码。
  • 预处理用户输入数据,去除不必要的字符和标签。
import re

email_regex = re.compile(r"[^@]+@[^@]+\.[^@]+")

def is_valid_email_address(email):
    """
    校验电子邮件地址。
    """
    if not email:
        return False
    
    return email_regex.match(email) is not None

print(is_valid_email_address("foo@example.com"))
print(is_valid_email_address("bar@test"))

📜 减少代码注入风险

Python 中的执行代码注入风险被广泛利用,例如在处理不能信任的数据时,如网络爬虫、Web 应用程序和数据处理程序。 这些程序需要经常处理动态的输入数据,恶意攻击者可能使用这些数据注入恶意代码。

以下是一些减少代码注入风险的技术:

  • 使用 Python 内置的编码和解码模块进行 URL、XML、JSON 的加解密处理,减少注入攻击的风险。
  • 使用 Paramiko API 网络连接模块,支持 SSH 和 Telnet 协议。
# 使用 XML 模块解析恶意 XML 数据
import xml.etree.ElementTree as ET

def get_element_value(xml_string, element_name):
    """
    获取 XML 元素值。
    """
    root = ET.fromstring(xml_string)
    return root.findtext(element_name)

📜 防止敏感数据泄露

在处理敏感数据时,防止敏感数据泄露是非常重要的,如数据库连接密码、敏感配置文件等。为避免敏感数据泄露,可以使用如下的技术:

  • 在处理敏感数据时,尽量不要使用明文存储,例如使用哈希合适的算法存储密码,保证安全性。
  • 使用环境变量或者配置文件等把敏感数据存储到特定的位置。
  • 对敏感数据进行专门的加密和解密,如 AES,RSA,MD5 等。
import hashlib

def md5_encode(password: str) -> str:
    """
    使用 md5 加密方式对密码进行加密。
    """
    md5 = hashlib.md5()
    md5.update(password.encode("utf-8"))
    return md5.hexdigest()

📄 常见的安全漏洞和攻击方式

了解常用的安全漏洞和攻击方式是非常重要的,以下是一些常见的安全漏洞和攻击方式:

📜 SQL 注入攻击

在 Web 应用程序中 SQL 注入攻击被广泛利用,例如查询恶意语句的内容或者修改数据库等,为避免 SQL 注入攻击,应在构造 SQL 语句时使用预定义查询,或使用数据库的原生语句,防止恶意的 SQL 数据注入。

import sqlite3

def get_user_data(user_id: int):
    """
    从数据库获取用户信息,使用绑定参数方式防止 SQL 注入攻击。
    """
    with sqlite3.connect("example.db") as conn:
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM user WHERE id = ?", (user_id,))
        row = cursor.fetchone()
        if row:
            return {"id": row[0], "username": row[1], "email": row[2]}

print(get_user_data(1))

📜 XSS 跨站脚本攻击

在 Web 应用程序中,XSS 攻击通常利用网页编译程序的漏洞,通过注入恶意脚本来控制用户的浏览器。为避免 XSS 攻击,可以使用框架内置的 XSS 过滤器或编写自己的 XSS 过滤器,对用户的输入进行过滤。

以下是一个示例代码,用于从 HTML 中过滤恶意脚本:

import html

def html_escape(text):
    """
    转义 HTML 中的非法字符,防止 XSR 攻击。
    """
    return html.escape(text)

html = """
<html>
<head>
<title>安全编程的示例代码</title>
</head>
<body>
<script>alert('注入攻击!')</script>
<div>{{ content }}</div>
</body>
</html>
"""

print(html_escape(html))

📄 使用加密和哈希算法保护数据

保护数据的安全性是非常关键的,特别是在处理敏感数据时更是必要的。常用的加密和哈希算法包括 MD5,SHA,AES,RSA 等。

以下是一个使用 AES 加密算法的示例代码,对用户的输入密码进行加密存储和解密:

import base64
import hashlib
from Crypto.Cipher import AES

class AESEncrypt:
    """
    加解密逻辑处理。
    """
    key = hashlib.md5("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx".encode("utf-8")).digest()

    def __init__(self):
        self.mode = AES.MODE_CBC
        self.Iv = b'0000000000000000'

    def encrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.Iv)
        length = 16
        count = len(text.encode("utf-8"))
        add = length - (count % length)
        text += (b'\0' * add).decode("utf-8")
        self.ciphertext = cryptor.encrypt(text.encode("utf-8"))
        return base64.b64encode(self.ciphertext)

    def decrypt(self, text):
        cryptor = AES.new(self.key, self.mode, self.Iv)
        plain_text = cryptor.decrypt(base64.b64decode(text))
        return plain_text.rstrip(b'\0').decode("utf-8")

aes = AESEncrypt()

original_password = "123456"
en_password = aes.encrypt(original_password)
print(f"original password: {original_password}")
print(f"encrypted password: {en_password.decode('utf-8')}")

print(f"decrypt password: {aes.decrypt(en_password)}")
assert original_password == aes.decrypt(en_password)

📄 编写安全的 Web 应用和 API

在编写 Web 应用和 API 时,需要遵循以下的安全性原则:

  • 使用 HTTPS 协议,保证连接安全。
  • 应保护用户会话,避免恶意攻击者通过会话劫持窃取会话信息。
  • 认证和授权的原则,确保连目标的 API 和服务只能由授权的用户使用。
  • 数据和交互的验证原则,确保用户输入和应用程序交互的有效性。
  • 监控和日志,对应用程序的运行时行为进行记录。

以下是一个示例代码,用于展示如何使用 Flask 来编写一个基本的 Web 应用和 API:

from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route("/", methods=["GET"])
def home():
    """
    返回 API 首页。
    """
    response = {"message": "欢迎来到 Python 安全编程 API!"}
    return jsonify(response)

@app.route("/login", methods=["POST"])
def login():
    """
    登录接口。
    """
    username = request.form.get("username")
    password = request.form.get("password")
    
    if authenticate(username, password):
        token = generate_token"""
## 编写安全的 Web 应用和 API(续)

以下是一个示例代码,用于展示如何使用 Flask 来编写一个基本的 Web 应用和 API:

```python
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route("/", methods=["GET"])
def home():
    """
    返回 API 首页。
    """
    response = {"message": "欢迎来到 Python 安全编程 API!"}
    return jsonify(response)

@app.route("/login", methods=["POST"])
def login():
    """
    登录接口。
    """
    username = request.form.get("username")
    password = request.form.get("password")

    if authenticate(username, password):
        token = generate_token(username)
        return jsonify({"token": token.decode("utf-8")})

    return jsonify({"error": "用户名或密码错误。"}), 401

@app.route("/profile", methods=["GET"])
@auth_required
def profile():
    """
    用户资料。
    """
    username = request.headers.get("Authorization")
    user = get_user_by_username(username)
    return jsonify({"id": user.id, "username": user.username, "email": user.email})

if __name__ == "__main__":
    app.run()

在上述代码中,我们使用了 Flask 框架来编写一个简单的 API,并实现了登录和用户资料的接口,以及 JWT 认证和授权的功能。为了保护 API 的安全性,我们定义了一个 auth_required 装饰器,用于验证 JWT Token 的有效性,防止非法请求访问接口。

📄 单元测试和集成测试的基本概念

单元测试和集成测试是 Python 安全编程的一个重要方面,其主要目的是为开发人员提供构建可持续性和可测试性应用程序的机制,并帮助他们实现高质量的代码。单元测试是指对应用程序中单独的部分进行测试,而集成测试是指考虑应用程序的整体性,在构建和部署应用程序之前测试整个应用程序。

以下是一些单元测试和集成测试的基本概念:

📜 单元测试

在 Python 中,unittest 模块是用于单元测试的标准库之一,通过使用 TDD(测试驱动开发)的方式为开发人员提供了一个基准测试类和一组断言方法,易于开发者编写简单,可重复的自动化测试。

以下是一个使用 unittest 模块编写的示例测试用例:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        print(s)
        self.assertEqual(s.split(), ['hello', 'world'])

if __name__ == "__main__": 
    t=TestStringMethods()
    t.test_split()


📜 集成测试

在 Python 中,pytest 模块是用于集成测试的标准库之一,可以使用插件和扩展模块扩展其功能。pytest 的功能非常强大,可以测试应用程序中的所有部分,包括数据库和 API。

以下是一个使用 pytest 模块编写的示例测试用例:

import pytest

def test_username():
    username = "john_doe_123"
    assert username.islower()


def test_password():
    password = "password123"
    assert len(password) >= 8

📄 使用 unittest 或 pytest 进行测试

Python 提供了许多单元测试和集成测试的库和框架,例如 unittest 和 pytest 等。

unittest 是 Python 内置的库,可以用于简单而可靠的单元测试,它定义了一组测试框架,支持参数化测试、测试装饰器、断言语句等特性。

以下是一个使用 unittest 编写的示例测试用例:

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])

pytest 是 Python 中一个非常流行的测试框架,支持功能强大、可配置和易于扩展,并且不需要类的继承。

以下是一个使用 pytest 编写的示例测试用例:

import pytest

def test_username():
    username = "john_doe_123"
    assert username.islower()


def test_password():
    password = "password123"
    assert len(password) >= 8

📄 测试驱动开发(TDD)的实践

测试驱动开发(TDD)是一种受欢迎的开发方法,它是一种理想的方式,可以在编写代码之前先编写测试用例,并在完成代码后进行自动化测试,以保证代码的正确性。

使用 TDD 开发 Python 安全编程应用程序时,我们可以遵循以下的流程:

  1. 编写测试用例。
  2. 运行测试用例,检查测试是否失败。
  3. 编写代码,让测试用例通过。
  4. 运行测试用例,检查是否成功通过。

以下是一个使用 TDD 开发的示例代码:

def get_user_data(user_id):
    """
    获取用户数据。
    """
    conn = get_database_connection()
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))

    rows = cursor.fetchall()
    if rows:
        return rows[0]

    return None

def test_get_user_data():
    """
    用于测试获取用户数据的函数。
    """
    user_id = 1
    user_data = get_user_data(user_id)
    assert user_data is not None

在上面的示例代码中,我们首先编写一个获取用户数据的函数的测试用例,然后实现这个函数,最后运行测试用例,确保函数的正确性和安全性。

📄 结论

本文介绍了如何在 Python 中进行安全编程和测试,包括数据验证,减少代码注入风险,防止敏感数据泄露,常见的安全漏洞和攻击方式,使用加密和哈希算法保护数据,编写安全的 Web 应用和 API,单元测试和集成测试的基本概念,使用 unittest 或 pytest 进行测试,测试驱动开发(TDD)的实践等方面,并提供了示例代码,帮助开发者更好的理解 Python 安全编程和测试的概念和实践。

💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722487.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql基础之SQL语句

作定期复习和查询用&#xff0c;打开这篇博客提高效率&#xff0c;避免回视频或者百度上找 &#x1f442; 无论你多怪异我还是会喜欢你&#xff08;《刺客伍六七》动画推广版片尾曲&#xff09; - 周子琰 - 单曲 - 网易云音乐 内容来自B站黑马Mysql&#xff0c;检索使用 附上…

浅析Lambda架构

大家好&#xff0c;今天我们来介绍一个用于亿级实时数据分析架构Lambda架构。 Lambda架构 Lambda架构&#xff08;Lambda Architecture&#xff09;是由Twitter工程师南森马茨&#xff08;Nathan Marz&#xff09;提出的大数据处理架构。这一架构的提出基于马茨在BackType和Tw…

Python GUI编程利器:Tkinker中的消息和文本(7)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 和猫妹学Python&#xff0c;一起趣味学编程。 今日目标 实现下面效果&#xff1a; 消息(Message类) 消息用于显示多行文本消息&#xff0c;对标签进行替代&#xff0c;如果…

【数学建模】国赛真题分析 2012 A题 葡萄酒的评价

2012 A题 葡萄酒的评价 优秀论文地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/19WGpybgM6RncxTYhx61JRA?pwdvl22 提取码&#xff1a;vl22 –来自百度网盘超级会员V6的分享 确定葡萄酒质量时一般是通过聘请一批有资质的评酒员进行品评。每个评酒员在对葡萄酒进…

GWIN入门-完整一个程序

GWIN入门-完整一个程序 新建工程 右击工程名,添加.v文件 编写功能文件 /* timescale是Verilog HDL 中的一种时间尺度预编译指令,它用来定义模块的仿真时的时间单位和时间精度。 */`timescale 1ns/1ps module LED(input wire clk

第三步:STM32F4时钟介绍

1.0 时钟系统框图 1.1 时钟系统知识 1. STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。 ①、HSI是高速内部时钟&#xff0c;RC振荡器&#xff0c;频率为16MHz&#xff0c;精度不高。可以直接作为系统 时钟或者用作PLL时钟输入。    ②、HSE是高速外部时钟&#xff0c;可接石英…

机器学习PCA + LogisticRegression 训练和预测 输出混淆矩阵

from sklearn.decomposition import PCA# --------------------------------------------- # 最佳主成分数量 pca = PCA(n_components=None) pca.fit_transform(x_train) var_values = pca.explained_variance_ratio_def select_best_components(var_, goal_var):best_componen…

flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题

背景 工程使用了混合开发&#xff0c;使用flutter boost插件&#xff0c;flutter 的activity1 frament1 跳转activity2 frament2&#xff0c;frament1 包含platformView&#xff0c;按照上面老哥解决崩溃问题的基础上&#xff0c;出现activity2 frament2返回activity1 framen…

百度--搜索引擎是怎么实现的--如何制作一个搜索浏览器

1.搜索引擎是怎么实现的&#xff1f; 搜索引擎是通过以下步骤实现的&#xff1a; 网页抓取&#xff08;Crawling&#xff09;&#xff1a;搜索引擎会使用网络爬虫&#xff08;Web Crawler&#xff09;自动地从互联网上抓取网页内容。爬虫按照一定的规则遍历网页并提取网页内容…

数组之前缀和

1.前缀和 前缀和的概念:前缀和是指数组中从开始位置到当前位置的所有位置的元素之和,它可以通过累加数组元素来计算,一般来说,我们可以使用前缀和数组在常数时间复杂度内计算任意区间的和. 注意:特别是需要频繁的计算区间和的情况,可以通过先预先计算前缀和数组,可以将时间复…

经典神经网络(7)DenseNet及其在Fashion-MNIST数据集上的应用

经典神经网络(7)DenseNet及其在Fashion-MNIST数据集上的应用 1 DenseNet的简述 DenseNet不是通过更深或者更宽的结构&#xff0c;而是通过特征重用来提升网络的学习能力。 ResNet 的思想是&#xff1a;创建从“靠近输入的层” 到 “靠近输出的层” 的直连。而DenseNet 做得更…

idea取消右侧边缘提示信息;IDEA使用心得:工作区右边框提示信息

idea的提示是很人性的&#xff0c;合理使用一定程度上也会提升个人的编码水平 最终效果&#xff1a;能看到weak warning个数&#xff0c;但侧边栏不会显示直接清爽 但是idea在检查代码时有一种警告叫做weak warning 什么是weak warning 图中这种只是其中一种&#xff0c;这种…

导出本地文件(模板)

/*** 导出模板*/GetMapping("export/template")ApiOperationSupport(order 16)ApiOperation(value "导出模板")public void exportTemplate(HttpServletResponse response) {List<JointExcel> list new ArrayList<>();ClassPathResource cl…

Fortran 中的 goto 语句

注意项 避免滥用&#xff1a;Fortran 90引入了结构化编程的概念&#xff0c;切记不要滥用goto语句明确标签&#xff1a;在使用goto语句时&#xff0c;标签要明确避免跳转过多&#xff1a;过多的跳转会增加代码的复杂性和可读性避免跳转到循环内部&#xff1a;在循环内部使用go…

力扣 93. 复原 IP 地址

题目来源&#xff1a;https://leetcode.cn/problems/restore-ip-addresses/description/ C题解&#xff1a;递归回溯法。 递归参数&#xff1a;因为不能重复分割&#xff0c;需要ind记录下一层递归分割的起始位置&#xff1b;还需要一个变量num&#xff0c;记录ip段的数量。递…

【设计模式】第二十章:解释器模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

中国移动九天毕昇部署fastchat Ubuntu18.04+torch1.13.1+cuda11.6+python3.9

8核CPU,RAM32G 时间&#xff1a;2023年7月 项目地址:GitHub - lm-sys/FastChat: An open platform for training, serving, and evaluating large language models. Release repo for Vicuna and FastChat-T5. 体验地址:https://chat.lmsys.org/ 时间20230703&#xff0c;fas…

【Web3】Web3连接到以太坊网络(测试网、主网)

目录 什么是Web3 Web3项目连接以太坊网络 1.下载Web3 2.实例化Web3对象 3.infura 获取连接以太坊网络节点 4.添加网络节点 什么是Web3 web3.js开发文档&#xff1a;web3.js - Ethereum JavaScript API — web3.js 1.0.0 documentation web3.js 中文文档 : web3.js - 以…

【观察】技术创新+以行践言双管齐下,戴尔科技加速边缘计算落地

众所周知&#xff0c;随着混合多云的快速发展&#xff0c;来自百行千业的用户都在通过混合多云的策略推进加速企业的数字化转型&#xff0c;其中边缘计算由于能够在靠近数据生成的地点和位置就近提供计算、网络、智能等关键能力&#xff0c;其不仅正成为构建“云边端”一体化的…

实验:验证TCP套接字传输的数据不存在数据边界

来源&#xff1a;《TCP/IP网络编程》 学习ing 自己动手&#xff0c;把坑踩一遍&#xff0c;也可以学习到很多。 Linux环境下: 客户端&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <…