PHP exec |尝试设置DBUS_SESSION_BUS_ADDRESS时出现空字节错误

时间:2017-12-18 19:49:58

标签: php shell unix exec

我正在使用PHP构建CLI APP,我需要使用notify-send作为root用户发送通知。

现在我知道在尝试发送通知之前需要设置DBUS_SESSION_BUS_ADDRESS。否则它将无效。

现在这下面的代码:

$c = sprintf("DBUS_SESSION_BUS_ADDRESS=".$DBUS_SESSION." /usr/bin/notify-send \"TITLE\" \"MESSAGE\"");
system($c);

引发错误

  

system():检测到NULL字节。可能的攻击   /filepath.php on   第186行

从我的广泛调试中我发现$DBUS_SESSION导致问题。但是,如果我对$DBUS_SESSION值进行硬编码,则该命令可以正常运行!。

像这样:

$c = sprintf("DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus,guid=5ded8923178f8ea19642e36a5a37eb76 /usr/bin/notify-send \"sdfTITLE\" \"MESSAGE\"");
system($c);

这里发生了什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是你是直接将变量传递给sprintf,但这不是它的工作原理。你指定参数类型,然后按顺序提供变量作为sprintf函数的连续参数,如下所示:

$c = sprintf("DBUS_SESSION_BUS_ADDRESS=%s /usr/bin/notify-send \"TITLE\" \"MESSAGE\"", $DBUS_SESSION);
system($c);

这应解决NULL BYTE detected错误