
通过将前端请求方式从 get 改为 post,并在 php 端校验请求方法与来源,可有效阻止用户直接在浏览器地址栏访问敏感逻辑文件(如 test.php?action=try),避免绕过业务校验触发关键函数(如 paywheel、getreward)。
通过将前端请求方式从 get 改为 post,并在 php 端校验请求方法与来源,可有效阻止用户直接在浏览器地址栏访问敏感逻辑文件(如 test.php?action=try),避免绕过业务校验触发关键函数(如 paywheel、getreward)。
在 Web 游戏或抽奖类应用中(如基于 winwheel.js 的转盘系统),后端 PHP 文件(如 test.php 或 wheel-responder.php)常负责核心业务逻辑:扣减积分、生成奖品、计算中奖位置等。若这些接口仅依赖 $_GET['action'] 判断行为,攻击者只需在浏览器输入 test.php?action=try 即可绕过前端控制流程,重复调用 payWheel() 和 getReward(),造成资损或逻辑漏洞。
✅ 推荐解决方案:强制使用 POST 请求 + 服务端双重校验
-
前端:改用
$.post()并移除 URL 中的 action 参数(更安全)
避免将敏感操作暴露在 URL 中(易被日志、代理、Referer 泄露)。推荐将 action 作为请求体传递:
function startSpin() {
if (wheelSpinning === false) {
$.post("wheel-responder.php", {
action: "rotate"
}, function(data) {
console.log(data);
WheelOfFortune.rotationAngle = 0;
WheelOfFortune.animation.spins = 10;
WheelOfFortune.animation.stopAngle = data.lastPosition || 0;
WheelOfFortune.startAnimation();
wheelSpinning = true;
}).fail(function() {
alert("抽奖请求失败,请重试");
});
}
}-
后端:严格校验请求方法、必要参数及业务前置条件
在wheel-responder.php中,不再依赖$_GET['action'],而是检查$_POST['action'],并强化鉴权逻辑:
<?php
// wheel-responder.php
header('Content-Type: application/json; charset=utf-8');
// ✅ 1. 强制仅允许 POST 请求
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
exit;
}
// ✅ 2. 检查必需参数
if (!isset($_POST['action']) || !in_array($_POST['action'], ['rotate'])) {
http_response_code(400);
echo json_encode(['error' => 'Invalid or missing action']);
exit;
}
// ✅ 3. 业务校验:验证用户会话与积分(示例)
session_start();
if (!isset($_SESSION['user_id']) || !isset($_SESSION['credit'])) {
http_response_code(401);
echo json_encode(['error' => 'Login required']);
exit;
}
$mycredit = (int)$_SESSION['credit'];
if ($mycredit < 100) {
echo json_encode(['error' => 'Insufficient credit']);
exit;
}
// ✅ 4. 执行核心逻辑(原 _Spin 函数应在此处调用)
// 注意:此处需确保 _Spin() 已定义,且不直接暴露 payWheel()/getReward() 给外部调用
$result = _Spin(rand(1, 10), 100);
// ✅ 5. 返回标准化 JSON 响应
if ($result && isset($result['stopPosition'])) {
echo json_encode(['lastPosition' => $result['stopPosition']]);
} else {
echo json_encode(['error' => 'Spin failed']);
}
?>⚠️ 重要注意事项
-
不要仅依赖
$_SERVER['HTTP_REFERER']或X-Requested-With头做校验:它们可被客户端伪造,仅作辅助参考;核心防护必须基于请求方法(POST)+ 会话状态 + 业务规则。 - 敏感操作务必幂等化或加防重放机制:例如记录用户本次抽奖时间戳/次数,防止 JS 被恶意复用。
-
PHP 文件建议置于 Web 根目录外(如
/app/wheel-responder.php),并通过入口脚本路由:进一步降低直接访问风险。 -
生产环境启用 CSRF Token(可选增强):对
rotate操作添加一次性 token,从前端表单或 JS 初始化时获取并提交。
总结:将接口改为 POST 是最轻量、最有效的第一道防线;配合会话校验与清晰的错误响应,即可在不修改业务逻辑的前提下,显著提升抽奖系统的安全性与健壮性。
立即学习“PHP免费学习笔记(深入)”;



















