如何在不创建新文件、不使用exec()及os模块的情况下执行Python代码字符串?
解决方案
核心限制说明
严格禁止使用exec()和任何模块的前提下,Python没有原生途径能在当前文件作用域内执行Base64解码后的语句级代码(比如赋值、函数调用这类)。因为执行字符串形式的语句代码,Python仅提供exec()/eval()这两个内置入口,且Base64解码也需要实现对应逻辑(手动实现可避免模块依赖,但执行代码的核心需求绕不开exec())。
放松exec()限制后的可行方案(仅禁用模块导入)
如果允许使用exec()但不导入任何模块,可按以下步骤实现:
- 手动实现无依赖的Base64解码函数
- 解码得到代码字符串后,在当前作用域执行
# 手动实现Base64解码,不依赖任何模块 def base64_decode(s): base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" padding = s.count('=') s = s.rstrip('=') bits = 0 bit_count = 0 result = [] for c in s: idx = base64_chars.index(c) bits = (bits << 6) | idx bit_count += 6 while bit_count >= 8: byte = (bits >> (bit_count - 8)) & 0xFF result.append(chr(byte)) bit_count -= 8 if padding == 1: bits >>= 2 result.append(chr(bits)) elif padding == 2: bits >>= 4 result.append(chr(bits)) return ''.join(result) # 你的Base64编码内容 string_base64 = "eCA9ICJoZWxsbyBmZWxsb3ciCgoKcHJpbnQoeCkKeCA9ICJoZWxsbyBmZWxsb3ciCgoKcHJpbnQoeCkKeCA9ICJoZWxsbyBmZWxsb3ciCgoKcHJpbnQoeCkKeCA9ICJoZWxsbyBmZWxsb3ciCgoKcHJpbnQoeCk=" # 解码获取代码字符串 code_content = base64_decode(string_base64) # 在当前文件的全局/局部作用域执行代码 exec(code_content, globals(), locals())
完全禁用exec()的极端方案(不推荐)
如果必须彻底禁用exec(),只能通过修改当前模块的字节码实现,这属于高度hacky的操作,依赖Python版本,且极易引发不可控问题,仅用于研究场景,不建议实际使用。
内容的提问来源于stack exchange,提问作者Hof
相关产品推荐
相关产品推荐

