You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于JavaScript与PHP向服务器MariaDB插入数据的安全优化问询

安全风险分析与优化建议

现存安全风险

  1. 前端数据完全可控,易被篡改
    代码里的state.pointCount、wgstats.totalGamesPlayed等所有前端状态数据,用户可通过浏览器控制台、篡改JS代码或直接构造HTTP请求修改数值(比如伪造高分、虚报连胜次数)。即使后端用了预处理语句防SQL注入,也无法阻止恶意数据进入数据库。

  2. 前端生成日期存在篡改可能
    当前日期由前端计算后传给后端,攻击者可轻松修改这个值,插入过去或未来的无效日期,破坏业务数据的准确性。

  3. 无CSRF防护
    攻击者可构造恶意页面,诱导用户访问后在其不知情的情况下,向insertgameresults.php发送伪造请求,批量插入垃圾数据。

  4. 参数手动拼接易引发编码问题
    直接拼接xhr.send的参数字符串,若字段包含&、=等特殊字符,会导致参数解析错误,甚至可能被利用构造恶意参数(虽当前数据多为数值,但风险依然存在)。

安全优化方案

前端优化

  1. 改用URLSearchParams处理请求参数
    避免手动拼接,自动处理编码问题,代码更简洁可靠:

    function insertRecord() {
        // 先做基础校验,拦截明显无效数据
        if (!Number.isInteger(state.pointCount) || state.pointCount < 0) {
            console.error('无效的分数值');
            return;
        }
    
        const params = new URLSearchParams();
        params.append('dataTwo', state.pointCount);
        params.append('dataFour', wgstats.totalGamesPlayed);
        params.append('dataFive', wgstats.consecutiveWins);
        params.append('dataSix', wgstats.longestStreak);
        params.append('dataSeven', wgstats.totalPointsAwarded);
        params.append('dataEight', state.hintCount);
    
        fetch('insertgameresults.php', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content
            },
            body: params
        })
        .then(response => {
            if (response.ok) console.log('数据插入成功');
            else console.error('插入失败:', response.statusText);
        })
        .catch(error => console.error('请求出错:', error));
    }
    

    注:这里去掉了前端生成的日期、固定值1和'Y',改由后端生成/设置,减少前端可控数据范围。

  2. 集成CSRF令牌
    在页面<head>中添加后端生成的CSRF令牌:

    <meta name="csrf-token" content="<?php echo $_SESSION['csrf_token']; ?>">
    

    前端请求时携带该令牌,后端验证令牌有效性,阻止CSRF攻击。

后端优化

  1. 接管核心数据生成与严格校验

    • 日期直接用后端生成:SQL中用CURDATE(),或PHP代码用date('Y-m-d'),不再接收前端传来的日期;
    • 固定值data3=1、data9='Y'直接写在后端SQL里,不从前端接收,缩小攻击面;
    • 对所有前端传来的数值做严格校验:
      // 示例:校验游戏次数是否为正整数
      $totalGamesPlayed = $_POST['dataFour'] ?? '';
      if (!ctype_digit($totalGamesPlayed) || $totalGamesPlayed < 1) {
          http_response_code(400);
          exit('无效的游戏次数');
      }
      
  2. 确保预处理语句正确使用
    确认PHP代码用占位符绑定参数,而非拼接SQL,PDO示例:

    $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');
    $stmt = $pdo->prepare("INSERT INTO your_table (date, point_count, total_games, consecutive_wins, longest_streak, total_points, hint_count, fixed_col1, fixed_col2) VALUES (CURDATE(), ?, ?, ?, ?, ?, ?, 1, 'Y')");
    $stmt->execute([
        $_POST['dataTwo'],
        $_POST['dataFour'],
        $_POST['dataFive'],
        $_POST['dataSix'],
        $_POST['dataSeven'],
        $_POST['dataEight']
    ]);
    
  3. 添加请求限制与日志

    • 给IP添加限流规则(比如每个IP每分钟最多插入3次),防止批量恶意插入;
    • 记录所有插入请求的日志(含IP、时间、插入数据),方便后续排查异常。
  4. 强制使用HTTPS
    确保全站使用HTTPS,避免请求数据在传输过程中被窃听或篡改。

内容的提问来源于stack exchange,提问作者BobC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:07:54