我正在尝试从我的 Java 应用程序运行 .bat 文件,但我担心如果我使用 Java 应用程序运行 .bat 可能会出现命令行注入或任何其他可能的攻击。有没有一种安全的方法可以使用 Java 应用程序运行 .bat 文件?
简短的回答是清理发送到批处理脚本的输入。实际上这意味着命令行参数。例如,
Process p = Runtime.getRuntime().exec("runBatch.bat")
如果您不向批处理文件传递任何内容,那是完全安全的,因为用户无法操纵任何东西,这会让您做一些您不希望做的事情。这是假设黑客无法换出您运行的批处理脚本,但这是在攻击您环境中除 Java 软件以外的其他东西(即操作系统、文件共享、文件权限等)。
这完全取决于您发送给批处理脚本的命令行参数。
Process p = Runtime.getRuntime().exec(new String[] { "runBatch.bat", arg1, arg2 });
如果 arg1 和 arg2 可以从用户输入中填充,那么您需要清理它们。大多数情况下,我会热衷于关注他们可能会尝试和弄乱的任何文件路径。例如,如果您想让它们提供有关某些文件路径的信息,但该文件路径不应转义根目录,那么您需要包含该目录的结果路径。
File rootDir = new File("...")
File arg1 = new File( userInput )
File arg2 = new File( userInput )
if( isWithin( rootDir, arg1 ) && isWithin( rootDir, arg2 ) ) {
Runtime.getRuntime().exec( new String[] { "runBatch.bat", arg1, arg2 } )
}
public boolean isWithn( File rootDir, File file ) {
return arg1. getCanonicalPath().startsWith( rootDir. getCanonicalPath() );
}
除此之外,您只需要检查其他参数以确保它们符合您的预期。