
本文详解如何在 php curl post 请求中安全、灵活地注入动态变量(如金额和地址)到 json 请求体,避免字符串拼接风险,推荐采用 json_decode → 修改对象 → json_encode 的标准实践。
本文详解如何在 php curl post 请求中安全、灵活地注入动态变量(如金额和地址)到 json 请求体,避免字符串拼接风险,推荐采用 json_decode → 修改对象 → json_encode 的标准实践。
在 PHP 中通过 cURL 向远程 API(如 Monero JSON-rpc 服务)发送结构化 JSON 数据时,硬编码参数不仅难以维护,更存在严重安全隐患——直接拼接变量到 JSON 字符串中极易引发语法错误、类型失配或 JSON 注入漏洞(尤其当变量含引号、反斜杠或非 UTF-8 字符时)。正确做法是将 JSON 视为数据结构而非纯文本,利用 PHP 原生的 JSON 编解码能力进行类型安全的操作。
✅ 推荐方案:JSON 对象化修改(安全、可读、健壮)
首先定义待传入的变量,并确保其类型合法:
$PAYMENT_AMOUNT = 5000000; // 注意:建议使用整型表示原子单位(如 Satoshi / piconero),避免浮点精度问题 $ADDRESS = "CvqCDB3EwDzr1MEYxy4rQfzxxuiPdeTRSgtXbgh";
接着构造基础请求结构并动态注入变量:
// 1. 定义原始 JSON 模板(字符串形式) $template = '{ "jsonrpc": "2.0", "id": "0", "method": "transfer", "params": { "destinations": [ { "amount": 0, "address": "" } ] } }'; // 2. 解码为 PHP 对象(stdClass) $json = json_decode($template); if ($json === NULL) { throw new InvalidArgumentException('Invalid JSON template: ' . json_last_error_msg()); } // 3. 安全注入变量(自动处理转义与类型) $json->params->destinations[0]->amount = (int)$PAYMENT_AMOUNT; $json->params->destinations[0]->address = (string)$ADDRESS; // 4. 重新编码为规范 JSON 字符串(确保 UTF-8、转义完整) $postData = json_encode($json, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
最后配置 cURL 并执行请求:
立即学习“PHP免费学习笔记(深入)”;
$ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => 'http://localhost:18285/json_rpc', CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $postData, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_TIMEOUT => 30, ]); $result = curl_exec($ch); if (curl_errno($ch)) { echo 'cURL Error: ' . curl_error($ch); } else { $response = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { echo "Invalid JSON response received."; } else { print_r($response); } } curl_close($ch);
⚠️ 关键注意事项
- 绝不使用字符串插值(如 “”amount”:$PAYMENT_AMOUNT”):易导致 JSON 格式破坏、xss 风险及无法处理特殊字符;
- 始终验证 JSON 编解码结果:json_decode() 返回 null 表示解析失败;json_encode() 失败时返回 false;
- 显式类型转换:对 $PAYMENT_AMOUNT 强制 (int) 可防止意外传入字符串(如 “5000000abc”);
- 启用严格选项:json_encode(…, JSON_THROW_ON_ERROR)(PHP 7.3+)可替代手动 json_last_error() 检查;
- 生产环境务必启用 https:本地 http://localhost 仅用于开发,上线后必须使用 https:// 并校验证书。
✅ 总结
动态构建 JSON 请求体的核心原则是:先解码、再操作、后编码。该方式完全规避了字符串拼接陷阱,天然支持嵌套结构修改、自动转义与 Unicode 兼容,是 PHP 与现代 REST/JSON-RPC API 交互的标准实践。配合类型断言与错误处理,即可构建出高可靠性、易扩展的 API 调用逻辑。