PHP 中使用 cURL 动态传递 JSON 参数变量的完整教程

4次阅读

PHP 中使用 cURL 动态传递 JSON 参数变量的完整教程

本文详解如何在 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 调用逻辑。

text=ZqhQzanResources