在我们其中一台服务器的 apache 错误日志 (/usr/local/apache/logs/error_log) 中,我们看到一个经常运行的 shell 命令引发错误,它看起来像这样:
sh: list_price: command not found
list_price 是我们在 50 多个网站的电子商务系统中使用的字段,当然没有任何可疑之处。问题是我们不知道它是如何传递给 shell 的——我们检查了所有出现的 exec() 和 system() ,我们只是看不到它是如何传递的。有什么方法可以让我们更容易地检测到这可能是什么原因,因为没有什么比我上面提到的更有意义的输出了。仅供参考,这是在运行 CentOS 5 的服务器上,所讨论的站点都是 PHP。
反引号 ( ` ) 在 PHP 中具有特殊含义。他们是执行操作员(听起来很可怕,不是吗)。当在字符串外部用作文本分隔符时,它会在它们之间执行命令。对于以下示例:
要停止该行为,您只需将其放在单引号 ( ' ) 或引号 ( " ) 之间:
现在,您可能做了这样的事情:(下面的惰性代码,对 sql 注入不安全,但只是一个示例)。
但是忘记在它周围加上引号,导致两件事:
在您的代码库中搜索 list_price 的任何引用,并确保它位于单引号或引号之间。
您是否在 list_price 周围使用反引号,而不引用它们?这可能是你的问题。
你一定是忽略了什么,没有冒犯的意思。也许您可以尝试创建 list_price shell 脚本,以便它可以编写一些关于如何以及何时执行的日志文件?