В нашем журнале ошибок 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`;
Но забыл заключить его в кавычки, что привело к двум вещам:
Найдите в базе кода любую ссылку на list_price и убедитесь, что она заключена в одинарные кавычки или кавычки.
Ты используешь обратные кавычки вокруг list_price, не цитируя их? Это могло быть твоей проблемой.
Вы, должно быть, что-то не замечаете, не в обиду Может быть, вы можете попробовать создать сценарий оболочки list_price, чтобы он мог записывать некоторый файл журнала о том, как и когда он был выполнен?