前端输入验证到底该在哪儿做才安全?
我最近在写一个表单提交功能,用户输入邮箱和手机号,我在前端用 JS 做了格式校验,比如 /^w+@w+.w+$/ 这种正则。但同事说光前端验证不安全,后端也得校验,可我不太明白:如果前端已经拦住了非法输入,为什么后端还要再做一遍?
而且我试过直接绕过前端页面,用 Postman 发请求,发现后端没校验的话,脏数据真能进数据库……那是不是意味着前端验证其实只是“用户体验”,真正防攻击全靠后端?那我前端还要不要做复杂验证?
比如我现在这段校验代码:
function validateEmail(email) {
const re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/;
return re.test(email);
}
它到底起什么作用?是不是白写了?
你那同事说得对,前端验证太容易被绕过了。用 Postman 发请求只是最基础的,有点经验的开发者都能直接调你 API,甚至写个爬虫脚本批量发垃圾数据。你那段
validateEmail代码确实有用,但作用仅限于:让正常用户在表单填错时立刻看到提示,不用等后端返回错误。后端校验为什么必须做?三个原因:
1. 防恶意请求(比如有人伪造 HTTP 请求直接调用你接口)
2. 数据一致性(比如其他系统调你接口时也可能传错数据)
3. 业务安全(比如前端可能被篡改,跳过某些关键校验)
举个真实案例:我们之前有个接口只在前端做了价格校验,结果被黑产抓到漏洞,用 0.01 元买了上万个虚拟商品...
代码建议这么改:
前端保持现有验证,但加个 loading 防止重复提交:
后端必须做完整校验(以 Node.js 为例):
总结一下分工:
- 前端:快速反馈 + 防手误
- 后端:最后防线 + 业务规则校验
别觉得前端验证白写了,用户体验也很重要。但千万别偷懒不做后端校验,等数据库里塞满垃圾数据就晚了...(别问我怎么知道的)