讲师中心 微信公众号
AI工具推荐 视频效率加速

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

夏静姑娘_7554

夏静姑娘_7554

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

|

931人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

AJAX技术—无刷新获取数据相关课件
AJAX技术—无刷新获取数据相关课件

AJAX技术—无刷新获取数据相关课件

下载

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

将前端职责从「计算并上报分数」转变为「记录并上报用户真实操作序列」,由 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工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

11079

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

966

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

744

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1826

2025.08.19

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1826

2025.08.19

常用的mysql管理工具
常用的mysql管理工具

常用的mysql管理工具有:1、MySQL Workbench、phpMyAdmin、MySQL Shell、Navicat、DBeaver和DataGrip。更多关于mysql管理工具的问题,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

5110

2023.11.03

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
jQuery官方API文档
jQuery官方API文档

共0课时 | 0人学习

Symfony教程(入门篇+基础篇)
Symfony教程(入门篇+基础篇)

共18课时 | 1.8万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn