应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

项目讲解之常见安全漏洞

  本文是从开源项目RuoYi的提交记录文字描述中根据关键字漏洞安全阻止筛选而来。旨在为大家介绍日常项目开发中需要注意的一些安全问题以及如何解决。项目安全是每个开发人员都需要重点关注的问题。如果项目漏洞太多,很容易遭受黑客攻击与用户信息泄露的风险。本文将结合3个典型案例,解释常见的安全漏洞及修复方案,帮助大家在项目开发中进一步提高安全意识。
  RuoYi项目地址:https:gitee。comyprojectRuoYi博主github地址:https:github。comwayn111,欢迎大家关注一、重置用户密码
  RuoYi项目中有一个重置用户密码的接口,在提交记录dd37524b之前的代码如下:Log(title重置密码,businessTypeBusinessType。UPDATE)PostMapping(resetPwd)ResponseBodypublicAjaxResultresetPwd(SysUseruser){user。setSalt(ShiroUtils。randomSalt());user。setPassword(passwordService。encryptPassword(user。getLoginName(),user。getPassword(),user。getSalt()));introwsuserService。resetUserPwd(user);if(rows0){setSysUser(userService。selectUserById(user。getUserId()));returnsuccess();}returnerror();}
  可以看出该接口会读取传入的用户信息,重置完用户密码后,会根据传入的userId更新数据库以及缓存。
  这里有一个非常严重的安全问题就是盲目相信传入的用户信息,如果攻击人员通过接口构造请求,并且在传入的user参数中设置userId为其他用户的userId,那么这个接口就会导致某些用户的密码被重置因而被攻击人员掌握。1。1攻击流程
  假如攻击人员掌握了其他用户的userId以及登录账号名构造重置密码请求将userId设置未其他用户的userId服务端根据传入的userId修改用户密码使用新的用户账号以及重置后的密码进行登录攻击成功1。2如何解决
  在记录dd37524b提交之后,代码更新如下:Log(title重置密码,businessTypeBusinessType。UPDATE)PostMapping(resetPwd)ResponseBodypublicAjaxResultresetPwd(StringoldPassword,StringnewPassword){SysUserusergetSysUser();if(StringUtils。isNotEmpty(newPassword)passwordService。matches(user,oldPassword)){user。setSalt(ShiroUtils。randomSalt());user。setPassword(passwordService。encryptPassword(user。getLoginName(),newPassword,user。getSalt()));if(userService。resetUserPwd(user)0){setSysUser(userService。selectUserById(user。getUserId()));returnsuccess();}returnerror();}else{returnerror(修改密码失败,旧密码错误);}}
  解决方法其实很简单,不要盲目相信用户传入的参数,通过登录状态获取当前登录用户的userId。如上代码通过getSysUser()方法获取当前登录用户的userId后,再根据userId重置密码。二、文件下载
  文件下载作为web开发中,每个项目都会遇到的功能,相信对大家而言都不陌生。RuoYi在提交记录18f6366f之前的下载文件逻辑如下:GetMapping(commondownload)publicvoidfileDownload(StringfileName,Booleandelete,HttpServletResponseresponse,HttpServletRequestrequest){try{if(!FileUtils。isValidFilename(fileName)){thrownewException(StringUtils。format(文件名称({})非法,不允许下载。,fileName));}StringrealFileNameSystem。currentTimeMillis()fileName。substring(fileName。indexOf()1);StringfilePathGlobal。getDownloadPath()fileName;response。setContentType(MediaType。APPLICATIONOCTETSTREAMVALUE);FileUtils。setAttachmentResponseHeader(response,realFileName);FileUtils。writeBytes(filePath,response。getOutputStream());if(delete){FileUtils。deleteFile(filePath);}}catch(Exceptione){log。error(下载文件失败,e);}}publicclassFileUtils{publicstaticStringFILENAMEPATTERN〔azAZ09。u4e00u9fa5〕;publicstaticbooleanisValidFilename(Stringfilename){returnfilename。matches(FILENAMEPATTERN);}}
  可以看到代码中在下载文件时,会判断文件名称是否合法,如果不合法会提示文件名称({})非法,不允许下载。的字样。咋一看,好像没什么问题,博主公司项目中下载文件也有这种类似代码。传入下载文件名称,然后再指定目录中找到要下载的文件后,通过流回写给客户端。
  既然如此,那我们再看一下提交记录18f6366f的描述信息,
  不看不知道,一看吓一跳,原来再这个提交之前,项目中存在任意文件下载漏洞,这里博主给大家讲解一下为什么会存在任意文件下载漏洞。2。1攻击流程
  假如下载目录为dataupload构造下载文件请求设置下载文件名称为:。。。。home重要文件。txt服务端将文件名与下载目录进行拼接,获取实际下载文件的完整路径为dataupload。。。。home重要文件。txt由于下载文件包含。。字符,会执行上跳目录的逻辑上跳目录逻辑执行完毕,实际下载文件为home重要文件。txt攻击成功2。2如何解决
  我们看一下提交记录18f6366f主要干了什么,代码如下:GetMapping(commondownload)publicvoidfileDownload(StringfileName,Booleandelete,HttpServletResponseresponse,HttpServletRequestrequest){try{if(!FileUtils。checkAllowDownload(fileName)){thrownewException(StringUtils。format(文件名称({})非法,不允许下载。,fileName));}StringrealFileNameSystem。currentTimeMillis()fileName。substring(fileName。indexOf()1);StringfilePathGlobal。getDownloadPath()fileName;response。setContentType(MediaType。APPLICATIONOCTETSTREAMVALUE);FileUtils。setAttachmentResponseHeader(response,realFileName);FileUtils。writeBytes(filePath,response。getOutputStream());if(delete){FileUtils。deleteFile(filePath);}}catch(Exceptione){log。error(下载文件失败,e);}}publicclassFileUtils{检查文件是否可下载paramresource需要下载的文件returntrue正常false非法publicstaticbooleancheckAllowDownload(Stringresource){禁止目录上跳级别if(StringUtils。contains(resource,。。)){returnfalse;}检查允许下载的文件规则if(ArrayUtils。contains(MimeTypeUtils。DEFAULTALLOWEDEXTENSION,FileTypeUtils。getFileType(resource))){returntrue;}不在允许下载的文件规则returnfalse;}}。。。publicstaticfinalString〔〕DEFAULTALLOWEDEXTENSION{图片bmp,gif,jpg,jpeg,png,wordexcelpowerpointdoc,docx,xls,xlsx,ppt,pptx,html,htm,txt,压缩文件rar,zip,gz,bz2,视频格式mp4,avi,rmvb,pdfpdf};。。。publicclassFileTypeUtils{获取文件类型p例如:ruoyi。txt,返回:txtparamfileName文件名return后缀(不含。)publicstaticStringgetFileType(StringfileName){intseparatorIndexfileName。lastIndexOf(。);if(separatorIndex0){return;}returnfileName。substring(separatorIndex1)。toLowerCase();}}
  可以看到,提交记录18f6366f中,将下载文件时的FileUtils。isValidFilename(fileName)方法换成了FileUtils。checkAllowDownload(fileName)方法。这个方法会检查文件名称参数中是否包含。。,以防止目录上跳,然后再检查文件名称是否再白名单中。这样就可以避免任意文件下载漏洞。路径遍历允许攻击者通过操纵路径的可变部分访问目录和文件的内容。在处理文件上传、下载等操作时,我们需要对路径参数进行严格校验,防止目录遍历漏洞。
  三、分页查询排序参数
  RuoYi项目作为一个后台管理项目,几乎每个菜单都会用到分页查询,因此项目中封装了分页查询类PageDomain,其他会读取客户端传入的orderByColumn参数。再提交记录807b7231之前,分页查询代码如下:publicclassPageDomain{。。。publicvoidsetOrderByColumn(StringorderByColumn){this。orderByColumnorderByColumn;}。。。}设置请求分页数据publicstaticvoidstartPage(){PageDomainpageDomainTableSupport。buildPageRequest();IntegerpageNumpageDomain。getPageNum();IntegerpageSizepageDomain。getPageSize();StringorderBypageDomain。getOrderBy();BooleanreasonablepageDomain。getReasonable();PageHelper。startPage(pageNum,pageSize,orderBy)。setReasonable(reasonable);}分页查询RequiresPermissions(system:post:list)PostMapping(list)ResponseBodypublicTableDataInfolist(SysPostpost){startPage();ListSysPostlistpostService。selectPostList(post);returngetDataTable(list);}
  可以看到,分页查询一般会直接条用封装好的startPage()方法,会将PageDomain的orderByColumn属性直接放进PageHelper中,最后也就会拼接在实际的SQL查询语句中。3。1攻击流程
  假如攻击人员知道用户表名称为users,构造分页查询请求传入orderByColumn参数为1;DROPTABLEusers;实际执行的SQL可能为:SELECTFROMusersWHEREusernameadminORDERBY1;DROPTABLEusers;执行SQL,DROPTABLEusers;完毕,users表被删除攻击成功3。2如何解决
  再提交记录807b7231之后,针对排序参数做了转义处理,最新代码如下,publicclassPageDomain{。。。publicvoidsetOrderByColumn(StringorderByColumn){this。orderByColumnSqlUtil。escapeSql(orderByColumn);}}sql操作工具类authorruoyipublicclassSqlUtil{仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)publicstaticStringSQLPATTERN〔azAZ09,。〕;检查字符,防止注入绕过publicstaticStringescapeOrderBySql(Stringvalue){if(StringUtils。isNotEmpty(value)!isValidOrderBySql(value)){thrownewUtilException(参数不符合规范,不能进行查询);}returnvalue;}验证orderby语法是否符合规范publicstaticbooleanisValidOrderBySql(Stringvalue){returnvalue。matches(SQLPATTERN);}。。。}
  可以看到对于orderby语句后可以拼接的字符串做了正则匹配,仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序)。以此可以避免orderby后面拼接其他非法字符,例如dropif()union等等,因而可以避免orderby注入问题。SQL注入是Web应用中最常见也是最严重的漏洞之一。它允许攻击者通过将SQL命令插入到Web表单提交中实现,数据库中执行非法SQL命令。永远不要信任用户的输入,特别是在拼接SQL语句时。我们应该对用户传入的不可控参数进行过滤。
  四、总结
  通过这三个RuoYi项目中的代码案例,我们可以总结出项目开发中需要注意的几点:不要盲目相信用户传入的参数。无论是修改密码还是文件下载,都不应该直接使用用户传入的参数构造SQL语句或拼接路径,这会导致SQL注入及路径遍历等安全漏洞。我们应该根据实际业务获取真实的用户ID或其他参数,然后再进行操作。SQL参数要进行转义。在拼接SQL语句时,对用户传入的不可控参数一定要进行转义,防止SQL注入。路径要进行校验。在处理文件上传下载等操作时,对路径参数要进行校验,防止目录遍历漏洞。例如判断路径中是否包含。。字符。接口要设置权限。对一些敏感接口,例如重置密码,我们需要设置对应的权限,避免用户越权访问。记录提交信息。在记录提交信息时,最好详细描述本次提交的内容,例如修复的漏洞或新增的功能。这在后续代码审计或回顾项目提交历史时会很有帮助。定期代码审计。作为项目维护人员,我们需要定期进行代码审计,找出项目中可能存在的漏洞,并及时修复。这可以最大限度地保证项目代码的安全性与健壮性。
  综上,写代码不仅仅是完成需求这么简单。我们还需要在各个细节上多加注意,对用户传入的参数要保持警惕,对SQL语句要谨慎拼接,对路径要严谨校验。定期代码审计可以尽早发现并修复项目漏洞,给用户更安全可靠的产品。希望通过这几个案例,可以提醒大家在代码编写过程中进一步加强安全意识。
  到此本文讲解完毕,感谢大家阅读,感兴趣的朋友可以点赞加关注,你的支持将是我的更新动力。

真正厉害的人,往往越简单,看看这些特征你有吗?社会越来越发展,人类越来越进步,科技越来越发达。在日新月异的今天,我们需要学习和掌握的东西实在是太多了。很多人在终日的忙碌之中,渐渐的迷失了方向,甚至迷失了自己。他们也不知道自……散文人生路上,懂得珍惜和感恩,迎面而来的都是花开的芬芳作者:子墨又是一年春好处,春风又绿江南岸,春风十里,为花开作序,春雨绵绵,润泽了春色,温柔了时光,人间的美好,也在这个季节安家落户。晴好的春日里,独自静坐窗前,身边……精工推出AstronGPSSolar卫星定位太阳电能无国界医〔腕表之家品牌新闻〕精工Astron系列致力于凭借先进的GPSSolar卫星定位太阳电能技术在世界各地提供精准计时,从而创造一个更美好的社会。无国界医生(MdecinsSans……2022年全国各省市发动机产量排行榜2022年全国各省市发动机产量排行榜中商产业研究院2023032309:54中商情报网讯:据中商产业研究院数据库显示,2022年12月全国发动机当月产量与去年同期相比下降……把企业家当自家人把企业事当自家事坦洲镇第三工业区。通讯员供图在2023年的中山全球招商推介大会上,坦洲镇再次取得不俗成绩:在大会签约项目中,有近10家企业项目确定落户坦洲镇,包含新能源、光电光学等产业,……冲上热搜!热议字母哥故意刷三双,雄鹿官方炫耀,舆论一边倒NBA常规赛继续进行,雄鹿117111战胜奇才,避免吃到连败,最近18场比赛雄鹿拿下了17场胜利,表现出色。比赛最后阶段引发争议,奇才已经放弃比赛,字母哥在对方篮下扔球碰了篮板……等我老了,绝不戴老头帽!学上海爷爷戴这3款帽子,时髦减龄戴帽子已经成为了很多老年男性的选择,兼顾美观与实用性,既能防风保暖,掩饰秃头、白发等问题,也能提高造型的时尚完成度。有品位的老年男性,早已养出了毒辣的眼光,普通的老头帽压……推进新能源汽车充电网建设破解充电难题2022年,我国新能源汽车呈现高速增长态势,充电基础设施业务面临新挑战、新机遇。全国政协委员,恒银金融科技股份有限公司党委书记、董事长江浩然发现,目前,公共充电桩能够基本满足运……ampampquot国家一级演员ampampquot吴琼嫁小2023年3月3日,著名黄梅戏演员吴琼在短视频平台上更新了自己唱《女驸马》的视频。虽然如今她已经60岁了,但是依旧宝刀不老,吴琼这一生在黄梅戏上取得了非凡的成就,被……牙结石竟会导致口臭牙龈萎缩?提醒日常做好这3点,可防治它牙结石是一种沉积在牙齿表面,并且已经钙化的牙菌斑以及软垢。长出牙结石的主要原因,是由于口腔卫生没有做好,导致滋生出很多细菌。这些细菌会与食物中的蛋白质产生出牙菌斑,并且附……2023年返乡创业最火的创业项目你都知道吗?你到上海了吗?开工了吗?没有啊,我今年不出去了为什么?怎么想的呀?就是想安稳点。这三年,对于我来说简直要了半条命,房贷压力大,工资还降,孩子网课没有人看着,各……保护当地取名传统巴厘岛省长鼓励一家生4胎【环球时报综合报道】为传承当地独特的取名体系,巴厘岛省长鼓励一家生4胎。新加坡《海峡时报》27日报道称,印度尼西亚鼓励每对夫妻只生两个孩子,然而在巴厘岛省长科斯特看来,这项政策……
哈曼叹息拜仁这赛季这么菜,多特蒙德都抓不住机会德甲联赛第八轮,多特蒙德在客场23不敌科隆,错失了在本轮登顶德甲积分榜首的机会,对此,德国国家队旧将哈曼提出了严厉的批评。哈曼认为多特蒙德是一支不会自我批评的球队,他表示……美国乒乓女队输给国乒女队,但她们实力强大,称得上强队昨日,乒乓世锦赛继续进行,结果没有悬念,几支强队也纷纷获胜,但美国女队的表现还是可圈可点的。昨天是中国女乒对阵美国女队,这是国乒女团第三场比赛,本场比赛,王曼昱和王艺迪轮……新能源车充电设施行业加速出海南都讯记者卢亮新能源汽车突破千万规模,充电设施技术创新路在何方?日前,国际独立第三方检测、检验和认证机构德国莱茵TV大中华区在深圳EN科技总部举行TV莱茵150周年品质体验之旅……弥蒙高铁即将通车!中国唯一以佛命名的城市,云南网红小城火了云南是一个充满浪漫情怀的地方,也是无论任何时候都是国内最热门的旅行地之一,有看不完的春色,有看不完的美景,吃不完的美食,这里的每一个城市都会让人流连忘返:昆明、大理、丽江、腾冲……阿贾克斯vs那不勒斯贾府有大短板,斯帕莱蒂此役有秘密武器哈喽大家好,我是足球不说谎的阿匹!昨天的比赛,罗杰斯率领球队力克诺丁汉森林,拿到了期待已久的赛季首胜,我们的分享也继续收获好评!五大联赛偃旗息鼓之后,欧洲足坛重新回到欧冠……VivoX90异军突起,蔡司2亿主摄极限一体屏,颜值影像天花自10月份以来,又被华为Mate50和iPhone14系列刷屏了,花粉和果粉意见不一。其实两款手机都很优秀,均为高端影像旗舰引领者,表现都不错。不过除华为和苹果之外,近几年国产……无语!辽宁北京焦点大战却被裁判抢戏!两边都不讨好真是莫名其妙稍早之前辽宁和北京的京辽大战再度打响,不同于上次郭艾伦、韩德君、张镇麟三名核心全部缺阵,这次两边都各遣完整阵容,其实上半场比赛双方都打的极为焦灼,辽宁仅仅只领先3分而已,不过在……历时三个月,昌平西关环岛完成华丽变身为将西关环岛打造为骑行驿站城市花园,昌平公路分局于去年9月下旬启动了京青线西关环岛段中修工程,并于近日顺利竣工。西关环岛连接着京藏高速、京青线、政府街西路、西关路,是昌平……为什么绿色彗星没有绿色尾巴?绿色在天文学中是一种不寻常的颜色。这是我们的眼睛最敏感的颜色,但夜空中很少有东西真正呈现绿色。例如,没有绿色的星星,只有黄白色、红色和蓝色的星星。但是可以有绿色彗星,这是为什么……当年游戏中被人唾弃的路人角色,多年后才知道,他们才是真英雄前言95年的时候,《仙剑奇侠传》的诞生,成为了国产单机游戏的一个重要标志,因为其不仅是第一个国产游戏,还满足了玩家们对中国式英雄的幻想,以至于后续的经典之作,不管是《剑侠……恭喜!湖人宣布出战名单,5换2交易赚了,63前锋有望辅佐詹姆北京时间1月5日,NBA常规赛正在进行,其中洛杉矶快船和泽维尔穆恩签下第二份10天合同,伊赛亚托马斯透露没欧文篮网无法夺冠,有欧文则是最大热门,詹姆斯哈登、凯文杜兰特非常依赖他……澳大利亚冬奥代表团发布官方队服来源:新华网据当地媒体4日报道,澳大利亚奥委会发布了为澳大利亚冬奥代表团参加2022年北京冬奥会而设计制作的官方队服。这是澳大利亚冬奥代表团运动员布罗迪萨默斯展示官方队服……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网