The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]



"Как в PHP полностью корректно экранировать для Shell'а?"
Вариант для распечатки  
Пред. тема | След. тема 
Форум WEB технологии (PHP)
Изначальное сообщение [ Отслеживать ]

"Как в PHP полностью корректно экранировать для Shell'а?"  +/
Сообщение от Кровосток (ok), 20-Июл-22, 10:47 
Добрый день Товарищи!

Скажите пожалуйста, если есть такая гипотетическая задача:
Скрипт в PHP берёт из БД данные и делает с ними что-то типа того:


//Массив строк для shell'а
$arr = [];

//В $result данные типа SELECT aa.filePath, aa.linkPath FROM tablename
while($cur=mysqli_fetch_array($result)){
    //Собственно сам вопрос в этом блоке. Как в PHP корректно экранировать путь к файлу для shell
    //чтобы исходный к примеру путь: /home/vasyan kudrikov/file super cool!!!.avi
    //был экранирован c учётом всех требуемых для shell к экранированию символов
    //для свободного уже использования этого значения как аргумента к командам shell'а?
    $escFilePath = HOW_TO_ESC($cur[0]);
    $escLinkPath = HOW_TO_ESC($cur[1]);

    //Мне надо сформировать shell скрипт с манипуляцией файлов.
    $arr[] = 'ln -s '.$escFilePath.' '.$escLinkPath;
}

//Вывод результата в stdout
echo implode("\n", $arr);

Собственно как организовать эту HOW_TO_ESC()?

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по времени | RSS]


1. "Как в PHP полностью корректно экранировать для Shell'а?"  +3 +/
Сообщение от Аноним (1), 20-Июл-22, 12:21 
Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать в пхп. realpath/stat для валидации путей.
Или наоборот, все делать в шелле, например пайп вида mysql | sed | xargs -l sh -c
Ответить | Правка | Наверх | Cообщить модератору

3. "Как в PHP полностью корректно экранировать для Shell'а?"  +2 +/
Сообщение от Кровосток (ok), 20-Июл-22, 16:51 
> Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать
> в пхп. realpath/stat для валидации путей.
> Или наоборот, все делать в шелле, например пайп вида mysql | sed
> | xargs -l sh -c

Ну там на самом деле просто более-менее развесистая логика по обработке данных в БД ип прочее. Конечно можно всё и в shell организовать, но это точно забивание гвоздей микроскопами. Если делать всё в PHP, то есть мнение что будем медленнее существенно работать. А вот логику на PHP с формированием заданий оптимальных для shell и их выполнения на его уровне - это как мне кажется сбалансированный подход.

Ответить | Правка | Наверх | Cообщить модератору

5. "Как в PHP полностью корректно экранировать для Shell'а?"  +2 +/
Сообщение от Кровосток (ok), 20-Июл-22, 16:54 
> Вообще escapeshellarg, но лучше с самого начала все необходимое с файлами делать
> в пхп. realpath/stat для валидации путей.
> Или наоборот, все делать в шелле, например пайп вида mysql | sed
> | xargs -l sh -c

Спасибо за пояснения!

Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

2. "Как в PHP полностью корректно экранировать для Shell'а?"  +3 +/
Сообщение от Ann None (?), 20-Июл-22, 16:44 
слава костылям и велосипедам!

п.с. как только ни извратятся, лишь бы имя файла в кавычки не брать...

Ответить | Правка | Наверх | Cообщить модератору

4. "Как в PHP полностью корректно экранировать для Shell'а?"  +2 +/
Сообщение от Кровосток (ok), 20-Июл-22, 16:53 
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...

Т.е. прямо вот можно файл с абсолютно любым именем просто оформить в виде

ln -s '$srcFile' '$dstFile' 

?

Ответить | Правка | Наверх | Cообщить модератору

6. "Как в PHP полностью корректно экранировать для Shell'а?"  +2 +/
Сообщение от Кровосток (ok), 20-Июл-22, 16:55 
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...

Спасибо за мысль, подумаю над этим вариантом.

Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

7. "Как в PHP полностью корректно экранировать для Shell'а?"  +2 +/
Сообщение от ыы (?), 21-Июл-22, 11:23 
> слава костылям и велосипедам!
> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
> брать...

А если в имени файла уже есть и пути, и кавычки, и точка  с запятой?

Ответить | Правка | К родителю #2 | Наверх | Cообщить модератору

8. "Как в PHP полностью корректно экранировать для Shell'а?"  +1 +/
Сообщение от Кровосток (ok), 21-Июл-22, 14:33 
>> слава костылям и велосипедам!
>> п.с. как только ни извратятся, лишь бы имя файла в кавычки не
>> брать...
> А если в имени файла уже есть и пути, и кавычки, и
> точка  с запятой?

Вообще чисто с практической точки зрения, попробую сегодня создать такое имя и с ним проверить кавычки на месте. Достаточно ли будет например в исходном имени (пути) заменить все ' на \' и оставить неэкранированные лишь те которые обрамляют аргумент, т.е.

ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'

Но в моём конкретно случае, справедливости ради надо заметить, что в моём случае это будет структура каталогов, и дикий имён для них в БД не предполагается, т.к. это не "сырой пользовательский ввод", а сформированные условно мной данные. Поэтому на всякие совсем уж дикие спецсимволы я поставлю принудительную замену на _ и всё.

Ответить | Правка | Наверх | Cообщить модератору

9. "Как в PHP полностью корректно экранировать для Shell'а?"  +1 +/
Сообщение от Кровосток (ok), 22-Июл-22, 04:29 
> Вообще чисто с практической точки зрения, попробую сегодня создать такое имя и
> с ним проверить кавычки на месте. Достаточно ли будет например в
> исходном имени (пути) заменить все ' на \' и оставить неэкранированные
> лишь те которые обрамляют аргумент, т.е.
>
ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'

Не сработало. Т.е. создав файл с кавычкой в имени, не удаётся это имя ни просто поместить в кавычки, ни даже поместить в кавычки, экранировав "именную" кавычку как \'

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

Ответить | Правка | Наверх | Cообщить модератору

12. "Как в PHP полностью корректно экранировать для Shell'а?"  +1 +/
Сообщение от Ann None (?), 22-Июл-22, 16:26 
>[оверквотинг удален]
>> с ним проверить кавычки на месте. Достаточно ли будет например в
>> исходном имени (пути) заменить все ' на \' и оставить неэкранированные
>> лишь те которые обрамляют аргумент, т.е.
>>
ln -s 'ПУТЬ_\'ЭКРАНИРОВАНЫЙ\'_С_КАВЫЧКАМИ.jpg' 'КУДА_НАДО.jpg'

> Не сработало. Т.е. создав файл с кавычкой в имени, не удаётся это
> имя ни просто поместить в кавычки, ни даже поместить в кавычки,
> экранировав "именную" кавычку как \'
> Короче видимо можно помещать в кавычки, но вот от жоских экранируемых символов
> лучше просто предварительно избавляться, чтобы их принципиально в именах файлов и
> каталогов не было.

ln -s touch 'bloodstream'\''s file.txt' touch 'bloodstream'\''s link.txt'

Ответить | Правка | Наверх | Cообщить модератору

13. "Как в PHP полностью корректно экранировать для Shell'а?"  +1 +/
Сообщение от Ann None (?), 22-Июл-22, 16:29 
> ln -s touch 'bloodstream'\''s file.txt' touch 'bloodstream'\''s link.txt'

лишнего скопировал. так

ln -s touch 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'

Ответить | Правка | Наверх | Cообщить модератору

14. "Как в PHP полностью корректно экранировать для Shell'а?"  +1 +/
Сообщение от Ann None (?), 22-Июл-22, 16:30 
да блин

ln -s 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'

Ответить | Правка | Наверх | Cообщить модератору

15. "Как в PHP полностью корректно экранировать для Shell'а?"  +/
Сообщение от Кровосток (ok), 25-Июл-22, 16:53 
> да блин
> ln -s 'bloodstream'\''s file.txt' 'bloodstream'\''s link.txt'

Да, работает. Т.е. условно можно все одинарные кавычки в имени при необходимости заменять на '\'' ?

Спасибо за монетку в копилку знаний :)

Ответить | Правка | Наверх | Cообщить модератору

10. "Как в PHP полностью корректно экранировать для Shell'а?"  +/
Сообщение от Аноним (-), 22-Июл-22, 14:47 
> Собственно как организовать эту HOW_TO_ESC()?

getenv/setenv, я так в шелле пихаю аргументы в awk и там уже достаю нетронутыми. И места не будет занимать.

Ответить | Правка | Наверх | Cообщить модератору

11. "Как в PHP полностью корректно экранировать для Shell'а?"  +/
Сообщение от Аноним (-), 22-Июл-22, 14:53 
>> Собственно как организовать эту HOW_TO_ESC()?
> getenv/setenv, я так в шелле пихаю аргументы в awk и там уже
> достаю нетронутыми. И места не будет занимать.

А если у тебя там какая-нибудь магия с цонтрол флоў, вызов шелла делается методом "закат солнца вручную" с помощью вилки/экзекуции. Или нереста, нерест позволяет указывать это икринкам.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру