我有一个用例,我需要从外部API中获取格式化的PHP数组,然后将其发送到命令进行进一步处理。
唯一合理的选择是json_encode($ data)并将其传递给CLI,然后将json_decode($ data,true)传递给另一端。知道清理数据的重要性,我使用了escapeshellarg(json_encode($ data)),但这阻止了json_decode($ data,true)在另一端正确创建我的数组。
所以我的问题是,如果我们严格发送一个由json_encode()函数创建的字符串,是否有任何可能的shell注入点?
$cmd = "php {$artisan_path} my:command " . escapeshellarg(json_encode($data)) . " {$user_id} >> {$log_file} 2>&1 & echo $!;";
system($cmd);
答案 0 :(得分:1)
您可以对编码的JSON进行base64编码(并在另一端解码)。这保证给你一个非常有限的字符集(a-zA-Z0-9 + / =),对于我认为的shell来说,这些都不重要。
但确实增加了数据的大小(1/3)。
但是,通过管道传递数据可能是更好的选择,特别是如果它可能有点长。
答案 1 :(得分:0)
您可以使用serialize()
并将结果保存到文件中。然后将文件名传递给命令。
更精细(但很好)的方法是使用proc_open()
而不是system()
。使用proc_open()
,您可以完全控制cmd的stdin,stdout,stderr,并可以将数据传输到cmd的stdin中。