AWS CLI命令可在Bash上运行,但不适用于PHP shell_exec()

时间:2018-06-19 12:01:16

标签: php aws-cli shell-exec

我想触发以下命令:

aws route53 change-resource-record-sets --hosted-zone-id XXX
 --change-batch '{ "Comment": "2018-06-19-11:31", "Changes":
[ { "Action": "CREATE", "ResourceRecordSet": { "Name": "example.com",
"Type": "TXT", "TTL": 60, "ResourceRecords":
[ { "Value": "\"something\"" } ] } } ] }'

当我在bash上触发它时,它起作用,但是当我在PHP中运行它时,它不起作用:

$json = trim(shell_exec($cmd_aws_submit));
// or:
$json = trim(shell_exec("{$cmd_aws_submit}"));

AWS希望引用TXT记录的值("\"something\"")。我试图这样引用它:

$value = "\\\"" . $textvalue . "\\\"";
$value = "\"" . $textvalue . "\"";
$value = "\\'" . $textvalue . "\\'";
$value = "'" . $textvalue . "'";

所有方法均无效,我总是遇到以下错误:

  

解析参数'--change-batch'时出错:无效的JSON:       \ escape无效:第12行第23列(字符246)收到JSON:       {“ Comment”:“ 2018-06-19-11:54”,“ Changes”:[{“ Action”:       “ CREATE”,“ ResourceRecordSet”:{“ Name”:“ example.com”,       “类型”:“ TXT”,“ TTL”:60,“ ResourceRecords”:       [{“ Value”:“ \” something \“”}]}}]}

与其他aws不受限制的dns记录值一起,PHP shell_exec()可以完美地工作。

如果我在Bash上触发它,它可以在"\"something\""上完美运行-为什么它不能在PHP shell_exec()上运行?

1 个答案:

答案 0 :(得分:2)

您应该使用本机的escapeshellarg方法来转义传递给命令行的参数。如果您决定在某个阶段在JSON字符串中包含潜在的不安全数据,这也将保护您免受参数注入攻击。

$json = '{ "Comment": "2018-06-19-11:31", "Changes":
[ { "Action": "CREATE", "ResourceRecordSet": { "Name": "example.com",
"Type": "TXT", "TTL": 60, "ResourceRecords":
[ { "Value": "\"something\"" } ] } } ] }';

$command = "aws route53 change-resource-record-sets --hosted-zone-id XXX
 --change-batch " . escapeshellarg($json);

$result = trim(shell_exec($command));

您还可以选择将JSON字符串构建为数组,然后使用json_encode()为您构建字符串。