安全与字符串插值
Source: Dev.to
介绍
我在长时间的间歇后回来了,这次专注于 求职 并重新审视近期的 CVE。
一个常见的漏洞来源是 字符串插值 —— 大多数编程语言中的一种功能,可在运行时将动态值插入字符串中。下面是一个简要回顾,随后列出几类与插值相关的错误、真实世界的 CVE 示例以及缓解建议。
1. Formatted String Literals (f‑strings)
input_string = "Hello, World"
print(f"Variable expanded to: {input_string}")
输出:
Variable expanded to: Hello, World
{input_string} 占位符在运行时会被变量的值替换。虽然使用方便,但当 用户可控数据 在没有适当清理的情况下插入时,f‑strings(以及类似的插值机制)会变得危险。
2. eval‑style 执行
- 它是什么:
eval(或等价函数)将字符串当作代码执行。 - 风险: 没有执行上下文 → 任意代码执行。
- 更安全的替代方案: 语言特定的安全解析器(例如 Python 的
ast.literal_eval)。
CVE‑2025‑48868 – 对 eval 的不安全使用导致远程代码执行。
3. 通过 Shell 插值进行命令注入
运行带有用户提供参数的外部命令可能被利用,尤其是当涉及到 shell(如 /bin/bash、sh -c、python -c 等)时。
- 常见错误: 在未对输入进行清理的情况下使用
subprocess.Popen(..., shell=True)。 - 缓解措施:
- 避免使用 shell – 将参数以列表形式传递。
- 降权 – 在非特权用户下运行子进程。
- 沙箱 – 使用容器、
chroot或受限执行环境。
CVE‑2026‑40030 – 在调用 ffmpeg 的视频处理服务中演示了命令注入。
4. 跨站脚本(XSS)– 浏览器插值
当 Web 应用在未过滤的情况下反射用户生成的内容时,攻击者可以注入恶意 JavaScript。
- 影响: 会话劫持、凭证窃取、驱动式恶意软件下载。
- 防御措施: 内容安全策略(Content‑Security‑Policy,CSP)、输出编码、净化库。
CVE‑2024‑29184 – 一个在论坛平台上绕过常见净化过滤器的 XSS 漏洞。
参考: Mozilla Developer Network – 防御 XSS。
5. SQL 注入 – 数据库查询插值
通过字符串拼接构建的 SQL 语句容易受到注入攻击。
经典示例(来自 xkcd):
SELECT email FROM Students WHERE name='$name_here';
如果 $name_here = Robert'); DROP TABLE Students;--,查询将变为:
SELECT email FROM Students WHERE name='Robert'); DROP TABLE Students;--';
--开始注释,导致后面的语句被忽略。- 注入的
DROP TABLE被执行,数据被毁掉。
缓解措施:
- 预处理语句 / 参数化查询。
- 使用抽象原始 SQL 的 ORM 库。
CVE‑2025‑1094 – 一个在 CLI 工具中通过命令行参数构建查询的 SQL 注入漏洞。
6. 路径遍历 – 文件系统插值
对用户提供的文件路径处理不当可能导致访问超出预期目录的文件。
- 典型负载:
../../../etc/passwd - 结果: 服务器返回系统密码文件。
缓解措施:
- 规范化并验证 路径(例如 Python 中的
pathlib.PurePath.relative_to)。 - 强制根目录(chroot、容器文件系统隔离)。
- Web 应用防火墙(AWS WAF、Cloudflare)配合路径遍历规则。
CVE‑2025‑68428 – 利用文件下载 API 中的目录遍历漏洞。
7. General Recommendations
| Principle | Action |
|---|---|
| 永不信任用户输入 | 假设任何数据都可能是恶意的。 |
| 使用上下文特定的 API | 选择适用于特定用途的安全函数(例如,用 subprocess.run([...]) 替代 os.system)。 |
| 验证并清理 | 白名单允许的字符/值;拒绝其他所有内容。 |
| 在输出时进行编码 | 根据需要应用 HTML 编码、SQL 参数化或 Shell 转义。 |
| 深度防御 | 结合安全编码、运行时加固和外围防御(WAF、IDS)。 |
| 最小特权 | 以最小必要权限运行服务。 |
| 定期更新与打补丁 | 及时应用安全补丁;监控 CVE 信息源以获取相关披露。 |
结束语
当你看到一个来源于用户输入的字符串时,问问自己:
- 这个字符串将在哪种上下文中使用?(HTML、SQL、Shell、文件系统等)
- 该语言是否为该上下文提供了安全的 API?
- 我是否已经应用了适当的验证、清理或编码?
通过始终如一地执行这些检查并分层防御,你可以显著降低与插值相关的漏洞攻击面。祝编码愉快——并祝求职顺利!