// 从路由参数中获取加密编码后的参数字符串
const encodedParams = route.params.params;
try {
// 解密获取路由参数
const decodedParams = decryptionParams(encodedParams);
// 验证参数是否为有效JSON格式
if (!decodedParams || typeof decodedParams !== 'string') {
throw new Error('Invalid parameter format');
}
// 检查潜在的XSS攻击模式
const xssPatterns = [
/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
/javascript:/gi,
/on\w+\s*=/gi,
/<iframe/gi,
/<object/gi,
/<embed/gi,
/<link/gi,
/<meta/gi,
/eval\s*\(/gi,
/expression\s*\(/gi
];
// 检查是否存在潜在的XSS攻击代码
for (const pattern of xssPatterns) {
if (pattern.test(decodedParams)) {
throw new Error('Potential XSS attack detected');
}
}
// 解析JSON并验证结构
const parsedParams = JSON.parse(decodedParams);
// 验证解析后的参数是否为对象且不包含函数
if (typeof parsedParams !== 'object' || parsedParams === null || Array.isArray(parsedParams)) {
throw new Error('Parameters must be a valid object');
}
// 深度检查对象属性,确保没有嵌套的函数或危险内容
const validateObject = (obj, maxDepth = 5, currentDepth = 0) => {
if (currentDepth > maxDepth) {
throw new Error('Object nesting too deep');
}
for (const key in obj) {
// 检查键名是否包含危险字符
if (/[<>\"'&]/.test(key)) {
throw new Error(`Invalid key name: ${key}`);
}
if (typeof obj[key] === 'function') {
throw new Error('Functions are not allowed in parameters');
}
if (typeof obj[key] === 'object' && obj[key] !== null) {
validateObject(obj[key], maxDepth, currentDepth + 1);
}
}
};
validateObject(parsedParams);
// 所有验证通过,设置参数
return parsedParams;
} catch (error) {
console.error("Error parsing or validating parameters:", error);
ElMessage.error("参数格式错误或包含不安全内容");
// 重定向回安全页面
router.push("/xxx/xxxx");
return null;
}