0

这是一个非常简单的例子:

$val = "";

if(array_key_exists("param", $_REQUEST)) {
    $val = $_REQUEST["param"];
}

print "echo \"$val\"";
passthru("echo \"$val\"");

如果我通过了,我期待passthru()打印出来。但是,看起来 PHP 并没有解释转义序列并将 "\x41" 传递给. 我知道速记只适用于 PHP 中的双引号字符串,但在上面的示例中应该满足该条件。读取变量是否会修改任何内容?Atest.php?param=\x41passthru\xAA$_REQUEST

4

1 回答 1

0

转义序列不会在字符串中扩展,它们仅在代码中的字符串文字中扩展。

shell 命令printf将处理其格式字符串参数中的转义序列,因此您可以执行以下操作:

passthru("printf '$val'");

您还可以使用带引号的 shell 字符串$''来处理转义序列。

passthru("echo \$'$val'");
于 2020-02-20T03:18:29.383 回答