Колко добро е използването на %q в Lua за избягване на аргументи на обвивката?

Да кажем, че трябва да предадем някакъв аргумент на команда на shell. (Да приемем черупка, съвместима с Bourne.)

Например, да кажем, че искаме да отпечатаме низа He said "It's a boy"; sure с помощта на echo(1).

Естествено, не можем да го направим по този начин:

s = [[He said "It's a boy"; sure]]
os.execute("echo " .. s)

Но следното работи добре:

s = [[He said "It's a boy"; sure]]
os.execute(("echo %q"):format(s))

Моят въпрос: Смятате ли, че използването на %q за цитиране на аргументи на обвивката е достатъчно добро?

Вече знам, че %q не е много добър, ако аргументът ни включва нов ред (той ще бъде преобразуван в наклонена черта+нов ред, което би означавало, че обвивката няма да вижда символ; но поне няма да наруши командата). Така че това е едно дело срещу нас. Има ли други случаи, в които %q ще ни провали?


person Niccolo M.    schedule 02.04.2014    source източник


Отговори (2)


От справочното ръководство за 5.1:

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

Ако приемем, че това е правилно, това са единствените символи, които ще бъдат екранирани. Във вашия случай има специални символи, разпознати от обвивката, като ;, които не са в този списък, така че това няма да го избяга. Но %q работи, защото затваря низа с кавички, така че ; се скри. Също така, това има за цел да генерира низ, който може да бъде прочетен от Lua. Така че добавянето на екраниращ символ към кавички, обратни наклонени черти и т.н. не е непременно това, от което се нуждаете, за да може командната обвивка да разбере вашата команда. Мисля, че е трудно да се каже със сигурност дали %q винаги ще прави това, което искате, за всяка черупка.

person Oliver    schedule 02.04.2014

Не, използването на %q не е достатъчно добро. Знаците за долар и обратните отметки не се екранират, с което може да се злоупотреби, за да се разкрие съдържанието на променливите на средата, или още по-лошо, да се изпълнят произволни команди.

person scottywz    schedule 09.12.2014