面试题答案
一键面试- 使用严格类型定义
- 对于用户输入,明确其类型。例如,如果输入预期是文本,定义为
string
类型,但要避免使用any
类型。假设我们有一个函数接收用户输入并插入到DOM中:
function insertUserInputToDOM(input: string) { // 这里开始处理插入DOM操作 }
- 对于用户输入,明确其类型。例如,如果输入预期是文本,定义为
- 输入验证与过滤
- 在插入DOM之前,对输入进行严格验证。可以使用正则表达式等方式确保输入符合预期格式。例如,只允许字母和数字输入:
function validateInput(input: string): boolean { return /^[a - zA - Z0 - 9]+$/.test(input); } function insertUserInputToDOM(input: string) { if (!validateInput(input)) { throw new Error('Invalid input'); } // 这里开始处理插入DOM操作 }
- 使用安全的DOM操作方法
- 避免直接使用
innerHTML
来插入用户输入,因为它很容易导致XSS。可以使用textContent
或createTextNode
方法。例如:
function insertUserInputToDOM(input: string) { const div = document.createElement('div'); const textNode = document.createTextNode(input); div.appendChild(textNode); document.body.appendChild(div); }
- 避免直接使用
- 利用类型推断进行函数参数检查
- 当函数接收多个参数,其中涉及用户输入时,类型推断可以帮助确保每个参数的正确性。例如:
function createElementWithUserText(tag: string, userText: string) { const el = document.createElement(tag); const textNode = document.createTextNode(userText); el.appendChild(textNode); return el; }
- 这里
tag
和userText
的类型明确,类型推断可以防止传入错误类型的数据,间接有助于防范XSS。
- 第三方库的安全使用
- 如果使用第三方库来处理DOM或用户输入,确保其安全性,并正确使用类型定义。例如,使用
DOMPurify
库来清理HTML输入。在TypeScript项目中,要确保安装并正确配置其类型定义(.d.ts
文件)。
import DOMPurify from 'dompurify'; function insertUserInputToDOM(input: string) { const cleanInput = DOMPurify.sanitize(input); const div = document.createElement('div'); const textNode = document.createTextNode(cleanInput); div.appendChild(textNode); document.body.appendChild(div); }
- 如果使用第三方库来处理DOM或用户输入,确保其安全性,并正确使用类型定义。例如,使用