Безопасность eval

и еще раз к вопросу о пользе чтения man-ов

eval считается крайне уязвимой конструкцией, особенно на произвольных данных. дескать, подставь ; и лепи себе дальше патчи бармина, сколько душе угодно.

оно то так, но есть в bash одна очень приятная штука для борьбы с этим злом – расширитель @. позволяет экранировать всякую каку без особых извратов с echo/sed/perl/whatever

итак, маленький примерчик

(victor@ksakep)~ $> cat t.sh
#! /bin/bash

str="test ; echo test2"

eval echo $str
eval echo ${str@Q}
(victor@ksakep)~ $> ./t.sh
test
test2
test ; echo test2
(victor@ksakep)~ $>

в первом случае echo после точки с запятой отработалась как еще одна команда, т.е. конструкция уязвима
во втором – строка была выведена как задумывалось изначально.

ну а за подробностями возможных аргументов расширителя @ – в man bash

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *