И на старуху бывает проруха
Сегодня решил поделиться отрицательным опытом. Код, приведенный в статье лучше не использовать.
У меня возникла необходимость распарсить файл типа:
Видно, что однословные поля разделены пробелом, а многословные заключены в кавычки. Распарсить такой файл на awk можно, но не быстро. Нужно писать код.
А на bash - вроде просто:
Проверил — вроде работает. Классно, пишу цикл, проверяю на файле — не работает. Упрощаю код до минимума.
Очевидно, разбились по пробелам. Перепробовал кавычки — не выходит. Не придумал ничего лучшего, как использовать конструкцию:
Все работает как надо.
После этого я решил распарсить реальный лог apache.
Все работало прекрасно, но на определенной строчке все зависало на несколько секунд, а потом продолжалось. Начал разбираться, и когда понял, что происходит — чуть не поседел.
Там была инъекция:
Переменная IFS
использовалась вместо пробела. Короче, команда выглядела так:
Ничего страшного. Просто пинг 6 раз на адрес. И этот пинг ИСПОЛНЯЕТСЯ, вызывая задержку. Но команда могла быть и другой. Спасибо дядям за доброту.
Проблема возникла из-за того, что оператор eval
разворачивал не только мою переменную, а все переменные, в том числе и из лога, попутно выполняя команды.
В общем, если я раньше считал оператор eval
— бесполезным, то теперь я считаю его вредным.
Вот такой опыт.