安全性和进行中的代码生成
某些库通过生成代码并运行这一代码来执行调用方的某些操作。 基本问题是:它代表受信任程度较低的代码生成代码,然后以较高的信任程度运行。 如果调用方会影响代码生成,这一问题会更加恶化,所以您必须保证只生成您认为安全的代码。
您必须每时每刻确切了解正在生成的代码的内容。 这意味着您必须严格控制从用户获得的任何值,无论它们是括在引号内的字符串(应对其进行转义,以使它们不会包含意外的代码元素)、是标识符(应当对其进行检查,以验证它们是否为有效的标识符)还是任何其他值。 因为您可以修改已编译的程序集以使其标识符中包含一些奇怪的字符,而这些字符可能会破坏该程序集(尽管这很少成为安全漏洞),所以标识符可能是危险的。
建议您使用 reflection emit 来生成代码,它通常可以帮助您避免多数这类问题。
当您编译代码时,请考虑恶意程序是否能以某种形式修改它。 在编译器读取源代码之前,或在您的代码载入 .dll 文件之前,是否存在恶意代码可能会更改磁盘上的源代码的小时间窗? 如果存在,则必须相应地使用文件系统中的代码访问安全机制或访问控制列表,来保护包含这些文件的目录。
如果调用方能够影响生成的代码并因而导致编译器错误,则这也是安全弱点。
应使用 PermitOnly 或 Deny,以尽可能低的权限设置来运行所生成的代码。