Migrate project from typing_practiceweb
This commit is contained in:
58
server/middleware/practiceValidation.ts
Normal file
58
server/middleware/practiceValidation.ts
Normal file
@@ -0,0 +1,58 @@
|
||||
// server/middleware/practiceValidation.ts
|
||||
import { Request, Response, NextFunction } from 'express';
|
||||
import crypto from 'crypto';
|
||||
export const validatePracticeSubmission = async (
|
||||
req: Request,
|
||||
res: Response,
|
||||
next: NextFunction
|
||||
) => {
|
||||
try {
|
||||
const { signature, timestamp, ...practiceData } = req.body;
|
||||
const currentServerTime = Date.now();
|
||||
|
||||
// 1. 验证时间戳
|
||||
if (Math.abs(currentServerTime - timestamp) > 2000) {
|
||||
return res.status(400).json({
|
||||
error: '提交时间异111常',
|
||||
code: 'INVALID_TIMESTAMP'
|
||||
});
|
||||
}
|
||||
|
||||
// 2. 使用相同的方式序列化数据
|
||||
const orderedData = JSON.stringify(practiceData, Object.keys(practiceData).sort());
|
||||
|
||||
// 3. 验证签名
|
||||
const expectedSignature = crypto
|
||||
.createHash('sha256')
|
||||
.update(orderedData + timestamp)
|
||||
.digest('hex');
|
||||
|
||||
console.log('Debug info:', {
|
||||
receivedSignature: signature,
|
||||
expectedSignature: expectedSignature,
|
||||
data: orderedData,
|
||||
timestamp: timestamp
|
||||
});
|
||||
|
||||
if (signature !== expectedSignature) {
|
||||
return res.status(400).json({
|
||||
error: '数据签名无效',
|
||||
code: 'INVALID_SIGNATURE',
|
||||
debug: {
|
||||
received: signature,
|
||||
expected: expectedSignature
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ... 其他验证代码保持不变
|
||||
|
||||
next();
|
||||
} catch (error) {
|
||||
console.error('Validation error:', error);
|
||||
res.status(400).json({
|
||||
error: '数据验证失败'+error,
|
||||
code: 'VALIDATION_ERROR'
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user