我正在使用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);
这里发生了什么?我该如何解决这个问题?
答案 0 :(得分:1)
问题是你是直接将变量传递给sprintf,但这不是它的工作原理。你指定参数类型,然后按顺序提供变量作为sprintf函数的连续参数,如下所示:
$c = sprintf("DBUS_SESSION_BUS_ADDRESS=%s /usr/bin/notify-send \"TITLE\" \"MESSAGE\"", $DBUS_SESSION);
system($c);
这应解决NULL BYTE detected
错误