The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как в PHP полностью корректно экранировать для Shell'а?, !*! Кровосток, 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()?

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

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

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

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

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

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

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

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

      ln -s '$srcFile' '$dstFile' 

      ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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




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

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