Бягство от команди на Shell в java?

Имам уеб услуга, която ще вземе някои входни данни от удостоверени машини като XML (това е за система за управление на мрежата, която интегрирам с друг софтуер) и ще изпълни shell скрипт с някои от XML данните като аргументи.

В Java (/Linux), кой е най-добрият начин за избягване на команди на обвивката, за да се гарантира, че някой не може да предаде злонамерени аргументи на моята уеб услуга?

По принцип в изключително опростен пример, приемам някои данни чрез WS

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

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

Трябва да се уверя, че това не може да се използва за изпълнение на произволни команди на обвивката и т.н.

Благодаря!


person Yablargo    schedule 24.05.2011    source източник
comment
Коя черупка? Различните обвивки имат различни конвенции за избягване.   -  person Mike Samuel    schedule 24.05.2011
comment
Въпросът гласи Java на Linux.   -  person Jesse Webb    schedule 24.05.2011
comment
@Gweebz, това не отговаря на въпроса Коя обвивка?. Linux има много различни обвивки.   -  person Kaj    schedule 24.05.2011
comment
Честен въпрос, предполагам, че дори няма значение! Ще проуча ProcessBuilder и ще видя дали това ще обработва данните по-безопасно. Ако трябва да уточня, предполагам, че обикновено използвам bash в тези случаи!   -  person Yablargo    schedule 25.05.2011


Отговори (3)


Бих предложил да използвате ProcessBuilder или един от методите на Runtime.exec, който не работи през обвивката и следователно не изисква екраниране на обвивката, за да избегнете инжекционни атаки (тук).

Може също да е полезно да се обмисли използването на STDIN канал на процеса за прехвърляне на XML данни - Perl може тривиално да се справи с четене от STDIN. Обикновено има ограничения за аргументите на командния ред.

Честито кодиране.

person Community    schedule 24.05.2011
comment
Наистина разумен отговор. Щях да го напиша по същия начин, дума по дума, ако не бяхте го направили преди. +1 - person gd1; 25.05.2011

Предоставена корекция: https://issues.apache.org/jira/browse/LANG-1066

Това наистина е дългогодишен проблем.

person user1050755    schedule 16.11.2014

Ако не можете да използвате ProcessBuilder, можете да помислите за Apache commons-text escapeXSI.

(без значение името - XSI е X/Open System Interfaces Extension, допълнителна спецификация към Single UNIX Specification, така че всичко, което се опитва да бъде UNIX-подобно повече или по-малко отговаря на това).

person 0x89    schedule 12.10.2017
comment
Благодаря. Използвайки по-стар проект, ми отне известно време да разбера, че това е било преди това в commons.lang3, заменено от commons.text. escapeXSI не е част от commons.lang3 версията, исках да го спомена за другите. :) - person tresf; 21.04.2021