安全与字符串插值

发布: (2026年4月17日 GMT+8 07:41)
6 分钟阅读
原文: Dev.to

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/bashsh -cpython -c 等)时。

  • 常见错误: 在未对输入进行清理的情况下使用 subprocess.Popen(..., shell=True)
  • 缓解措施:
    1. 避免使用 shell – 将参数以列表形式传递。
    2. 降权 – 在非特权用户下运行子进程。
    3. 沙箱 – 使用容器、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
  • 结果: 服务器返回系统密码文件。

缓解措施:

  1. 规范化并验证 路径(例如 Python 中的 pathlib.PurePath.relative_to)。
  2. 强制根目录(chroot、容器文件系统隔离)。
  3. Web 应用防火墙(AWS WAF、Cloudflare)配合路径遍历规则。

CVE‑2025‑68428 – 利用文件下载 API 中的目录遍历漏洞。

7. General Recommendations

PrincipleAction
永不信任用户输入假设任何数据都可能是恶意的。
使用上下文特定的 API选择适用于特定用途的安全函数(例如,用 subprocess.run([...]) 替代 os.system)。
验证并清理白名单允许的字符/值;拒绝其他所有内容。
在输出时进行编码根据需要应用 HTML 编码、SQL 参数化或 Shell 转义。
深度防御结合安全编码、运行时加固和外围防御(WAF、IDS)。
最小特权以最小必要权限运行服务。
定期更新与打补丁及时应用安全补丁;监控 CVE 信息源以获取相关披露。

结束语

当你看到一个来源于用户输入的字符串时,问问自己

  1. 这个字符串将在哪种上下文中使用?(HTML、SQL、Shell、文件系统等)
  2. 该语言是否为该上下文提供了安全的 API?
  3. 我是否已经应用了适当的验证、清理或编码?

通过始终如一地执行这些检查并分层防御,你可以显著降低与插值相关的漏洞攻击面。祝编码愉快——并祝求职顺利!

0 浏览
Back to Blog

相关文章

阅读更多 »

如何使用 Python 验证印度邮政编码

如何使用 Python 验证印度邮政编码(Pincode)并查找地区、子地区和区。以下脚本验证 6 位印度邮政编码,并返回相应的地区、子地区和区。

一行写列表(List Comprehensions)

介绍:您可以使用循环在 Python 中构建列表,但列表推导式让您能够在单行可读的代码中完成相同的工作。python numbers = 1, 2, 3,...