From bc11ec0e6b09d1da34abd970a2acf7b461127eca Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期二, 16 九月 2025 15:19:12 +0800 Subject: [PATCH] 修改安全漏洞 --- management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java | 5 management/guns-admin/src/main/webapp/WEB-INF/view/login.html | 10 +- management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java | 23 ++++- management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtil.java | 90 ++++++++++++++++++++++ management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js | 18 +++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java | 10 ++ management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java | 2 management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java | 38 +++++++++ management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html | 29 +++++++ 9 files changed, 210 insertions(+), 15 deletions(-) diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java index 2047dae..eb64df0 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/config/web/ShiroConfig.java @@ -102,7 +102,7 @@ @Bean public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) { CookieRememberMeManager manager = new CookieRememberMeManager(); - manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA==")); +// manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA==")); manager.setCookie(rememberMeCookie); return manager; } @@ -112,7 +112,8 @@ */ @Bean public SimpleCookie rememberMeCookie() { - SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); +// SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); + SimpleCookie simpleCookie = new SimpleCookie(""); simpleCookie.setHttpOnly(true); simpleCookie.setMaxAge(7 * 24 * 60 * 60);//7天 return simpleCookie; diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java index 3c22173..adab694 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TAppUserController.java @@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.stylefeng.guns.core.base.controller.BaseController; +import com.stylefeng.guns.core.base.tips.SuccessTip; import com.stylefeng.guns.core.log.LogObjectHolder; +import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.controller.resp.TAppUserResp; import com.stylefeng.guns.modular.system.controller.util.ExcelUtil; import com.stylefeng.guns.modular.system.enums.CouponStatusEnum; @@ -214,6 +216,10 @@ @RequestMapping(value = "/add") @ResponseBody public Object add(TAppUser tAppUser) { + String avatar = tAppUser.getAvatar(); + if(ToolUtil.isNotEmpty(avatar) && !avatar.contains("png") && !avatar.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的头像照片!"); + } tAppUserService.insert(tAppUser); return SUCCESS_TIP; } @@ -257,6 +263,10 @@ @RequestMapping(value = "/update") @ResponseBody public Object update(TAppUser tAppUser) { + String avatar = tAppUser.getAvatar(); + if(ToolUtil.isNotEmpty(avatar) && !avatar.contains("png") && !avatar.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的头像照片!"); + } tAppUserService.updateById(tAppUser); return SUCCESS_TIP; } diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java index 2f13bf5..014330d 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TCarController.java @@ -4,12 +4,10 @@ import com.baomidou.mybatisplus.plugins.Page; import com.stylefeng.guns.core.base.controller.BaseController; import com.stylefeng.guns.core.base.tips.ErrorTip; +import com.stylefeng.guns.core.base.tips.SuccessTip; import com.stylefeng.guns.core.common.constant.factory.PageFactory; import com.stylefeng.guns.core.shiro.ShiroKit; -import com.stylefeng.guns.core.util.DateUtil; -import com.stylefeng.guns.core.util.ExcelExportUtil; -import com.stylefeng.guns.core.util.SinataUtil; -import com.stylefeng.guns.core.util.WoUtil; +import com.stylefeng.guns.core.util.*; import com.stylefeng.guns.modular.system.dao.CarInsuranceMapper; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; @@ -361,6 +359,14 @@ @RequestMapping(value = "/add") @ResponseBody public Object add(TCar tCar,@RequestParam String serverBox,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId,String zcModel,String kcModel) { + String carPhoto = tCar.getCarPhoto(); + if(ToolUtil.isNotEmpty(carPhoto) && !carPhoto.contains("png") && !carPhoto.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的车辆照片!"); + } + String drivingLicensePhoto = tCar.getDrivingLicensePhoto(); + if(ToolUtil.isNotEmpty(drivingLicensePhoto) && !drivingLicensePhoto.contains("png") && !drivingLicensePhoto.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的行驶证照片!"); + } if (1 == roleType){ //平台 if (2 == companyType.intValue()){ if (SinataUtil.isNotEmpty(oneId)){ @@ -400,6 +406,7 @@ } tCar.setInsertTime(new Date()); tCar.setState(1); + tCarService.insert(tCar); //添加经营业务 @@ -443,6 +450,14 @@ @RequestMapping(value = "/update") @ResponseBody public Object update(TCar tCar,@RequestParam String serverBox,Integer roleType,Integer companyType,Integer oneId,Integer twoId,Integer franchiseeId,String zcModel,String kcModel) { + String carPhoto = tCar.getCarPhoto(); + if(ToolUtil.isNotEmpty(carPhoto) && !carPhoto.contains("png") && !carPhoto.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的车辆照片!"); + } + String drivingLicensePhoto = tCar.getDrivingLicensePhoto(); + if(ToolUtil.isNotEmpty(drivingLicensePhoto) && !drivingLicensePhoto.contains("png") && !drivingLicensePhoto.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的行驶证照片!"); + } if (1 == roleType){ //平台 if (2 == companyType.intValue()){ if (SinataUtil.isNotEmpty(oneId)){ diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java index 2eac5a1..37cb1d2 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/general/TDriverController.java @@ -9,6 +9,7 @@ import com.stylefeng.guns.core.log.LogObjectHolder; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.shiro.ShiroUser; +import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.controller.resp.TDriverCommissionResp; import com.stylefeng.guns.modular.system.controller.resp.TDriverResp; import com.stylefeng.guns.modular.system.controller.util.ExcelUtil; @@ -19,6 +20,7 @@ import com.stylefeng.guns.modular.system.enums.UserTypeEnum; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; +import com.stylefeng.guns.modular.system.util.AESUtil; import com.stylefeng.guns.modular.system.util.DateUtil; import com.stylefeng.guns.modular.system.util.RedisUtil; //import com.stylefeng.guns.modular.system.util.bank.BankUtil; @@ -360,6 +362,9 @@ List<TDriver> tDrivers = tDriverService.selectList(wrapper); List<TDriverResp> tDriverResp = tDriverService.getTDriverResp(tDrivers); for (TDriverResp driverResp : tDriverResp) { + driverResp.setIdcard(AESUtil.encrypt(driverResp.getIdcard())); + driverResp.setName(AESUtil.encrypt(driverResp.getName())); + driverResp.setPhone(AESUtil.encrypt(driverResp.getPhone())); TDriverWork tDriverWork = tDriverWorkService.selectOne(new EntityWrapper<TDriverWork>() .eq("driverId", driverResp.getId()) .orderBy("workTime", false) @@ -575,7 +580,22 @@ @RequestMapping(value = "/add") @ResponseBody public Object add(TDriver tDriver) { - + String avatar = tDriver.getAvatar(); + if(ToolUtil.isNotEmpty(avatar) && !avatar.contains("png") && !avatar.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的头像图片!"); + } + String driverLicense = tDriver.getDriverLicense(); + if(ToolUtil.isNotEmpty(driverLicense) && !driverLicense.contains("png") && !driverLicense.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的驾驶证照片!"); + } + String idcardFront = tDriver.getIdcardFront(); + if(ToolUtil.isNotEmpty(idcardFront) && !idcardFront.contains("png") && !idcardFront.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的身份证正面照!"); + } + String idcardBack = tDriver.getIdcardBack(); + if(ToolUtil.isNotEmpty(idcardBack) && !idcardBack.contains("png") && !idcardBack.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的身份证背面照!"); + } int count = tDriverService.selectCount(new EntityWrapper<TDriver>().eq("phone", tDriver.getPhone())); if(count>0){ return new SuccessTip(500,"该司机已存在!"); @@ -677,6 +697,22 @@ @RequestMapping(value = "/update") @ResponseBody public Object update(TDriver tDriver) { + String avatar = tDriver.getAvatar(); + if(ToolUtil.isNotEmpty(avatar) && !avatar.contains("png") && !avatar.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的头像图片!"); + } + String driverLicense = tDriver.getDriverLicense(); + if(ToolUtil.isNotEmpty(driverLicense) && !driverLicense.contains("png") && !driverLicense.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的驾驶证照片!"); + } + String idcardFront = tDriver.getIdcardFront(); + if(ToolUtil.isNotEmpty(idcardFront) && !idcardFront.contains("png") && !idcardFront.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的身份证正面照!"); + } + String idcardBack = tDriver.getIdcardBack(); + if(ToolUtil.isNotEmpty(idcardBack) && !idcardBack.contains("png") && !idcardBack.contains("jpg")){ + return new SuccessTip(500,"请上传png/jpg格式的身份证背面照!"); + } TDriver driver = tDriverService.selectOne(new EntityWrapper<TDriver>().eq("phone", tDriver.getPhone()) .last("LIMIT 1")); if(Objects.nonNull(driver) && !tDriver.getId().equals(driver.getId())){ diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java index 1c19d87..33d3b0e 100644 --- a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/system/LoginController.java @@ -18,6 +18,7 @@ import com.stylefeng.guns.modular.system.model.User; import com.stylefeng.guns.modular.system.service.IMenuService; import com.stylefeng.guns.modular.system.service.IUserService; +import com.stylefeng.guns.modular.system.util.AESUtil; import com.stylefeng.guns.modular.system.util.AESUtils; import com.stylefeng.guns.modular.system.util.RedisUtil; import org.apache.shiro.authc.SimpleAuthenticationInfo; @@ -121,6 +122,7 @@ */ @RequestMapping(value = "/login", method = RequestMethod.POST) public String loginVali(String username, String password,String sms_code, String remember, Model model, HttpServletRequest request) { + password = AESUtil.decrypt(password); Integer f = loginFailures.get(username); f = f == null ? 0 : f; // 校验账号,密码是否正确,如果错误,对次数进行加1 diff --git a/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtil.java b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtil.java new file mode 100644 index 0000000..cc8bc3d --- /dev/null +++ b/management/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/AESUtil.java @@ -0,0 +1,90 @@ +package com.stylefeng.guns.modular.system.util; + + +import com.stylefeng.guns.core.util.ToolUtil; +import org.springframework.util.Base64Utils; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +/** + * 定义AES加密解密工具类 + */ +public class AESUtil { + + private static final String KEY_ALGORITHM = "AES";//加密方式 + + private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";//默认的加密算法 + + private static final String KEY = "xqT86jictTPpHMem";//密码 + + private static final String IV_PARAMETER = "xqT86jicxqT86jic";//偏移量 + + private static final String CHARSET = "UTF-8";//编码 + + + + + /** + * 加密操作 + * @param content 待加密内容 + * @return + * @throws Exception + */ + public static String encrypt(String content) { + try { + if(ToolUtil.isEmpty(content)){ + return content; + } + Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); + byte[] raw = KEY.getBytes(CHARSET); + SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + byte[] encrypted = cipher.doFinal(content.getBytes(CHARSET)); + return Base64Utils.encodeToString(encrypted); + }catch (Exception e){ + e.printStackTrace(); + } + return content; + } + + /** + *解密操作 + * @param content 待解密内容 + * @return + * @throws Exception + */ + public static String decrypt(String content) { + try { + if(ToolUtil.isEmpty(content)){ + return content; + } + byte[] raw = KEY.getBytes(CHARSET); + SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM); + Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); + IvParameterSpec iv = new IvParameterSpec(IV_PARAMETER.getBytes()); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + + byte[] encrypted1 = Base64Utils.decodeFromString(content); + byte[] original = cipher.doFinal(encrypted1); + String originalString = new String(original, CHARSET); + return originalString; + } catch (Exception ex) { + ex.printStackTrace(); + } + return content; + } + + + public static void main(String[] ages){ +// String encrypt = AESUtil.encrypt("19167181339"); +// System.err.println(encrypt); + String travel = AESUtil.decrypt("tw1pslwtyVl58hz4A9HauCmgWtML1DKJKGIOxVhv9KE="); + System.err.println(travel); + +// String decrypt = DESUtil.decrypt("xqT86jictTPpHMem", "uFT7jx9P7+t8n1IVQsxn7A=="); +// System.err.println(decrypt); + } +} diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html index 1c500bf..00b43a7 100644 --- a/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html +++ b/management/guns-admin/src/main/webapp/WEB-INF/view/common/_container.html @@ -66,6 +66,7 @@ <script type="text/javascript" charset="utf-8" src="${ctxPath}/djadmin/static/js/ueditor/jsp/ueditor.config.js"></script> <script type="text/javascript" charset="utf-8" src="${ctxPath}/djadmin/static/js/ueditor/jsp/ueditor.all.js"></script> <script type="text/javascript" charset="utf-8" src="${ctxPath}/djadmin/static/js/ueditor/jsp/lang/zh-cn/zh-cn.js"></script> + <script src="${ctxPath}/djadmin/static/crypto-js/crypto-js.js"></script> <!--<style type="text/css"> table{ width:100px; @@ -288,7 +289,35 @@ } }); } + var key = CryptoJS.enc.Utf8.parse("xqT86jictTPpHMem"); + var iv = CryptoJS.enc.Utf8.parse("xqT86jicxqT86jic"); + //aes加密 + function encrypt(context) { + var encrypted = ''; + if (typeof(context) == 'string') { + + }else if(typeof(context) == 'object'){ + context = JSON.stringify(context); + } + var srcs = CryptoJS.enc.Utf8.parse(context); + encrypted = CryptoJS.AES.encrypt(srcs, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); + } + // aes解密 + function decrypt(context) { + var decrypt = CryptoJS.AES.decrypt(context, key, { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7 + }); + var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); + return decryptedStr.toString(); + } // 页面加载完成后启动轮询 $(document).ready(function() { // 延迟5秒后开始轮询,避免页面加载时的性能影响 diff --git a/management/guns-admin/src/main/webapp/WEB-INF/view/login.html b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html index ef17a18..b216912 100644 --- a/management/guns-admin/src/main/webapp/WEB-INF/view/login.html +++ b/management/guns-admin/src/main/webapp/WEB-INF/view/login.html @@ -115,8 +115,8 @@ $("#kaptcha").attr('src', '${ctxPath}/djadmin/kaptcha?' + Math.floor(Math.random() * 100)).fadeIn(); }); }); - var key = CryptoJS.enc.Utf8.parse("c53fd327353a09a1"); - var iv = CryptoJS.enc.Utf8.parse("3a0565e3b1d8ae3d"); + var key = CryptoJS.enc.Utf8.parse("xqT86jictTPpHMem"); + var iv = CryptoJS.enc.Utf8.parse("xqT86jicxqT86jic"); //aes加密 function encrypt(context) { @@ -145,9 +145,9 @@ return decryptedStr.toString(); } function login(){ - // let password = $('#password').val(); - // password = encrypt(password); - // $('#password').val(password); + let password = $('#password').val(); + password = encrypt(password); + $('#password').val(password); $('#submit').submit(); } diff --git a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js index e431fdc..9eead40 100644 --- a/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js +++ b/management/guns-admin/src/main/webapp/static/modular/system/tDriver/tDriver.js @@ -16,8 +16,16 @@ {field: 'selectItem', radio: true}, {title: '主键', field: 'id', visible: true, align: 'center', valign: 'middle'}, {title: '编号', field: 'code', visible: true, align: 'center', valign: 'middle'}, - {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle'}, - {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle'}, + {title: '姓名', field: 'name', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row) { + return decrypt(value); + } + }, + {title: '手机号', field: 'phone', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row) { + return decrypt(value); + } + }, {title: '性别', field: 'sex', visible: true, align: 'center', valign: 'middle', formatter: function (value, row) { if (row.sex === 1){ @@ -29,7 +37,11 @@ } }}, {title: '驾驶证号码', field: 'driverLicenseNumber', visible: true, align: 'center', valign: 'middle'}, - {title: '身份证号码', field: 'idcard', visible: true, align: 'center', valign: 'middle'}, + {title: '身份证号码', field: 'idcard', visible: true, align: 'center', valign: 'middle', + formatter: function (value, row) { + return decrypt(value); + } + }, {title: '身份证', field: 'source', visible: true, align: 'center', valign: 'middle', formatter: function (value, row) { if (null != row.idcardFront){ -- Gitblit v1.7.1