You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中能否构造字符串实现拼接逃逸并注入恶意代码?

针对Python代码注入场景的解决方案

核心前提说明

首先要明确你的代码执行场景:只有当add("user." + username, "n", timestamp)是动态生成的Python代码字符串并通过exec/eval执行时,才有可能实现参数注入;如果是普通运行时的函数调用(直接传递字符串拼接结果作为参数),则无法改变函数的参数列表,注入目标不可能达成。


可实现注入的场景(动态代码生成)

你之前尝试失败的关键错误是误用了注释语法:Python的单行注释是#,而非其他语言的//。根据你的目标,构造特定username值即可实现注入:

构造方案1(username作为代码片段直接插入)

如果代码模板是直接将username作为表达式插入(如code = f'add("user." + {username}, "n", timestamp)'),将username设置为:

"name", "y", timestamp)#

生成后的最终代码为:

add("user." + "name", "y", timestamp)#, "n", timestamp)
  • 第一个参数变为"user." + "name",得到目标键名"user.name"
  • 第二个参数被替换为管理员权限值"y"
  • 第三个参数保留timestamp
  • 原有的", "n", timestamp)被#注释,完全失效

构造方案2(username被双引号包裹在代码模板中)

如果代码模板将username用双引号包裹(如code = f'add("user." + "{username}", "n", timestamp)'),将username设置为:

name", "y", timestamp)#

生成后的最终代码为:

add("user." + "name", "y", timestamp)#", "n", timestamp)

同样能达成目标,Python会自动忽略#之后的所有内容。


无法实现注入的场景(普通函数调用)

如果你的代码是普通运行时调用(如下):

def add(key, perm, ts):
    # 函数逻辑
    pass

username = request.body.username
add("user." + username, "n", timestamp)

这种情况下无论username是什么内容,都只会作为第一个参数的字符串拼接部分,add的第二个参数永远是"n",无法通过字符串拼接改变函数的参数结构,注入目标无法实现。

内容的提问来源于stack exchange,提问作者Amparo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:53:20