获取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 objkey === 'function') {

throw new Error('Functions are not allowed in parameters');

}

if (typeof objkey === 'object' && objkey !== null) {

validateObject(objkey, 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 小时前
《回顾 2018 前端:Vue2 成熟期,Webpack4 发布,PWA 大火》
前端
Java后端的Ai之路2 小时前
前端技术Vue-09-webpack-vuejs-实战
前端·vue.js·webpack
LMT流氓兔2 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
涛涛ing2 小时前
React Compiler正式“Rust化”:你项目里的Babel插件,正在被编译进打包器
前端
迷迭绿2 小时前
Cesium 轨迹回放播放器
前端·javascript·cesium
HolySaga2 小时前
我用 UTS 写了一个三端同构的蓝牙插件(Android / iOS / 鸿蒙 NEXT),把踩过的坑都讲给你听
前端
程序员老赵3 小时前
Docker 部署 XWiki:轻松搭建企业知识库与协作 Wiki
前端·docker·开源
console.log('npc')3 小时前
第 10 章 更多业务模块扩展
前端·人工智能·大模型
行者全栈架构师3 小时前
我用 TRAE Work 把桌游之夜搬进了浏览器:一个计分器的从创意到上线
前端·算法·架构
山雀~3 小时前
线上CI流水打包失败排查思路案例
前端·ci/cd