Node.js Web应用生成PDF的用户输入sanitization最佳实践及工具推荐
Node.js PDF生成中用户输入Sanitization最佳实践及工具库
核心最佳实践
- 严格限制输入范围:明确用户输入的允许类型(如纯文本、指定格式字符串),直接拒绝超出范围的内容。比如仅需用户输入姓名时,过滤掉包含
%、&、/等PDF引擎可能解析的控制字符的内容。 - 转义特殊字符:针对PDF渲染相关的特殊字符做转义处理:
- 对文本中的
\、(、)、[、]等字符,替换为转义形式(如\\、\(); - 若涉及HTML/Markdown转PDF场景,转义
<、>、&等HTML实体。
- 对文本中的
- 隔离输入上下文:禁止用户输入直接作为PDF元数据(标题、作者)或可执行内容,仅作为纯文本插入固定文本块。比如用pdf-lib时,只通过
addText这类纯文本API插入用户输入,不直接修改PDF底层对象。 - 验证输入格式:用正则表达式或Joi、Zod这类验证库校验输入格式,不符合要求的直接拒绝。
- 移除危险内容:过滤掉可能触发PDF恶意行为的内容,比如嵌入的JavaScript、未在白名单内的远程资源链接(图片、字体)。
简化流程的工具库
- DOMPurify:可配置为仅保留纯文本,过滤所有标签和危险字符,处理后再插入PDF:
const DOMPurify = require('dompurify'); const { JSDOM } = require('jsdom'); const window = new JSDOM('').window; const purify = DOMPurify(window); const sanitizedInput = purify.sanitize(userInput, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] }); - sanitize-html:专注HTML sanitization,可配置为只保留纯文本,适合处理PDF插入文本:
const sanitizeHtml = require('sanitize-html'); const sanitizedInput = sanitizeHtml(userInput, { allowedTags: [], allowedAttributes: {} }); - validator.js:通过
escape()方法转义HTML实体,间接提升PDF输入安全性:const validator = require('validator'); const sanitizedInput = validator.escape(userInput); - pdf-sanitizer:专门针对PDF场景的轻量库,可清理用户输入中包含的PDF特定危险元素(如嵌入脚本、恶意注释)。
额外注意事项
- 工具库仅作辅助,必须结合白名单机制:只允许已知安全的输入内容,避免依赖黑名单(易遗漏新攻击方式)。
- 测试攻击场景:尝试输入含PDF控制字符、JavaScript代码、外部链接的内容,验证生成的PDF无恶意行为。
内容的提问来源于stack exchange,提问作者russell.price
相关产品推荐
相关产品推荐

