让post参数内的sql 通过客户端提交到后台

模拟复现步骤【Yii】:前端通过ajax 发送一个post 请求

  1. 请求参数
{
    "test_sql": "select max_amount from pbv2_summary a where a.type='4'"
}
  1. 收到错误的收集:
    1. inso : Error: Failure when receiving data from the peer 直接就是curl 错误
    2. xhr : Network Error

排查思路:

  • 检查服务器nginx请求日志,发现没有任何请求,问题定位到客户端
  • 采用insomnia 客户端模拟前端请求方式,直接提示 Error: Failure when receiving data from the peer 意思很明确,就是我们的请求无效,这个时候发现了问题,参数直接导致了请求停止
  • 尝试修改sql 对两头 加上 <> 如: <select max_amount from pbv2_summary a where a.type='4'> 发现顺利通过
  • 以上是先采取的步骤3 先处理了问题,然后又去查这个问题,发现是一些特殊sql 符号在转义时出现了问题,复测几遍,正常
  • 我用本地的laravel9框架直接发送请求发现参数能正常接收到 工具是 insomnia ,走的是我本地的nginx,这次的结果正常读取到,访问我们使用的IP 代理转发,我本地是域名直连

解决方案:

  • sql 两头加上 <> 以特殊转义
  • 将整体参数进行base64 编码之后提交到后台

如果谁有更好的解决方案,请留言,对于提交sql 的这种

测试代码:

$curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_PORT => '8008',
        CURLOPT_URL => 'http://ip/test',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => 'POST',
        CURLOPT_POSTFIELDS => "{\n\t\"test_sql\": \"select max_amount from pbv2_summary a where a.type='4'\"\n}",
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json'
        ],
    ]);

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    return [
        'body' => $err,
        'res' => $response
    ];

移除转义中的 \n 也能请求,推断是sql 在发送时的转义导致了语法错误

如果有遇到相关的问题,欢迎留言

每天一点小知识,到那都是大佬,哈哈
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!