0

0

如何防止通过浏览器开发者工具伪造 AJAX 请求提交恶意数据

心靈之曲

心靈之曲

发布时间:2026-03-02 21:12:11

|

831人浏览过

|

来源于php中文网

原创

如何防止通过浏览器开发者工具伪造 AJAX 请求提交恶意数据

本文介绍在不依赖框架的前提下,通过服务端验证与客户端数据结构重构,从根本上防止用户利用浏览器控制台伪造 ajax 请求篡改游戏分数等关键业务数据。核心思路是:不信任前端传来的最终结果,而是由后端基于可信操作过程重新计算并校验。

本文介绍在不依赖框架的前提下,通过服务端验证与客户端数据结构重构,从根本上防止用户利用浏览器控制台伪造 ajax 请求篡改游戏分数等关键业务数据。核心思路是:不信任前端传来的最终结果,而是由后端基于可信操作过程重新计算并校验。

在纯前端实现的记忆游戏中,常见做法是 JavaScript 计算出最终得分(如 totalScore)后,直接通过 $.post() 提交用户名与分数至 PHP 后端保存。然而,这种设计存在严重安全隐患:任何熟悉基础 jQuery 的用户,只需在浏览器开发者工具中执行一行代码,即可绕过游戏逻辑,任意提交高分:

$.post("./backend/save_score.php", {"player_name": "Hacker", "score": 999999999});

仅靠前端限制(如禁用控制台、混淆代码、添加时间戳或随机 token)无法真正解决问题——因为所有前端逻辑均可被审查、调试与重放。真正的防护必须落在服务端。

md2card
md2card

Markdown转知识卡片

下载

✅ 正确方案:传递“过程”,而非“结果”

将前端职责从「计算并上报分数」转变为「记录并上报用户真实操作序列」,由 PHP 后端独立复现游戏逻辑、验证操作合法性,并最终生成可信分数。例如:

1. 前端:记录并发送操作日志(而非分数)

// 示例:记录每次翻牌的卡片 ID 和时间戳(可选)
const gameActions = [];

function onCardFlip(cardId) {
  gameActions.push({
    action: "flip",
    cardId: cardId,
    timestamp: Date.now()
  });
}

$("#submitScore").on("click", function() {
  const playerName = $('#playerName').val().trim() || "Unknown";

  // 发送完整操作序列,不含 score 字段
  const payload = {
    player_name: playerName,
    actions: gameActions,  // 如 [{action:"flip", cardId:"c3"}, ...]
    game_version: "1.0"    // 防止旧版客户端绕过新验证逻辑
  };

  $.post("./backend/save_score.php", payload, function(response) {
    if (response.success) {
      fetchHighScores();
      $("#submitScore").prop('disabled', true);
    } else {
      alert("提交失败:" + response.error);
    }
  }).fail(() => alert("网络错误,请重试"));
});

2. 后端(save_score.php):严格校验 + 重算分数

<?php
header('Content-Type: application/json; charset=utf-8');
session_start();

// 简单防重复提交(可选)
if (isset($_SESSION['score_submitted']) && time() - $_SESSION['score_submitted'] < 5) {
    echo json_encode(['success' => false, 'error' => '请求过于频繁']);
    exit;
}

$data = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$actions = $data['actions'] ?? [];
$playerName = filter_var($data['player_name'] ?? '', FILTER_SANITIZE_STRING);

// ✅ 关键校验步骤:
// 1. 检查 actions 是否为空或格式非法
if (!is_array($actions) || count($actions) === 0) {
    echo json_encode(['success' => false, 'error' => '无效的操作记录']);
    exit;
}

// 2. 校验操作序列是否符合游戏规则(示例逻辑)
$validCards = ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']; // 实际应从数据库/配置加载
$flippedPairs = [];
$score = 0;

foreach ($actions as $action) {
    if ($action['action'] !== 'flip' || !in_array($action['cardId'], $validCards)) {
        echo json_encode(['success' => false, 'error' => '检测到非法操作']);
        exit;
    }

    // 模拟配对逻辑:每成功一对得 10 分(实际按你的规则实现)
    $flippedPairs[] = $action['cardId'];
    if (count($flippedPairs) === 2) {
        if ($flippedPairs[0] === $flippedPairs[1]) {
            $score += 10;
        }
        $flippedPairs = []; // 重置
    }
}

// 3. 可选:添加时间合理性检查(如总耗时过短则质疑作弊)
$duration = (end($actions)['timestamp'] ?? 0) - ($actions[0]['timestamp'] ?? 0);
if ($duration < 1000) { // 少于 1 秒完成?极大概率作弊
    error_log("Suspiciously fast game: {$playerName}, {$duration}ms");
    echo json_encode(['success' => false, 'error' => '游戏时间异常,拒绝提交']);
    exit;
}

// ✅ 安全入库:仅使用后端计算的 $score
try {
    $pdo = new PDO("mysql:host=localhost;dbname=memory_game", $user, $pass);
    $stmt = $pdo->prepare("INSERT INTO scores (player_name, score, created_at) VALUES (?, ?, NOW())");
    $stmt->execute([$playerName, $score]);
    $_SESSION['score_submitted'] = time();
    echo json_encode(['success' => true, 'score' => $score]);
} catch (Exception $e) {
    error_log("DB save failed: " . $e->getMessage());
    echo json_encode(['success' => false, 'error' => '服务器内部错误']);
}

⚠️ 重要注意事项

  • 永远不要信任 $_POST 中的 score、level、coins 等数值型结果字段,它们必须由服务端基于可验证行为重新生成;
  • 前端可增加轻量级辅助校验(如操作次数上限、最小耗时提示),但仅作用户体验优化,不可作为安全依据
  • 对敏感接口建议添加简单 Token 机制(如一次性 form_token 存入 session 并随请求提交),防御 CSRF(虽非本问题核心,但属良好实践);
  • 日志记录异常请求(如高频提交、超低耗时、非法 cardId),便于后续分析攻击模式。

通过将「分数计算权」完全移交服务端,并以可审计的操作序列为输入,你构建的不再是一个易被操控的“结果提交接口”,而是一个具备业务逻辑自证能力的「游戏过程验证服务」——这才是无框架环境下最坚实、最可持续的安全防线。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

326

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

404

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

514

2023.12.04

jquery实现分页方法
jquery实现分页方法

在jQuery中实现分页可以使用插件或者自定义实现。想了解更多jquery分页的相关内容,可以阅读本专题下面的文章。

291

2023.12.06

jquery中隐藏元素是什么
jquery中隐藏元素是什么

jquery中隐藏元素是非常重要的一个概念,在使用jquery隐藏元素之前,需要先了解css样式中关于元素隐藏的属性,比如display、visibility、opacity等属性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

126

2024.02.23

jquery中什么是高亮显示
jquery中什么是高亮显示

jquery中高亮显示是指对页面搜索关键词时进行高亮显示,其实现办法:1、先获取要高亮显示的行,获取搜索的内容,再遍历整行内容,最后添加高亮颜色;2、使用“jquery highlight”高亮插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

50

2026.01.13

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

48

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号