Python 字符串安全
字符串处理是几乎所有程序的基础部分,但不当的字符串处理可能导致严重的安全问题。在本文中,我们将探讨Python字符串处理中的安全考虑因素,帮助你编写更安全的代码。
为什么字符串安全很重要?
字符串常常是用户输入的载体,也是程序与外部系统交互的媒介。不安全的字符串处理可能导致:
- SQL注入攻击
- 命令注入攻击
- 跨站脚本攻击(XSS)
- 信息泄露
- 不当数据解析
常见字符串安全问题及解决方案
1. SQL注入攻 击
SQL注入是最常见的安全漏洞之一,发生在将未经过滤的用户输入直接拼接到SQL查询中。
❌ 不安全的代码:
username = input("输入用户名:")
query = "SELECT * FROM users WHERE username = '" + username + "'"
cursor.execute(query)
如果用户输入 ' OR '1'='1
,查询将变为:
SELECT * FROM users WHERE username = '' OR '1'='1'
这会返回所有用户记录!
✅ 安全的代码:
username = input("输入用户名:")
query = "SELECT * FROM users WHERE username = %s"
cursor.execute(query, (username,))
输出: 无论用户输入什么,查询都会被正确参数化,防止SQL注入。
参数化查询
始终使用数据库API提供的参数化查询功能,而不是手动拼接SQL字符串。
2. 命令注入攻击
当程序使用os.system()
或subprocess
模块执行系统命令,并在其中包含用户提供的输入时,可能发生命令注入。
❌ 不安全的代码:
import os
filename = input("输入要处理的文件名:")
os.system(f"process {filename}")
如果用户输入 document.txt; rm -rf /
,将执行:
process document.txt; rm -rf /
这可能会删除整个文件系统!
✅ 安全的代码:
import subprocess
filename = input("输入要处理的文件名:")
subprocess.run(["process", filename], check=True)
输出:
subprocess.run()
使用列表参数时不会执行shell解析,因此即使文件名中包含特殊字符也是安全的。
3. 字符串编码和解码安全
不当的字符串编码/解码处理可能导致数据损坏或安全问题。
❌ 不安全的代码:
data = get_bytes_from_somewhere()
text = data.decode() # 未指定编码和错误处理
✅ 安全的代码:
data = get_bytes_from_somewhere()
try:
text = data.decode("utf-8", errors="replace")
except UnicodeDecodeError:
print("无法解码数据")
输出: 即使数据包含无效的UTF-8序列,程序也会安全处理而不会崩溃。