必须在submit事件中调用event.preventDefault()阻止默认提交,否则前端清洗无效;需用正则清洗首尾Unicode空白字符而非trim();FormData构造后须手动遍历清洗字符串字段;后端仍须独立校验与清洗。

submit 事件里必须调用 event.preventDefault()
不拦住默认行为,所有清洗逻辑都白做。浏览器会直接用原始 input.value 提交,哪怕你刚在 input 事件里改过值、甚至用正则清过零宽字符,也完全无效。
常见错误现象:前端看似“处理了”,后端却收到带 \u200b 或 \u00a0 的字符串;用户没看到任何提示,表单就刷新了。
- 只在
form.onsubmit或addEventListener('submit', ...)中调用e.preventDefault() - 别在
click或blur里拦——它们不保证能覆盖所有提交路径(比如回车触发) - 如果用了
FormData,拦完再构造,否则它取的仍是未清洗的原始值
用正则清洗首尾不可见字符,不是 trim()
String.prototype.trim() 只处理 ASCII 空格(\t\n\r 和 U+0020),对全角空格 \u3000、零宽空格 \u200b、BOM \uFEFF、不间断空格 \u00a0 全部失效。
正确做法是提交前统一走正则:
立即学习“前端免费学习笔记(深入)”;
value.replace(/^[\s\uFEFF\u200B\u00A0\u3000]+|[\s\uFEFF\u200B\u00A0\u3000]+$/g, '')
若需兼容更广 Unicode 空白类(如换行符、段落分隔符),可用 /^\p{White_Space}+|\p{White_Space}+$/gu,但注意 IE 不支持 \p{}。
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 不要在
input事件里实时赋值清洗后的value——会跳光标、破坏用户体验 - 密码字段慎用清洗:用户可能真设了带首尾空格的密码,UI 应明确提示“首尾空格不可见”
- 富文本(
contenteditable)取innerHTML后也要清洗,不能只靠textContent
FormData 构造后仍需手动清洗每个字段值
new FormData(form) 拿到的是原始 DOM 值,包括所有不可见字符。它不会自动调用 trim(),也不识别正则规则。
清洗时机必须在构造之后、序列化之前:
const formData = new FormData(form);
for (const [key, value] of formData.entries()) {
if (typeof value === 'string') {
formData.set(key, value.replace(/^[\s\uFEFF\u200B\u00A0\u3000]+|[\s\uFEFF\u200B\u00A0\u3000]+$/g, ''));
}
}
- 文件字段(
File对象)跳过清洗,避免误操作 - 动态生成的字段(如 JS 插入的
input)可能不在FormData中,需先确保已设name属性 - 若后续要转成 JSON 提交,别直接
Object.fromEntries(formData)—— 它会丢掉重复 key,应手动遍历
后端仍须独立清洗,前端清洗只是体验层
前端清洗无法替代后端校验。用户可禁用 JS、绕过拦截、或用 curl/postman 直接发脏数据。
后端至少要做三件事:
- 用对应语言的等效正则再清一遍(如 PHP:
preg_replace('/^[\p{Z}\p{C}]+|[\p{Z}\p{C}]+$/u', '', $input)) - 对长度敏感字段(如
VARCHAR(20))做截断:substr($cleaned, 0, 20) - 对富文本字段,用
DOMPurify或ponytail做白名单过滤,而非简单strip_tags()
最容易被忽略的是:不同浏览器对自动填充、粘贴内容的处理差异极大——Chrome 可能塞进 \u200b,Safari 可能保留 Word 粘贴来的 \u00a0,而这些在开发环境未必复现得出。清洗逻辑必须覆盖全链路,不能只信某一个环节。


















