获取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 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js
Bigger1 小时前
mini-cc:一个轻量级 AI 编程助手的诞生
前端·ai编程·claude
涵涵(互关)1 小时前
Naive-ui树型选择器只显示根节点
前端·ui·vue
BY组态1 小时前
Ricon组态系统最佳实践:从零开始构建物联网监控平台
前端·物联网·iot·web组态·组态
BY组态1 小时前
Ricon组态系统vs传统组态软件:为什么选择新一代Web组态平台
前端·物联网·iot·web组态·组态
SoaringHeart1 小时前
Flutter进阶:OverlayEntry 插入图层管理器 NOverlayZIndexManager
前端·flutter
放下华子我只抽RuiKe52 小时前
React 从入门到生产(四):自定义 Hook
前端·javascript·人工智能·深度学习·react.js·自然语言处理·前端框架
IT_陈寒3 小时前
Redis缓存击穿把我整不会了,原来还有这手操作
前端·人工智能·后端
idcu3 小时前
深入 Lyt.js 组件系统:L2 渲染引擎层的核心
前端·typescript
这是程序猿4 小时前
Spring Boot自动配置详解
java·大数据·前端