在java中转义Shell命令?

在java中转义Shell命令?,java,shell,escaping,Java,Shell,Escaping,我有一个Web服务,它将从经过身份验证的机器中获取一些输入作为XML(这是用于我正在与其他软件集成的网络管理系统),并使用一些XML数据作为参数执行一个shell脚本 在Java(/Linux)中,逃避shell命令以确保某人无法向我的Web服务传递恶意参数的最佳方法是什么 基本上,在一个极其简化的示例中,我通过WS获取了一些输入 <foo> <bar>ABCDEF</bar> </foo> then running somescript.pl

我有一个Web服务,它将从经过身份验证的机器中获取一些输入作为XML(这是用于我正在与其他软件集成的网络管理系统),并使用一些XML数据作为参数执行一个shell脚本

在Java(/Linux)中,逃避shell命令以确保某人无法向我的Web服务传递恶意参数的最佳方法是什么

基本上,在一个极其简化的示例中,我通过WS获取了一些输入

<foo>
<bar>ABCDEF</bar>
</foo>

then running somescript.pl <<data in <bar> field>> here

ABCDEF
然后在这里运行somescript.pl
我需要确保这不能用于执行任意shell命令等


谢谢

我建议使用ProcessBuilder或Runtime.exec方法之一,该方法不通过shell运行,因此不需要shell转义来避免注入攻击(此处)

  • --比运行时.exec更灵活

  • --不同于仅采用
    字符串的形式

还可以考虑使用进程的STDIN管道来传输XML数据——Perl可以轻松地处理来自STDIN的读取。命令行参数通常有一些限制

快乐编码。

提供的补丁:


<>这是一个长期存在的问题。

如果你不能使用进程生成器,你可以考虑。


(别管名称了-XSI是X/Open System Interfaces扩展,它是对的补充规范,因此任何试图成为UNIX的东西或多或少都符合这一点)。

哪个shell?不同的shell有不同的转义约定。问题是Linux上的Java。@Gweebz,这并不能回答“哪个shell?”。Linux有许多不同的外壳。公平的问题是,我想这根本不重要!我将研究ProcessBuilder,看看这是否能更安全地处理数据。如果我必须指定,我想我通常在这些情况下使用bash!这真是一个明智的回答。如果你以前没有写,我也会一字不差地写+1谢谢。使用一个较旧的项目,我花了一段时间才意识到它以前是在
commons.lang3
中,被
commons.text
取代的。
escapeXSI
不是
commons.lang3
版本的一部分,希望向其他人提及。:)