从 Java 应用程序运行批处理文件

问题描述 投票:0回答:1

我正在尝试从我的 Java 应用程序运行 .bat 文件,但我担心如果我使用 Java 应用程序运行 .bat 可能会出现命令行注入或任何其他可能的攻击。有没有一种安全的方法可以使用 Java 应用程序运行 .bat 文件?

java batch-file
1个回答
0
投票

简短的回答是清理发送到批处理脚本的输入。实际上这意味着命令行参数。例如,

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() );
}

除此之外,您只需要检查其他参数以确保它们符合您的预期。

© www.soinside.com 2019 - 2024. All rights reserved.