TypeScript 应用安全:十大漏洞

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

TypeScript应用程序安全:十大漏洞



TypeScript作为JavaScript的超集,继承了其许多漏洞,同时增加了与类型系统和编译相关的特定风险。即使严格的类型检查也无法保证安全——逻辑错误和不安全的做法可能导致严重后果。本文将分析TypeScript应用程序的十大漏洞,提供代码示例并给出保护建议。



1. 通过dangerouslySetInnerHTML的跨站脚本攻击(XSS)

React/TypeScript应用程序中最常见的漏洞之一是通过dangerouslySetInnerHTML插入未转义的HTML。



// ❌ 漏洞代码function UserComment({ comment }: { comment: string }) {  return <div dangerouslySetInnerHTML={{ __html: comment }} />;}

// ✅ 安全选项import DOMPurify from 'dompurify';

function SafeComment({ comment }: { comment: string }) { const sanitized = DOMPurify.sanitize(comment); return <div dangerouslySetInnerHTML={{ __html: sanitized }} />;}


2. 通过未转义查询的SQL注入

在SQL查询中使用包含用户输入的模板字符串是直接导致注入的方式。



// ❌ 漏洞代码async function getUser(id: string) {  const query = `SELECT * FROM users WHERE id = '${id}'`;  return db.execute(query);}

// ✅ 安全选项(使用参数化查询)async function safeGetUser(id: string) { const query = 'SELECT * FROM users WHERE id = $1'; return db.execute(query, [id]);}


3. 通过深度对象合并的原型污染

TypeScript允许轻松复制对象,但不会检查原型链。



// ❌ 漏洞代码function merge(target: any, source: any) {  for (const key in source) {    if (typeof source[key] === 'object') {      target[key] = merge(target[key] || {}, source[key]);    } else {      target[key] = source[key];    }  }  return target;}

// ✅ 安全选项function safeMerge(target: Record<string, any>, source: Record<string, any>) { const result = { ...target }; for (const key of Object.keys(source)) { if (key === '__proto__' || key === 'constructor') continue; if (typeof source[key] === 'object' && !Array.isArray(source[key])) { result[key] = safeMerge(result[key] || {}, source[key]); } else { result[key] = source[key]; } } return result;}


4. NoSQL注入(MongoDB)

在处理MongoDB时,直接从请求传递对象可能导致注入$where或$regex操作符。



// ❌ 漏洞代码app.post('/login', async (req, res) => {  const { username, password } = req.body;  const user = await User.findOne({ username, password });  // 如果传入 { "$gt": "" },可以绕过检查});

// ✅ 安全选项import { sanitize } from 'mongo-sanitize';

app.post('/login', async (req, res) => { const cleanBody = sanitize(req.body); const user = await User.findOne({ username: cleanBody.username, password: cleanBody.password });});


5. 通过child_process执行操作系统命令

使用exec执行用户输入而不进行转义是一个严重漏洞。



// ❌ 漏洞代码import { exec } from 'child_process';

function runCommand(input: string) { exec(`echo ${input}`, (err, stdout) => { console.log(stdout); });}

// ✅ 安全选项import { execFile } from 'child_process';

function safeCommand(input: string) { // 使用execFile并传入参数数组 execFile('echo', [input], (err, stdout) => { console.log(stdout); });}


6. 文件操作中的路径遍历

博客

书籍推荐