让post参数内的sql 通过客户端提交到后台
模拟复现步骤【Yii】:前端通过ajax 发送一个post 请求
- 请求参数
{
"test_sql": "select max_amount from pbv2_summary a where a.type='4'"
}
- 收到错误的收集:
- inso :
Error: Failure when receiving data from the peer
直接就是curl 错误 - xhr :
Network Error
- inso :
排查思路:
- 检查服务器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 在发送时的转义导致了语法错误
如果有遇到相关的问题,欢迎留言