某些库通过生成代码并运行代码来为调用方执行一些操作。 基本问题是为不太信任的代码生成代码,并在更高的信任级别上运行这些代码。 当调用方影响代码生成时,问题会恶化,因此必须确保只生成考虑安全的代码。
你需要确切地知道你始终要生成的代码。 这意味着必须严格控制从用户获取的任何值,无论是用引号括起来的字符串(应该进行转义以防止包含意外的代码元素)、标识符(应该检查以验证它们是否为有效标识符),还是其他任何内容。 标识符可能很危险,因为可以修改已编译的程序集,使其标识符包含奇怪的字符,这可能会破坏它(尽管这很少是安全漏洞)。
建议用反射发出生成代码,这通常有助于避免很多此类问题。
编译代码时,请考虑是否有某种方式恶意程序可以对其进行修改。 在编译器读取源代码之前或代码加载 .dll 文件之前,是否有一小段时间,恶意代码可以在磁盘上更改源代码? 如果是这样,则必须使用文件系统中的访问控制列表保护包含这些文件的目录。