【问题标题】:PHP exec | Null byte error when trying to set DBUS_SESSION_BUS_ADDRESSPHP 执行 |尝试设置 DBUS_SESSION_BUS_ADDRESS 时出现空字节错误
【发布时间】:2017-12-18 19:49:57
【问题描述】:

我正在使用 PHP 构建一个 CLI 应用程序,其中我需要使用 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 上 第 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);

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

【问题讨论】:

    标签: php shell unix exec


    【解决方案1】:

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

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

    这应该可以解决NULL BYTE detected 错误

    【讨论】:

    • 不幸的是我仍然有同样的错误。我认为错误是由于传递的字符串类型引起的。 DBUS 包含导致此问题的某些内容
    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2016-01-22
    • 1970-01-01
    • 2013-07-26
    • 2011-07-05
    相关资源
    最近更新 更多