tp6.0必须通过前端rsa加密+后端私钥解密阻断密码明文传输:前端用jsencrypt对password字段加密并传入公钥,后端用openssl_pkcs1_oaep_padding方式解密,再通过$request->merge()注入明文密码。

TP6.0 用户密码明文传输是典型高危漏洞,安全扫描工具会直接报“敏感字段未加密”,测试同学一测一个准;不加处理就上线,轻则被勒令整改,重则通不过等保测评。必须在提交前用前端RSA加密、后端私钥解密的方式切断明文路径。
生成2048位RSA密钥对并提取公钥
打开在线密钥生成工具(如 https://travistidwell.com/jsencrypt/ 或 http://web.chacuo.net/netrsakeypair),选择2048位长度,点击生成。
生成后,复制完整的 【-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----】 内容,注意首尾换行符也要保留,否则前端JSEncrypt初始化会失败。
把这段公钥字符串粘贴进TP6.0项目的 public/static/js/login.js 文件中,赋值给全局变量:const PUB_KEY = `-----BEGIN PUBLIC KEY-----\n...`;。
前端使用 JSEncrypt 对密码字段加密
在 login.html 页面底部引入 JSEncrypt 库:<script src="/static/js/jsencrypt.min.js"></script>。
方法一:表单提交前拦截加密
给登录按钮绑定 click 事件,在 $.ajax() 发送前,对 password 字段单独加密:
const encrypt = new JSEncrypt(); encrypt.setPublicKey(PUB_KEY); const encryptedPwd = encrypt.encrypt($('#password').val()); data.password = encryptedPwd;
注意:不能对整个 data 对象调用 encrypt.encrypt() —— JSEncrypt 只接受字符串,传入 object 会返回 null,后端收不到密文。
方法二:改用 FormData 提交(兼容文件类字段)
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
let formData = new FormData(); formData.append('username', $('#username').val()); formData.append('password', encrypt.encrypt($('#password').val())); $.ajax({ url: '/login', type: 'POST', data: formData, processData: false, contentType: false });
后端 TP6.0 中编写 RSA 解密中间件
第一步:在 app/middleware/ 目录下新建 RsaDecrypt.php
第二步:在中间件中读取 POST 参数 password 字段,判断是否为 Base64 编码格式(含 /+ 字符且长度通常 > 200)
第三步:调用自定义 RSA 工具类解密,将解密结果重新写入 Request 对象的 param 数据池
关键点:TP6.0 的 Request::param() 默认只读原始输入,必须用 $request->merge(['password' => $decrypted]) 才能让后续控制器拿到明文密码。
编写 PHP RSA 解密工具类
在 app/common/utils/ 下创建 RsaDecryptor.php,核心逻辑如下:
public static function decryptByPrivateKey(string $privateKey, string $encryptedData): string { $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($privateKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; $res = openssl_get_privatekey($privateKey); openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $res, OPENSSL_PKCS1_OAEP_PADDING); openssl_free_key($res); return $decrypted; }
【必须使用 OPENSSL_PKCS1_OAEP_PADDING】 —— 若用默认 padding(即 no padding),前端 JSEncrypt 加密时会因数据块长度不匹配直接报错,后端也解不出任何内容。
第四步:在 config/middleware.php 中注册该中间件,作用于 login 接口路由。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!







