Что такое код escapeshellarg


FPublisher

Web-технологии: База знаний

Документация PHP

escapeshellarg

(PHP 4 >= 4.0.3, PHP 5)

escapeshellarg — Escape a string to be used as a shell argument

Описание

string escapeshellarg ( string $arg )

escapeshellarg() adds single quotes around a string and quotes/escapes any existing single quotes allowing you to pass a string directly to a shell function and having it be treated as a single safe argument. This function should be used to escape individual arguments to shell functions coming from user input. The shell functions include exec(), system() and the backtick operator.

Список параметров

The argument that will be escaped.

Возвращаемые значения

The escaped string.

Примеры

Пример #1 escapeshellarg() example

( ‘ls ‘ . escapeshellarg ( $dir ));
?>

Сочетание escapeshellcmd и escapeshellarg

Сегодня я обнаружил очень странную ошибку в своем приложении, и я не совсем уверен, как ее исправить.

Форма позволяет пользователю что-то делать. Для этого ему нужно вызвать внешнюю команду через систему. Поэтому я решил использовать escapeshellcmd для этого.

что не то, что я хотел (обратите внимание, неправильно \& что дает дополнительный нежелательный символ ‘\’).
Поэтому я предложил три разных решения, и я не знаю, какое из них мне лучше выбрать, потому что только одно дает мне правильное решение.

Какое из этих решений предпочтительнее другого? Зачем? Есть ли другое (правильное) решение этой дилеммы?

Решение

Вы должны использовать:

Единственная причина, по которой вы захотите использовать escapeshellcmd если вы хотите разрешить пробелам внутри переменных разделять аргументы. Если вы просто хотите передать аргументы с экранированием, используйте escapeshellarg ,

Как я могу изменить escapeshellarg?

Ну, заголовок говорит все.
в php, как мне отменить escapeshellarg()? Точнее, что такое встроенная функция (если она есть), которая изменит ее.

2 ответа

Самый тщательный маршрут — найти то, что escapeshellarg() делает и делать наоборот. В среде linux это похоже на то, что он просто заботится о одиночных кавычках. В среде Windows это делает немного больше. Ваша обратная функция также должна учитывать это.

Что касается встроенной функции: Короткий ответ: «нет никого». Долгий ответ: нет никого, потому что экранированные аргументы оболочки никогда не предназначались для того, чтобы получить синтаксический анализ PHP (почему они вообще избегают их?), Поэтому никто никогда не писал их и не представлял его как патч для PHP. Если вы передаете аргументы в PHP-приложение CLI, вам не нужно делать ненужные вещи, как это было сделано интерпретатором.

Usecase:
При создании команды все аргументы должны быть надлежащим образом экранированы. Но при использовании PS , чтобы найти, выполняется ли эта команда, кавычки лишены. Поэтому сравнение сложно. В случае, когда единственными проверенными программами являются те, которые запускаются с помощью php-сохранения, PID в порядке, но если мы должны учитывать процессы, которые были запущены с других средств, это сложнее

В чем разница между escapeshellarg и EscapeShellCmd?

December 2020

23k раз

PHP имеет 2 тесно связанные функции, escapeshellarg() и escapeshellcmd() . Они оба , кажется, делают подобные вещи, а именно помочь сделать строку безопаснее использовать в system() / exec() / и т.д..

Какой из них следует использовать? Я просто хочу , чтобы иметь возможность принять некоторые из пользовательского ввода и выполнить команду на ней, и не все взорвется. Если PHP был EXEC-тип-функция , которая приняла массив строк (как ARGV), который обходит оболочку, я хотел бы использовать это. Подобно Пайтон subprocess.call() функции.

4 ответы

В PHP документы изложить разницу:

EscapeShellCmd :

Эти символы предваряются обратной косой черты: # &; `| *

<> ^ () [] <> $ \, \ x0A и \ XFF. «И» экранируются только если они не спарены. В Windows все эти символы плюс% заменяются пробелом вместо.

escapeshellarg :

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

escapeshellarg () добавляет одинарные кавычки строки и кавычки / ускользает все существующие одиночные кавычки, позволяя вам передавать строку непосредственно в функцию оболочки и с его можно рассматривать как единый безопасный аргумент.

escapeshellarg, как указывает его название, используется в качестве аргумента прохождения (ов) оболочки. Например, вы хотите перечислить текущий каталог,

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

Простое решение, чтобы определить разницу между любыми двумя аналогичными звучащими функциями PHP, чтобы написать краткий сценарий командной строки в PHP, который выводит все возможные пространства поиска и просто показать различия (в данном случае, сравнивая 256 значений):

Илон Маск рекомендует:  Что такое код asp customfields

Запуск выше в PHP 5.6 на Prompt выходов командной строке Windows:

Запуск же сценарий под PHP 5.5 для выхода Linux:

Основное отличие заключается в том, что PHP EscapeShellCmd () под Windows, префиксы символы с кареткой ^ вместо обратной косой черты \. Причуды под Linux от Chr (128) через Chr (255) для обоих EscapeShellCmd () и escapeshellarg () может быть объяснено использованием недействительных точек UTF-8, при падении кода, усеченный или неверно истолкованы.


Следует также отметить, что escapeshellarg () уходит гораздо меньше символов и до сих пор выполняет свою работу.

С точки зрения общей системы и безопасности и безопасности приложений, вы лучше использовать escapeshellarg () и индивидуально бежать каждый аргумент, который состоит из пользовательского ввода.

Один последний пример:

PHP escapeshellarg () на Windows, окружает строку с «характером кавычки двойным, а Linux использует Одиночную кавычку ‘характер. PHP на Windows, полностью заменяет внутренние двойные кавычки с пробелами (которые могли бы быть проблемой в некоторых случаях). PHP на Linux выходит немного из своего пути, чтобы избежать одинарные кавычки и обратные слэши \ экранируются \\ на Windows. PHP escapeshellarg () на Windows, также заменяет! и% знаков с пробелами. Все платформы заменить \ 0 с пробелами.

Обратите внимание, что поведение не обязательно согласуются между PHP версий и PHP документации не всегда отражает действительность. Дать быстрый скрипт или чтение исходного кода PHP два способа, чтобы выяснить, что происходит за кулисами.

Как правило, вы будете использовать escapeshellarg , делая один аргумент команды оболочки безопасной. Вот почему:

Предположим, что вам нужно, чтобы получить список файлов в каталоге. Вы придумали следующее:

(Это плохой способ сделать это, но для иллюстрации, медведь со мной)

Это работает «большой» для этого пути, но предположим, что путь дано было нечто более опасное:

Поскольку путь был использован данный unsanitised, любая команда потенциально может быть запущена. Мы можем использовать escapeshell* методы , чтобы попытаться предотвратить это.

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

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

Подводя итог, escapeshellcmd убеждается строка является только одной команды, в то время как escapeshellarg делает строку безопасной для использования в качестве единственного аргумента команды.

Что такое код escapeshellarg

Задача
Необходимо включить в командную строку внешние данные, например передать в программу пользовательский ввод в качестве аргумента, но для предотвращения всяких неожиданностей требуется преобразовать специальные символы в escape-последовательности.

Решение
Обработка аргументов выполняется посредством функции escapeshellarg():

А функция escapeshellcmd() применяется для обработки имен программ:

Обсуждение
Рискованно помещать в командную строку символы, не преобразованные в escape-последовательности. Никогда не передавайте непреобразованный пользовательский ввод ни в одну из функций PHP, работающих с командной средой. Всегда преобразуйте в escape-последовательности соответствующие символы в команде и в аргументах. Это оченьважно. Не принято выполнять командные строки, поступившие из веб-форм, и мы даже в шутку не рекомендуем ничего подобного. Однако иногда требуется запустить внешнюю программу, поэтому преобразование команд и аргументов в escape-последовательности полезно.

Функция escapeshellarg() заключает аргументы в одиночные кавычки (и превращает в escape-последовательность каждую стоящую особняком одиночную кавычку). Следующий код позволяет вывести статус определенного процесса:

Вызов функции escapeshellarg() гарантирует, что будет отображен соответствующий процесс, даже если он содержит неожиданные символы (например, пробел). Это также предотвращает запуск непредусмотренных команд. Если переменная $process_id содержит:

не только показывает статус процесса, равный 1, но также выполняет команду rm -rf /. Однако:

выполняет команду /bin/ps 1; rm -rf, которая выдает ошибку, поскольку строка «1-точка с запятой-пробел-rm-пробел-дефис-rf» не является допустимым идентификатором процесса.
Точно так же, escapeshellcmd() предотвращает выполнение непредусмотренных командных строк. Этот код запускает различные программы, в зависимости от значения $which_program:

Например, если значение переменной $which_program равно pdf 12, то сценарий запустит команду /usr/local/bin/formatter-pdf с аргументом 12.

Но если переменная $which_program равна pdf 12; 56, то сценарий запустит /usr/local/ bin/formatter-pdf с аргументом 12, а затем запустит программу 56, что является ошибкой. Чтобы успешно передать аргументы программе formatter-pdf, необходима функция escapeshellcmd():

Этот код запускает программу /usr/local/bin/formatter-pdf и передает ей два аргумента – 12 и 56.

Zenexer / escapeshellrce.md

I’m working on cleaning up this advisory so that it’s more informative at a glance. Suggestions are welcome.

This advisory addresses the underlying PHP vulnerabilities behind Dawid Golunski’s CVE-2020-10033, CVE-2020-10045, and CVE-2020-10074. It assumes prior understanding of these vulnerabilities.

This advisory does not yet have associated CVE identifiers.

  1. It’s impossible to write a universal shell escaping function, for a variety of reasons. However, PHP attempts to prov >
  1. php_escape_shell_cmd, the C function behind escapeshellcmd, is an «inherently dangerous function» because it can never fulfill the security guarantees it attempts to prov >
Илон Маск рекомендует:  Что такое код mcal_popen

Numbered to match detailed descriptions above.

  • CWE-242: Use of Inherently Dangerous Function
    • (1) php_escape_shell_cmd is used internally by several PHP functions, and even more when safe_mode is enabled. It can never fulfill the security promise it attempts to make.
  • CWE-439: Behavioral Change in New Version or Environment
    • (2) popen, exec, shell_exec, system, passthru, proc_open, and mail cannot receive user input for at least one argument, as their behavior is environment-dependent, and escaping is infeasible. This would not be an issue if secure alternatives, such as pcntl_exec, were universally available.
  • CWE-75: Failure to Sanitize Special Elements into a Different Plane (Special Element Injection)
    • (3) escapeshellarg and escapeshellcmd fail to neutralize special elements in the context of many Windows applications.
    • (4) escapeshellarg and escapeshellcmd may fail to neutralize special elements in the context of shells other than sh and bash on POSIX platforms.
  • CWE-838: Inappropriate Encoding for Output Context
    • (5) escapeshellarg and escapeshellcmd may behave incorrectly when the current encoding of PHP, the script, or the shell is not ASCII-compatible (e.g., stateful encodings).
  • CWE-684: Incorrect Provision of Specified Functionality
    • (6) escapeshellarg and escapeshellcmd do not and cannot reasonably prov >

      As of writing, this utility provides an accurate representation of PHP’s escapeshell functions on Linux and Windows. It was released hastily and isn’t designed to be a long-term testing solution.

      On Windows, the shell doesn’t handle command line parsing; the target program does. Different technologies adhere to different algorithms when parsing arguments. As such, it’s not possible to write a universal escape function that works on Windows.


      On POSIX systems such as Linux, Mac, and BSD, the shell handles command line parsing. However, the user typically has control over the shells available on their system, and different distros often favor different shells. escapeshellarg and escapeshellcmd are designed for sh and bash; using them with other shells means that input may be improperly escaped. It’s not reasonable to write a shell escape function that handles all possible shells.

      On any platform, character encoding can play a part in how arguments are interpreted, particularly when non-ASCII-compatible encodings are used. This isn’t likely to be an issue in regions that use Latin-based alphabets, but in other parts of the world, the current escape functions could have unpredictable results.

      Application developers will need to avoid using escapeshellarg and escapeshellcmd to sanitize user input. Even if input was already sanitized, once passed through those functions, it should be considered dirty. This makes certain parameters of certain built-in functions (e.g., $additional_parameters of mail) incapable of securely handling user input securely.

      Safe mode must be disabled.

      PHP should not be run on Windows in production environments, or where input or code can be affected by third parties. Under no circumstances are escapeshellarg or escapeshellcmd remotely secure on Windows, and applications that rely on them for security will be vulnerable.

      Developer should prefer pcntl_fork + pcntl_exec over alternatives that pass commands through the shell. Unfortunately, these functions aren’t available in many environments, such as HHVM.

      If shell escaping absolutely must be applied to user input, be sure to check that the shell and encoding are what you expect them to be. As a general rule, on POSIX, UTF-8 and sh/bash should be safe with escapeshellarg. On Windows, escaping will need to be customized for each executable.

      escapeshellcmd should be considered inherently dangerous and shouldn’t be used for escaping under any circumstances. Functions that use it internally, such as mail, will need to be handled with care.

      Sanitizing input for safe shell parsing

      A proper utility will eventually land here: https://github.com/Zenexer/safeshell

      In the meantime, the following code block is written by me and in the public domain, per CC0. There’s also a more advanced version combining the techniques in a separate file below, but it hasn’t been thoroughly tested yet.

      PHP functions that rely on escapeshellcmd, such as mail, will need to be redesigned to take arrays of arguments and avoid using the shell.

      PHP functions that rely on the shell, such as popen and exec, will need to be replaced with functions that take arrays of arguments and avoid using the shell (e.g., fork + execve). This behavior already exists in the form of pcntl_fork + pcntl_exec, but pcntl isn’t as widely supported as popen and exec.

      Before this document was published, it was clear that the probability of this information already being known by malicious parties was high. With an increased chance in widespread attacks following the attention CVE-2020-10033 and CVE-2020-10045, priority was placed on distributing the advisory as quickly and efficiently as possible.

      Как мне отменить escapeshellarg?

      Ну, заголовок говорит все.
      в php, как мне изменить escapeshellarg()? Чтобы быть более точным, что такое встроенная функция (если она есть), которая изменит ее.Как мне отменить escapeshellarg?

      Что вы пробовали? так далеко? Я получаю ‘) (grallehsepacse’, см. Http://codepad.org/RCeIbFC0 – hakre

      Нет официального способа. Объясните, что вы пытаетесь сделать, поэтому у нас есть некоторый контекст. – Cfreak

      ответ

      Самый тщательный маршрут — найти exactly what escapeshellarg() does и сделать обратное. В среде Linux это похоже на то, что он просто заботится о одиночных кавычках. В среде Windows это немного больше. Ваша обратная функция также должна учитывать это.

      Относительно встроенной функции: Короткий ответ — «нет никого». Долгий ответ: нет никого, потому что экранированные аргументы оболочки никогда не предназначались для того, чтобы получить синтаксический анализ PHP (почему они вообще избегают их?), Поэтому никто никогда не писал их и не представлял его как патч для PHP. Если вы передаете аргументы в PHP-приложение CLI, вам не нужно делать ненужные вещи, как это было сделано интерпретатором.

      Не знал, что это использует функции ‘mb_’. – hakre

      @hakre Я тоже этого не делал, пока не посмотрел. =) – Crontab

      Спасибо, но у меня уже есть код, чтобы почитать эффекты, искал встроенную функцию. –

      Usecase:
      При создании команды все аргументы должны быть надлежащим образом экранированы. Но при использовании PS , чтобы найти, выполняет ли эта команда, кавычки лишены. Поэтому сравнение сложно. В случае, когда единственными проверенными программами являются те, которые были начаты с помощью php-сохранения, PID в порядке, но если мы должны принимать во внимание процессы, которые были запущены с других средств, это сложнее

      escapeshellarg () для urlencoded данных

      Я отправил $data (массив) с одного сервера на другой, как показано ниже. Когда он попадает на второй сервер, элементы $data, очевидно, urlencoded. На втором сервере я хочу использовать некоторые из $data в exec (). Несмотря на то, что я передаю хэш и удостоверяюсь, что он действителен на другом конце, я все равно хотел бы escapeshellarg() по мере необходимости. Так как элементы $data уже urlencoded, как я должен применить escapeshellarg()? Спасибо

      1 ответ

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

      Для простоты я бы просто сериализовал Ваш $data массив, зашифровал его и отправил на ваш сервер.

      На стороне вашего факс-сервера просто расшифровать данные и несериализовать его снова

      Серверная часть, которую вы знаете, имеет точно такие же данные, которые были у вас на вашем клиенте, и может делать с ним все, что вы хотите.

      Кроме того, вы можете использовать что-то вроде ответа на вызов для проверки Вашего хоста.

      Как я могу изменить escapeshellarg?

      Ну, заголовок говорит все.
      в php, как мне отменить escapeshellarg()? Точнее, что такое встроенная функция (если она есть), которая изменит ее.

      2 ответа

      Самый тщательный маршрут — найти то, что escapeshellarg() делает и делать наоборот. В среде linux это похоже на то, что он просто заботится о одиночных кавычках. В среде Windows это делает немного больше. Ваша обратная функция также должна учитывать это.

      Что касается встроенной функции: Короткий ответ: «нет никого». Долгий ответ: нет никого, потому что экранированные аргументы оболочки никогда не предназначались для того, чтобы получить синтаксический анализ PHP (почему они вообще избегают их?), Поэтому никто никогда не писал их и не представлял его как патч для PHP. Если вы передаете аргументы в PHP-приложение CLI, вам не нужно делать ненужные вещи, как это было сделано интерпретатором.

      Usecase:
      При создании команды все аргументы должны быть надлежащим образом экранированы. Но при использовании PS , чтобы найти, выполняется ли эта команда, кавычки лишены. Поэтому сравнение сложно. В случае, когда единственными проверенными программами являются те, которые запускаются с помощью php-сохранения, PID в порядке, но если мы должны учитывать процессы, которые были запущены с других средств, это сложнее

      Что такое код escapeshellarg

      76 просмотра

      1 ответ

      6950 Репутация автора

      Сегодня я обнаружил очень странную ошибку в своем приложении, и я не совсем уверен, как ее исправить.

      Форма позволяет пользователю что-то делать. Для этого ему нужно вызвать внешнюю команду через систему. Поэтому я решил использовать escapeshellcmd для этой цели.

      это не то, что я хотел (обратите внимание на неправильное, \& которое дает дополнительный нежелательный символ ‘\’). Таким образом, я предложил три разных решения, и я не знаю, какое из них мне лучше выбрать, потому что только одно дает мне правильное решение.

      Какое из этих решений предпочтительнее другого? Зачем? Есть ли другое (правильное) решение этой дилеммы?

      Ответы (1)

      1 плюс

      6973 Репутация автора

      Вы должны использовать:

      Единственная причина, по которой вы когда-либо захотите использовать escapeshellcmd это то, что вы хотите разрешить пробелам внутри переменных разделять аргументы. Если вы просто хотите передать аргументы с экранированием, используйте escapeshellarg .

      Илон Маск рекомендует:  Что такое код asp accesswrite
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL