获取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 小时前
让 JavaScript 更容易「善后」的新能力
前端·javascript·面试
掘金安东尼1 小时前
用 HTMX 为 React Data Grid 加速实时更新
前端·javascript·面试
灵感__idea3 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
yinuo3 小时前
轻松接入大语言模型API -04
前端
袋鼠云数栈UED团队4 小时前
基于 Lexical 实现变量输入编辑器
前端·javascript·架构
cipher4 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
UrbanJazzerati4 小时前
非常友好的Vue 3 生命周期详解
前端·面试
AAA阿giao4 小时前
从零构建一个现代登录页:深入解析 Tailwind CSS + Vite + Lucide React 的完整技术栈
前端·css·react.js
兆子龙5 小时前
像 React Hook 一样「自动触发」:用 Git Hook 拦住忘删的测试代码与其它翻车现场
前端·架构
兆子龙6 小时前
用 Auto.js 实现挂机脚本:从找图点击到循环自动化
前端·架构