我想触发以下命令:
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()
上运行?
答案 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()
为您构建字符串。