
使用 `formdata.set()` 修改表单数据不会影响原始表单元素的值,因此服务器接收到的仍是未加密的明文密码;正确做法是直接修改 `` 元素的 `value` 属性,并优先采用 https + 服务端哈希的安全方案。
当你通过 new FormData(formElement) 创建一个 FormData 实例时,它只是对当前表单字段值的一次快照拷贝,而非与 DOM 表单建立双向绑定。这意味着后续对 formData 对象的任何修改(如 formData.set('password', encrypted))仅作用于该内存对象,完全不会同步回原始 元素。因此,浏览器最终提交的仍是原始 HTML 表单中未修改的 value —— 这就是你看到控制台日志显示已加密、但服务端却收到明文的根本原因。
✅ 正确做法:在提交前直接更新 DOM 输入框的值:
function usernamePasswordLogin(event) {
const form = event.target;
const passwordInput = form.elements.password;
// 阻止默认提交,先加密
event.preventDefault();
// 加密并覆盖 input 的 value(关键!)
const encrypt = new JSEncrypt();
encrypt.setKey(publicKey);
const encryptedPassword = encrypt.encrypt(passwordInput.value);
passwordInput.value = encryptedPassword; // ← 真正改变提交内容
// 再次提交(此时 formData 或原生提交都会使用新值)
form.submit();
}⚠️ 重要安全提醒:
可批量生成卡号与密码然后做成实物卡后销售给客户,客户到您的网站来用此卡号密码来提交充值相关游戏卡点、QQ币、其它数字卡等相关信息,(适合做"一卡通")而您在后台可监控客户的提交信息,并手动为客户完成充值后 点击完后重点功能如下:1、卡号、密码批量生成。2、添加和修改游戏名称、区、服务器、充值方法、游戏点卡列隔等充值选择3、开启充值网站和关闭充值网站的功能4、前台用所生成的卡号密
- 客户端加密 ≠ 安全替代 HTTPS:JSEncrypt 等前端 RSA 加密无法防止中间人窃取公钥或篡改 JS 逻辑,且密钥暴露风险高。
-
推荐标准实践:
✅ 强制启用 HTTPS(TLS 1.2+)保障传输机密性;
✅ 原始明文密码通过 HTTPS 安全传至服务端;
✅ 服务端使用强哈希算法(如 bcrypt、Argon2)加盐哈希存储;
✅ 避免在客户端做密码哈希或加密——这既不增加安全性,又引入兼容性与维护负担。
总结:FormData 是只读快照,修改它不影响实际提交行为;若需动态变更提交内容,请操作 DOM 元素本身。但更根本的是——把密码安全交给传输层(HTTPS)和服务端哈希,这才是经过验证的可靠路径。









