前端无法真正过滤表单数据,只能提交前清洗校验;所有前端操作均可被绕过,后端必须独立重做二次过滤与验证。

前端无法真正“过滤”表单数据,只能做提交前的清洗和校验;所有过滤逻辑都可被绕过,后端必须独立重做——这是最核心的事实。
submit 事件里不调用 event.preventDefault() 就等于没拦住
哪怕你已经修改了 input.value、调用了 form.checkValidity()、甚至弹出了自定义提示,只要没在 submit 回调里写 event.preventDefault(),浏览器就会无视所有 JS,按原始 DOM 值直接提交并刷新页面。
- 常见错误:用
onsubmit="return false"却忘了返回值是字符串而非布尔值,导致实际未拦截 - 更稳妥的做法是用
addEventListener('submit', handler),便于复用、测试和调试 -
button type="submit"点击、回车触发、form.submit()调用都会触发该事件,无需额外监听
用 FormData 取值时,trim() 对零宽字符和全角空格无效
new FormData(form) 拿到的是原始 input.value,包括 \u200b(零宽空格)、\u00a0(不间断空格)、\u3000(中文全角空格)等,这些都不会被 String.prototype.trim() 清掉。
- 清洗必须放在
FormData转成对象之后:Object.fromEntries(new FormData(form))→ 遍历值 → 用正则清理 - 推荐正则:
.replace(/[\u0000-\u001f\u007f-\u009f\u2000-\u206f\u3000-\u303f]/g, ''),覆盖常见控制字符和全角空白 - 对邮箱、账号类字段可严格
.trim();对姓名、地址类字段只做“纯空白判定”,不主动裁剪内部空格
PHP 后端必须用 filter_input() 或 filter_var() 二次过滤
前端任何处理都是体验层优化,curl、Postman、禁用 JS 都能跳过。PHP 收到的 $_POST 数据永远要重新过滤。
- 别用
$_POST['name']直接取值,改用filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING)(PHP 8.1+ 已弃用,但仍有兼容性) - 更推荐组合:先用
FILTER_VALIDATE_EMAIL验证格式,再用htmlspecialchars($value, ENT_QUOTES, 'UTF-8')转义输出 - 敏感字段(如 bio、comment)必须白名单过滤:只保留字母、数字、常见标点,或用
strip_tags()+ 自定义允许标签 - 长度限制必须在后端 enforce:前端截断可被绕过,数据库字段超长会报错或静默截断
最容易被忽略的一点:过滤不是一次性的动作,而是贯穿前后端的数据契约。前端改 value 会影响其他监听 input 事件的逻辑;后端漏掉一个字段的过滤,就可能让 XSS 或 SQL 注入穿过整条链路。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











