当前位置: 首页 > news >正文

Python安全编程:保护你的代码和数据

Python安全编程:保护你的代码和数据

前言

大家好,我是第一程序员(名字大,人很菜)。作为一个非科班转码、正在学习Rust和Python的萌新,最近我开始关注Python的安全编程。说实话,一开始我对安全编程的重要性认识不足,觉得只要代码能运行就可以了。但随着学习的深入,我发现安全编程是非常重要的,尤其是在处理敏感数据或构建Web应用时。今天我想分享一下我对Python安全编程的学习心得,希望能给同样是非科班转码的朋友们一些参考。

一、常见的安全漏洞

1.1 SQL注入

SQL注入是一种常见的安全漏洞,攻击者通过在输入中插入SQL代码来执行恶意操作:

# 不安全的代码 import sqlite3 def get_user(username): conn = sqlite3.connect('database.db') cursor = conn.cursor() # 不安全:直接拼接SQL语句 cursor.execute(f"SELECT * FROM users WHERE username = '{username}'") user = cursor.fetchone() conn.close() return user # 攻击者可以输入:' OR 1=1 -- # 这会导致执行:SELECT * FROM users WHERE username = '' OR 1=1 --'

1.2 跨站脚本攻击(XSS)

XSS攻击允许攻击者在网页中注入恶意脚本:

# 不安全的代码 from flask import Flask, request, render_template app = Flask(__name__) @app.route('/') def index(): name = request.args.get('name', 'World') # 不安全:直接将用户输入插入到HTML中 return f"<h1>Hello, {name}!</h1>" # 攻击者可以输入:<script>alert('XSS')</script> # 这会导致在网页中执行JavaScript代码

1.3 跨站请求伪造(CSRF)

CSRF攻击诱导用户执行非预期的操作:

# 不安全的代码 from flask import Flask, request, session app = Flask(__name__) app.secret_key = 'secret' @app.route('/transfer', methods=['POST']) def transfer(): # 不安全:没有验证请求来源 amount = request.form.get('amount') recipient = request.form.get('recipient') # 执行转账操作 return f"Transferred {amount} to {recipient}"

1.4 不安全的密码存储

不安全的密码存储方式可能导致密码泄露:

# 不安全的代码 import sqlite3 def register_user(username, password): conn = sqlite3.connect('database.db') cursor = conn.cursor() # 不安全:明文存储密码 cursor.execute("INSERT INTO users (username, password) VALUES (?, ?)", (username, password)) conn.commit() conn.close()

二、安全编程最佳实践

2.1 防止SQL注入

使用参数化查询来防止SQL注入:

# 安全的代码 import sqlite3 def get_user(username): conn = sqlite3.connect('database.db') cursor = conn.cursor() # 安全:使用参数化查询 cursor.execute("SELECT * FROM users WHERE username = ?", (username,)) user = cursor.fetchone() conn.close() return user

2.2 防止XSS攻击

对用户输入进行转义:

# 安全的代码 from flask import Flask, request, escape app = Flask(__name__) @app.route('/') def index(): name = request.args.get('name', 'World') # 安全:对用户输入进行转义 return f"<h1>Hello, {escape(name)}!</h1>"

2.3 防止CSRF攻击

使用CSRF令牌:

# 安全的代码 from flask import Flask, request, session, render_template from flask_wtf.csrf import CSRFProtect app = Flask(__name__) app.secret_key = 'secret' csrf = CSRFProtect(app) @app.route('/transfer', methods=['GET', 'POST']) def transfer(): if request.method == 'POST': # 安全:CSRF令牌会自动验证 amount = request.form.get('amount') recipient = request.form.get('recipient') # 执行转账操作 return f"Transferred {amount} to {recipient}" return render_template('transfer.html')

2.4 安全存储密码

使用哈希函数存储密码:

# 安全的代码 import sqlite3 import hashlib import os def register_user(username, password): conn = sqlite3.connect('database.db') cursor = conn.cursor() # 安全:使用哈希函数存储密码 salt = os.urandom(32) hashed_password = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000) cursor.execute("INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)", (username, hashed_password, salt)) conn.commit() conn.close() def verify_password(username, password): conn = sqlite3.connect('database.db') cursor = conn.cursor() cursor.execute("SELECT password_hash, salt FROM users WHERE username = ?", (username,)) result = cursor.fetchone() if result: password_hash, salt = result test_hash = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000) return test_hash == password_hash return False

三、安全库的使用

3.1 使用cryptography库

cryptography库提供了各种加密功能:

# 安装cryptography # pip install cryptography from cryptography.fernet import Fernet # 生成密钥 key = Fernet.generate_key() cipher_suite = Fernet(key) # 加密数据 plaintext = b"Hello, World!" ciphertext = cipher_suite.encrypt(plaintext) print(f"Encrypted: {ciphertext}") # 解密数据 decrypted_text = cipher_suite.decrypt(ciphertext) print(f"Decrypted: {decrypted_text}")

3.2 使用pyjwt库

pyjwt库用于处理JSON Web Tokens:

# 安装pyjwt # pip install pyjwt import jwt import datetime # 生成token payload = { 'user_id': 123, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) } secret = 'secret_key' token = jwt.encode(payload, secret, algorithm='HS256') print(f"Token: {token}") # 验证token try: decoded = jwt.decode(token, secret, algorithms=['HS256']) print(f"Decoded: {decoded}") except jwt.ExpiredSignatureError: print("Token has expired") except jwt.InvalidTokenError: print("Invalid token")

3.3 使用passlib库

passlib库用于密码哈希:

# 安装passlib # pip install passlib from passlib.hash import pbkdf2_sha256 # 哈希密码 hashed_password = pbkdf2_sha256.hash('mypassword') print(f"Hashed password: {hashed_password}") # 验证密码 is_valid = pbkdf2_sha256.verify('mypassword', hashed_password) print(f"Password is valid: {is_valid}")

四、安全配置

4.1 环境变量管理

使用环境变量存储敏感信息:

# 安装python-dotenv # pip install python-dotenv import os from dotenv import load_dotenv # 加载环境变量 load_dotenv() # 从环境变量获取敏感信息 secret_key = os.getenv('SECRET_KEY') database_url = os.getenv('DATABASE_URL') # 使用敏感信息 print(f"Secret key: {secret_key}") print(f"Database URL: {database_url}")

4.2 安全的文件权限

设置安全的文件权限:

import os # 创建文件并设置权限 with open('secret.txt', 'w') as f: f.write('secret information') # 设置文件权限为600(只有所有者可读写) os.chmod('secret.txt', 0o600)

4.3 安全的网络配置

使用安全的网络配置:

import ssl import socket # 创建安全的SSL连接 context = ssl.create_default_context() with socket.create_connection(('example.com', 443)) as sock: with context.wrap_socket(sock, server_hostname='example.com') as ssock: print(f"SSL version: {ssock.version()}") print(f"Cipher: {ssock.cipher()}")

五、Python与Rust的对比

作为一个同时学习Python和Rust的转码者,我发现对比学习是一种很好的方法:

5.1 安全特性对比

  • Python:动态类型,运行时错误,需要手动处理安全问题
  • Rust:静态类型,编译时错误,内存安全,线程安全
  • 安全优势:Rust在编译时就能发现很多安全问题
  • 开发效率:Python开发效率高,Rust开发效率相对较低

5.2 学习心得

  • Python的优势:开发效率高,生态丰富
  • Rust的优势:内存安全,线程安全
  • 相互借鉴:从Python学习快速开发,从Rust学习安全编程

六、实践项目推荐

6.1 安全项目

  • 密码管理器:实现一个安全的密码管理器
  • 安全的Web应用:构建一个具有安全特性的Web应用
  • 加密工具:实现一个文件加密工具
  • 安全扫描器:开发一个简单的安全扫描工具

七、学习方法和技巧

7.1 学习方法

  • 循序渐进:先学习基础安全知识,再学习高级安全技术
  • 项目实践:通过实际项目来巩固知识
  • 文档阅读:仔细阅读安全编程相关的文档
  • 社区交流:加入社区,向他人学习

7.2 常见问题和解决方法

  • 安全漏洞:定期进行安全扫描,及时修复漏洞
  • 密码管理:使用专业的密码管理工具
  • 依赖安全:定期更新依赖库,避免使用有漏洞的依赖
  • 安全意识:提高安全意识,定期学习安全知识

八、总结

Python安全编程是非常重要的,尤其是在处理敏感数据或构建Web应用时。作为一个非科班转码者,我深刻体会到安全编程的重要性。

我的学习过程并不是一帆风顺的,遇到了很多困难和挫折,但通过不断地实践和学习,我逐渐掌握了Python安全编程的各种技巧。

保持学习,保持输出。虽然现在我还是个菜鸡,但我相信只要坚持,总有一天能成为真正的「第一程序员」!

http://www.jsqmd.com/news/583673/

相关文章:

  • MacBook部署OpenClaw:百川2-13B-4bits量化模型开发调试实战
  • 二氧化碳气体采购,别把常用品当成通用品,先分清用途再下单 - 广州矩阵架构科技公司
  • Python与Rust的混合编程:结合两者的优势
  • 跨设备同步:OpenClaw+千问3.5-9B多终端配置指南
  • 嵌入式系统软件定时器实现与优化
  • Devatext:面向SSD1306 OLED的轻量级天城文渲染引擎
  • 360T7刷FanchmWrt教程
  • Pixel Aurora Engine惊艳案例:用单句描述生成完整RPG角色设定+立绘+装备图
  • 三态模型:**就绪**(已获除CPU外所有资源,等待调度)、**运行**(正在CPU执行)、**阻塞**(等待某事件如I/O完成,主动放弃CPU)
  • CSDN首页发布文章意见反馈
  • Panel.h:面向嵌入式游戏终端的NeoPixel像素矩阵抽象层
  • 嵌入式Flash持久化设计:轻量级购物清单实现方案
  • 嵌入式滚动平均滤波库:SimpleSmooth轻量级实现
  • LeetCode 二叉树高频双题绝杀!第 k 小元素 + 右视图,小白一遍学会
  • MCP9700/A温度传感器嵌入式驱动设计与滤波实现
  • AI深度学习中的自动微分与梯度下降机制解析
  • 从config.h.in到命令行:CMake宏定义的‘内外兼修’实战指南(附跨平台示例)
  • 万象视界灵坛实操手册:CLIP-ViT-L/14在数字藏品元数据生成中的应用
  • 中航迈特光束整形金属3D打印技术取得重要进展,多种材料已成功验证
  • LPS331传感器I²C地址修正与嵌入式驱动适配实践
  • 【2026年最新600套毕设项目分享】springboot实验室预约系统(14320)
  • Go语言的数据库操作:从SQL到ORM
  • 收藏!前端打工人破局指南:转AI Agent,告别重复劳动,薪资翻倍
  • “前置作战会议”:在RTL编码前,必须厘清的三个问题
  • 三菱FX5U ModbusTCP从站配置避坑指南:从IP冲突到通讯成功的完整流程
  • 贾子 Kucius 的证伪主义批判与学术评价体系重构:文明持续运行的新范式
  • **发散创新:用Python构建神经符号AI推理引擎——从逻辑规则到深度学习
  • 齿轮基础参数
  • 短视频 SEO 优化对于新手有什么建议_如何分析短视频的 SEO 效果
  • 如何快速上手接口测试?