获取URL参数如何避免XSS攻击

// 从路由参数中获取加密编码后的参数字符串

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;

}

相关推荐
西陵1 天前
别再写 Prompt 了Spec Mode 才是下一代 AI 编程范式
前端·人工智能·ai编程
如意猴1 天前
【前端】002--怎样制作一个简历界面?
开发语言·前端·javascript
NickJiangDev1 天前
Elpis Schema 动态组件与表单:配置驱动的完整 CRUD 闭环
前端
kerli1 天前
Compose 组件:Box 核心参数及其 Bias 算法
android·前端
luckyCover1 天前
TypeScript学习系列(二):高级类型篇
前端·typescript
NickJiangDev1 天前
Elpis NPM 发布:把框架从业务中剥离出来
前端
im_AMBER1 天前
手撕发布订阅与观察者模式:从原理到实践
前端·javascript·面试
九英里路1 天前
cpp容器——string模拟实现
java·前端·数据结构·c++·算法·容器·字符串
Justin3go1 天前
丢掉沉重的记忆:Codex、Claude Code 与 OpenCode 的上下文压缩术
前端·后端·架构
JokerLee...1 天前
大屏自适应方案
前端·vue.js·大屏端