基于PHP和JS的司机预约Web应用:如何保障Google Maps Distance Matrix API回调防作弊?
防护Google Distance Matrix API回调作弊的实用方案
嘿,我来分享几个针对你这个网约车预约应用场景的作弊防护思路,都是实际项目里踩过坑后总结出来的,应该能帮到你:
1. 把核心计算逻辑完全移到后端(PHP)
客户端的任何请求参数都可能被篡改——比如用户通过调试工具修改起点/终点坐标,伪造出超长距离来骗取更高费用。所以绝对不能让前端直接调用Distance Matrix API,正确的流程应该是:
- 前端仅收集起点/终点的用户输入,然后把这些数据提交到你的PHP后端
- 由PHP后端发起对Google Distance Matrix API的请求
- 后端拿到合法结果后,再返回给前端做展示或计费
举个简单的代码示例:
前端JS(仅负责传参)
// 假设用户选择了起点和终点坐标 const origin = "39.9042,116.4074"; // 北京天安门 const destination = "31.2304,121.4737"; // 上海外滩 // 提交到后端接口 fetch('/api/calculate-distance.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ origin, destination }) }) .then(response => response.json()) .then(data => { // 处理后端返回的距离数据 console.log('计算的距离:', data.distance.text); });
PHP后端(负责调用API并校验)
<?php // 从请求中获取参数 $input = json_decode(file_get_contents('php://input'), true); $origin = $input['origin'] ?? ''; $destination = $input['destination'] ?? ''; // 先做基础参数校验 if (empty($origin) || empty($destination)) { http_response_code(400); echo json_encode(['error' => '参数缺失']); exit; } // 调用Google Distance Matrix API $apiKey = '你的Google API密钥'; $url = "https://maps.googleapis.com/maps/api/distancematrix/json?origins={$origin}&destinations={$destination}&travelMode=DRIVING&avoidTolls=true&key={$apiKey}"; $response = file_get_contents($url); $responseData = json_decode($response, true); // 校验API返回的合法性 if ($responseData['status'] !== 'OK' || empty($responseData['rows'][0]['elements'][0])) { http_response_code(500); echo json_encode(['error' => '距离计算失败']); exit; } $distance = $responseData['rows'][0]['elements'][0]['distance']; // 可以在这里再做一层距离合理性校验(比如不能超过你服务覆盖的最大距离) // 返回合法结果给前端 echo json_encode([ 'distance' => $distance, 'status' => 'success' ]); ?>
2. 对传入的坐标做严格校验
即使是后端处理,也要对用户传入的起点/终点坐标做双重校验:
- 格式校验:确保是合法的经纬度格式(比如
纬度,经度,数值范围符合地理规则:纬度-9090,经度-180180) - 区域校验:如果你的服务只覆盖特定城市/区域,要检查坐标是否在这个范围内,防止用户传入跨城市甚至跨国家的坐标来伪造距离
示例PHP校验函数:
function isValidCoordinate($coord) { list($lat, $lng) = explode(',', $coord); if (!is_numeric($lat) || !is_numeric($lng)) { return false; } $lat = (float)$lat; $lng = (float)$lng; // 基础范围校验 if ($lat < -90 || $lat > 90 || $lng < -180 || $lng > 180) { return false; } // 假设你的服务只覆盖北京区域,这里可以加更严格的边界判断 $beijingMinLat = 39.4; $beijingMaxLat = 40.2; $beijingMinLng = 115.4; $beijingMaxLng = 117.5; return ($lat >= $beijingMinLat && $lat <= $beijingMaxLat && $lng >= $beijingMinLng && $lng <= $beijingMaxLng); }
3. 给Google API密钥加严格限制
在Google Cloud控制台里,给你的API密钥设置以下限制,防止密钥被滥用:
- IP限制:只允许你的后端服务器IP调用该API,这样即使密钥泄露,别人也没法在其他服务器上使用
- API限制:仅允许密钥调用Distance Matrix API,避免被用于其他Google服务
- 请求配额:设置合理的每日请求上限,防止恶意刷量消耗你的API额度
- 启用API签名验证:给请求添加签名,确保请求是由你的后端发起的,无法被篡改
4. 结合司机GPS轨迹做事后复核
如果你的应用有司机端GPS轨迹上传功能,可以在行程结束后,把司机实际行驶的轨迹和Distance Matrix计算的路线做对比:
- 解码司机上传的Polyline轨迹点,计算实际行驶的总距离
- 和API返回的预估距离做差值对比,如果偏差超过合理范围(比如20%),标记为异常订单,人工复核
5. 对API返回结果做合理性校验
后端拿到Google API的返回结果后,不要直接返回给前端,先做一层合理性判断:
- 检查返回的
status是否为OK,忽略INVALID_REQUEST、ZERO_RESULTS等异常状态 - 检查距离值是否合理:比如不能为0(除非起点终点完全相同),不能超过你服务覆盖的最大距离阈值
- 检查行驶时间是否符合常理,比如10公里的路程不可能只有1分钟
总的来说,核心思路就是永远不信任客户端数据,把敏感计算和校验都放在后端,再结合多层验证和事后复核,就能大幅降低作弊的可能性啦。
内容的提问来源于stack exchange,提问作者Jobel
相关产品推荐
相关产品推荐

