基于JavaScript与PHP向服务器MariaDB插入数据的安全优化问询
安全风险分析与优化建议
现存安全风险
前端数据完全可控,易被篡改
代码里的state.pointCount、wgstats.totalGamesPlayed等所有前端状态数据,用户可通过浏览器控制台、篡改JS代码或直接构造HTTP请求修改数值(比如伪造高分、虚报连胜次数)。即使后端用了预处理语句防SQL注入,也无法阻止恶意数据进入数据库。前端生成日期存在篡改可能
当前日期由前端计算后传给后端,攻击者可轻松修改这个值,插入过去或未来的无效日期,破坏业务数据的准确性。无CSRF防护
攻击者可构造恶意页面,诱导用户访问后在其不知情的情况下,向insertgameresults.php发送伪造请求,批量插入垃圾数据。参数手动拼接易引发编码问题
直接拼接xhr.send的参数字符串,若字段包含&、=等特殊字符,会导致参数解析错误,甚至可能被利用构造恶意参数(虽当前数据多为数值,但风险依然存在)。
安全优化方案
前端优化
改用
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',改由后端生成/设置,减少前端可控数据范围。集成CSRF令牌
在页面<head>中添加后端生成的CSRF令牌:<meta name="csrf-token" content="<?php echo $_SESSION['csrf_token']; ?>">前端请求时携带该令牌,后端验证令牌有效性,阻止CSRF攻击。
后端优化
接管核心数据生成与严格校验
- 日期直接用后端生成: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('无效的游戏次数'); }
- 日期直接用后端生成:SQL中用
确保预处理语句正确使用
确认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'] ]);添加请求限制与日志
- 给IP添加限流规则(比如每个IP每分钟最多插入3次),防止批量恶意插入;
- 记录所有插入请求的日志(含IP、时间、插入数据),方便后续排查异常。
强制使用HTTPS
确保全站使用HTTPS,避免请求数据在传输过程中被窃听或篡改。
内容的提问来源于stack exchange,提问作者BobC
相关产品推荐
相关产品推荐

