The OpenNET Project / Index page

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



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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #4, #6, #7

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

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

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

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

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

ln -s '$srcFile' '$dstFile' 

?

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

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

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

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

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

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #2 Ответы: #8

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7 Ответы: #9

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8 Ответы: #12

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

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

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

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

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

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

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

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9 Ответы: #13

13. Сообщение от Ann None (?), 22-Июл-22, 16:29   +1 +/
> ln -s touch 'bloodstream'\''s file.txt' touch 'bloodstream'\''s link.txt'

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

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #12 Ответы: #14

14. Сообщение от Ann None (?), 22-Июл-22, 16:30   +1 +/
да блин

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

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13 Ответы: #15

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

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

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

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


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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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