是传递服务端已确认上下文的“信封”,必须正确设置 type="hidden"、name 和 value 属性,且所有敏感逻辑须由后端校验;前端不可信,name 错漏、type 拼写错误或未置于 内均导致参数不提交。

它本来就不会显示,只要写对了 type="hidden"、name 和 value,浏览器就自动把它当“看不见但会发”的字段处理——不是靠 CSS 隐藏,也不是靠 JS 控制显隐。
为什么写了 type="hidden" 却没传到后端
90% 是这三个低级但难一眼发现的问题:
-
name属性漏写或拼错(比如写成user_id,后端却按userId取值) -
input标签没放在<form></form>内部(哪怕只差一个闭合标签,它就不参与提交) -
type写错大小写或拼写,比如type="HIDDEN"或type="hide",浏览器直接降级为type="text",可能意外渲染出来或被用户清空
JS 动态设 value 时总提交旧值
不是 JS 没执行,而是时机不对。常见陷阱:
- 脚本放在
里,DOM 还没加载完就调document.querySelector('input[name="token"]')→ 找不到元素 - 用
onclick绑定按钮再手动submit(),绕过了你写的submit事件监听 - 异步获取 token 后才赋值,但用户点得比 API 快,
value还是空字符串
稳妥做法:把 JS 放在 前,或监听 DOMContentLoaded;更推荐在 form.addEventListener('submit', ...) 开头统一更新所有依赖 JS 的 hidden 字段。
哪些值能塞进 value,哪些绝对不能
能传的:已由服务端确认过的上下文标识,比如 step=2、orderId=ORD-2026-7890、csrf_token=a1b2c3...
不能传的:任何可被篡改后导致越权或资损的数据,例如:
-
price="99.9"→ 攻击者改成"0.1"直接提交 -
role="user"→ 改成"admin"就绕过权限校验 - 明文密码、密钥、未签名的 session ID
真正该做的:只传不可伪造的 ID(如数据库主键),所有敏感判断和金额计算必须由后端重新查库或签名校验。
最容易被忽略的,是以为只要 DOM 里有这个 input,后端就一定能拿到值——其实 name 错一个字母、type 少一个小写、或者 JS 更新逻辑被框架响应式覆盖,都会让参数无声消失。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











