Назад | Перейти на главную страницу

отследить источник команды оболочки

В нашем журнале ошибок apache (/ usr / local / apache / logs / error_log) для одного из наших серверов мы видим, что довольно часто выполняется команда оболочки, которая выдает ошибку, это выглядит так:

sh: list_price: command not found

list_price - это поле, которое мы используем в системе электронной коммерции на более чем 50 сайтах, и, конечно же, ничего подозрительного. Проблема в том, что мы понятия не имеем, как это передается в оболочку - мы проверили все вхождения exec () и system (), и мы просто не можем понять, как это будет проходить. Есть ли способ легче определить источник этого, поскольку нет ничего более значимого, чем то, что я указал выше. К вашему сведению, это на сервере под управлением CentOS 5, и все рассматриваемые сайты являются PHP.

Обратные кавычки (`) имеют в PHP особое значение. Они Операторы исполнения (звучит мрачно, не так ли). При использовании вне строки в качестве разделителя текста он выполняет команду между ними. Для следующего примера:

$commandResult = `ls -l`;
echo $commandResult; // Will output a directory listing of the current directory

Чтобы остановить поведение, вам просто нужно поместить его в одинарные кавычки (') или кавычки ("):

$commandResult = '`ls -l`';
echo $commandResult; // Will output `ls -l`;

Теперь вы, вероятно, сделали что-то вроде этого: (Ленивый код ниже, небезопасен против внедрения sql, но это просто пример).

$query = 'SELECT * FROM sometable ORDER BY ' . `list_price`;

Но забыл заключить его в кавычки, что привело к двум вещам:

  • PHP не выдал синтаксической ошибки, потому что это допустимый синтаксис.
  • Вы получили неудачную команду оболочки выше.

Найдите в базе кода любую ссылку на list_price и убедитесь, что она заключена в одинарные кавычки или кавычки.

Ты используешь обратные кавычки вокруг list_price, не цитируя их? Это могло быть твоей проблемой.

Вы, должно быть, что-то не замечаете, не в обиду Может быть, вы можете попробовать создать сценарий оболочки list_price, чтобы он мог записывать некоторый файл журнала о том, как и когда он был выполнен?