必须使用https、post提交和csrf防护,前端加密反而破坏安全机制。明文传输、get提交、来源校验缺失及混合内容等问题均会导致敏感数据泄露。

表单提交前没加 HTTPS,数据裸奔在中间人手里
HTTP 协议下,input 里的密码、身份证号、手机号等,全以明文发出去,Wireshark 抓包秒看。哪怕你前端加了 type="password" 或 JS 加密,只要没 HTTPS,加密结果照样被截获——因为 JS 文件本身也是 HTTP 加载的,可被篡改。
必须确保整个页面由 https:// 加载,且表单 action 地址也走 HTTPS。检查浏览器地址栏锁图标是否亮起,再看开发者工具「Security」标签页有没有“Connection secure”提示。
- 后端反代(如 Nginx)开了 HTTPS,但 upstream 转发到 localhost:8000 的 HTTP 服务?那只是“半程加密”,不安全
- 测试环境用
http://localhost没问题,但上线前务必切到 HTTPS,否则 Chrome 会直接禁用autocomplete="off"等保护逻辑 - 证书不能是自签名或过期的,否则现代浏览器会阻断表单提交(尤其 iOS Safari 更严格)
用 POST 而不是 GET 提交敏感字段
GET 请求把所有参数拼在 URL 里,会留在浏览器历史、服务器 access log、代理日志、CDN 缓存中,极易泄露。密码出现在 URL 里,等于贴在大街上。
表单必须显式声明 method="POST",且后端只处理 POST 路由。别依赖默认值——HTML 表单默认确实是 GET,不写 method 就是它。
立即学习“前端免费学习笔记(深入)”;
-
form标签漏写method="POST"是高频低级错误,尤其复制旧代码时容易忽略 - 用 JS 动态构造
fetch()提交时,务必检查method: 'POST'和headers: {'Content-Type': 'application/x-www-form-urlencoded'}是否匹配后端预期 - 不要为了“方便调试”在生产环境把敏感参数塞进 URL 做
GET请求,调试应走本地 mock 或带鉴权的测试 endpoint
后端没校验 Referer 或 Origin 就接收敏感数据
攻击者可以伪造一个恶意 HTML 页面,诱导用户点击,其中的表单 action 指向你的登录接口。如果后端不做来源检查,就会照单接收并执行登录/支付等操作——这就是 CSRF。
仅靠前端隐藏字段(如 <input type="hidden" name="token" value="xxx">)不够,因为 JS 可被绕过。必须在服务端验证请求头:Origin(对 CORS 请求)或 Referer(对普通表单),并配合一次性 CSRF token。
- Django 默认开启
CsrfViewMiddleware,Flask 需手动集成flask-wtf并在模板中写{{ form.hidden_tag() }} - Node.js + Express 建议用
csurf(已归档)或更现代的csrf-csrf,注意 cookie 的SameSite=Strict设置会影响跨站表单行为 - 别把
CSRF token存在 localStorage 里再 JS 注入——XSS 漏洞下它会被直接读走;应放在 HTTP-only cookie + 表单 hidden 字段双写
前端 JS 加密反而干扰安全机制
有人想“双重保险”,在提交前用 CryptoJS 对密码 AES 加密,再传给后端。这不仅没增加安全性,还破坏了标准防护链:比如后端无法做密码强度实时校验、无法对接 bcrypt/scrypt 盐值哈希流程、也无法触发 WAF 对明文弱口令的拦截规则。
敏感数据的加密应在传输层(TLS)和存储层(服务端哈希)完成,而非应用层前端。浏览器里做的任何加密,都逃不过 DevTools → Sources → 断点调试。
- 若真有合规要求(如金融级),应走 WebCrypto API + 后端公钥加密,但需处理密钥分发、填充、性能等问题,远比开 HTTPS 复杂得多
- 前端 MD5/SHA1 加密密码是典型误区——等同于把“哈希后密码”当明文传,攻击者拿到就能直接重放登录
- 真正该在前端做的,是输入校验(如身份证号格式)、防重复提交(按钮置灰 +
disabled)、以及遮蔽敏感字段的显示(inputmode="numeric"配合autocomplete="off")
HTTPS 是底线,POST 是常识,CSRF 防护是必选项,而前端加密往往是画蛇添足。最容易被忽略的是:开发时本地 HTTP 测试没问题,一上线就因混合内容(mixed content)被浏览器静默拦截 JS/CSS,导致 CSRF token 拿不到、表单提交失败——这时候连错误都看不到,只觉得“怎么点都没反应”。











