thinksns网站开发腾讯云 怎样建设网站

diannao/2025/10/16 18:51:30/文章来源:
thinksns网站开发,腾讯云 怎样建设网站,网站建设公司专业开发北京网站,企帮手logo设计官网来源 | 程序员石头责编| Carol封图 | CSDN 付费下载自视觉中国之前在某厂的某次项目开发中#xff0c;项目组同学设计和实现了一个“引以为傲”#xff0c;额#xff0c;有点夸张#xff0c;不过自认为还说得过去的 feature#xff0c;结果临上线前被啪啪打脸#xff0c;… 来源 | 程序员石头责编| Carol封图 | CSDN 付费下载自视觉中国之前在某厂的某次项目开发中项目组同学设计和实现了一个“引以为傲”额有点夸张不过自认为还说得过去的 feature结果临上线前被啪啪打脸因为实现过程中因为一行代码没有标题党真的是一行代码带来的安全漏洞让我们丢失了整个服务器控制权测试环境。多亏了上线之前有公司安全团队的人会对代码进行扫描才让这个漏洞被扼杀在摇篮里。下面我们就一起来看看这个事故啊不对是故事。背景说明我们的项目是一个面向全球用户的 Web 项目用 SpringBoot 开发。在项目开发过程中离不开各种异常信息的处理比如表单提交参数不符合预期业务逻辑的处理时离不开各种异常信息例如网络抖动等的处理。于是利用 SpringBoot 各种现成的组件支持设计了一个统一的异常信息处理组件统一管理各种业务流程中可能出现的错误码和错误信息通过国际化的资源配置文件进行统一输出给用户。1、统一错误信息配置管理我们的用户遍布全球为了给各个国家用户比较好的体验会进行不同的翻译。具体而言实现的效果如下为了方便理解以“找回登录密码”这样一个业务场景来进行阐述说明。假设找回密码时需要用户输入手机或者邮箱验证码假设这个时候用户输入的验证码通过后台数据库可能是Redis对比发现已经过期。在业务代码中只需要简单的throw new ErrorCodeException(ErrorCodes.AUTHCODE_EXPIRED) 即可。具体而言针对不同国家地区不同的语言看到的效果不一样中文用户看到的提示就是“您输入的验证码已过期请重新获取”欧美用户看到的效果是“The verification code you input is expired, ...”德国用户看到的是“Der von Ihnen eingegebene Verifizierungscode ist abgelaufen, bitte wiederholen” 。我瞎找的翻译不一定准……2、统一错误信息配置管理代码实现关键信息其实就在于一个 GlobalExceptionHandler对所有 Controller 入口进行 AOP 拦截根据不同的错误信息获取相应资源文件配置的 key并从语言资源文件中读取不同国家的错误翻译信息。ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(BadRequestException.class)ResponseBodypublic ResponseEntity handle(HttpServletRequest request, BadRequestException e){String i18message  getI18nMessage(e.getKey(), request);return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Response.error(e.getCode(), i18message));}ExceptionHandler(ErrorCodeException.class)ResponseBodypublic ResponseEntity handle(HttpServletRequest request, ErrorCodeException e){String i18message  getI18nMessage(e.getKey(), request);return ResponseEntity.status(HttpStatus.OK).body(Response.error(e.getCode(), i18message));} }不同语言的资源文件示例private String getI18nMessage(String key, HttpServletRequest request) {try {return messageSource.getMessage(key, null, LanguaggeUtils.currentLocale(request));} catch (Exception e) {// logreturn key;} }详细代码实现可以参考本人之前写的这篇文章一文教你实现 SpringBoot 中的自定义 Validator 和错误信息国际化配置上面有附完整的代码实现。3、基于注解的表单校验含自定义注解还有一种常见的业务场景就是后端接口需要对用户提交的表单进行校验。以“注册用户”这样的场景举例说明 注册用户时往往会提交昵称性别邮箱等信息进行注册简单起见就以这 3 个属性为例。定义的表单如下public class UserRegForm {private String nickname;private String gender;private String email; }对于表单的约束我们有昵称字段“nickname” 必填长度必须是 6 到 20 位性别字段“gender” 可选如果填了就必须是“Male/Female/Other/”中的一种。说啥除了男女还有其他对是的。毕竟全球用户嘛你去看看非死不可还有更多。邮箱“email”必填必须满足邮箱格式。对于以上约束我们只需要在对应的字段上添加如下注解即可。public class UserRegForm {Length(min  6, max  20, message  validate.userRegForm.nickname)private String nickname;Gender(messagevalidate.userRegForm.gender)private String gender;NotNullEmail(messagevalidate.userRegForm.email)private String email; }然后在各个语言资源文件中配置好相应的错误信息提示即可。其中 Gender 就是一个自定义的注解。4、基于含自定义注解的表单校验关键代码自定义注解的实现主要的其实就是一个自定义注解的定义以及一个校验逻辑。例如定义一个自定义注解 CustomParamDocumented Constraint(validatedBy  CustomValidator.class) Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE}) Retention(RetentionPolicy.RUNTIME) public interface CustomParam {String message() default name.tanglei.www.validator.CustomArray.defaultMessage;Class?[] groups() default {};Class? extends Payload[] payload() default { };DocumentedRetention(RetentionPolicy.RUNTIME)Target({FIELD, METHOD, PARAMETER, ANNOTATION_TYPE})interface List {CustomParam[] value();} }校验逻辑的实现 CustomValidatorpublic class CustomValidator implements ConstraintValidatorCustomParam, String {Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if (null  s || s.isEmpty()) {return true;}if (s.equals(tanglei)) {return true;} else {error(constraintValidatorContext, Invalid params:   s);return false;}}Overridepublic void initialize(CustomParam constraintAnnotation) {}private static void error(ConstraintValidatorContext context, String message) {context.disableDefaultConstraintViolation();context.buildConstraintViolationWithTemplate(message).addConstraintViolation();} }上面例子只为了阐述说明问题其中校验逻辑没有实际意义这样如果输入参数不满足条件就会明确提示用户输入的哪个参数不满足条件。例如输入参数xx则会直接提示Invalid params: xx。点击查看大图这个跟第一部分的处理方式类似因为现有的 validator 组件实现中如果违反相应的约束也是一种抛异常的方式实现的因此只需要在上述的GlobalExceptionHandler中添加相应的异常信息即可这里就不详述了。这不是本文的重点这里就不详细阐述了。场景重现一切都显得很完美直到上线前代码提交至安全团队扫描就被“啪啪打脸”扫描报告反馈了一个严重的安全漏洞。而这个安全漏洞属于很高危的远程代码执行漏洞。用前文提到的自定义 Validator输入的参数用“11${11}”看看效果点击查看大图太 TM 神奇了居然帮我运算出来了返回message: Invalid params: 112。问题就出现在实现自定义注解进行校验的这行代码如下图所示其实最开始的时候这里直接返回了“Invalid params”当初为了更好的用户体验要明确告诉用户哪个参数没有通过校验因此在输出的提示上加上了用户输入的字段也就是上面的Invalid params: s没想到这闯了大祸了回过头来想感觉这里没必要这么详细啊因为前端已经有相应的校验了正常情况下回拦住针对不守规矩的用非常规手段来的接口请求直接返回校验不通过就行了毕竟不是对外提供的 OpenAPI 服务。仔细看这个方法实际上是ConstraintValidatorContext这个接口中声明的看方法名字其实能知道输入参数是一个字符串模板内部会进行解析替换的这其实也符合“见名知意”的良好编程习惯。教训大家应该把握好自己写的每一行代码背后实际在做什么。/* ......* param messageTemplate new un-interpolated constraint message* return returns a constraint violation builder*/ ConstraintViolationBuilder buildConstraintViolationWithTemplate(String messageTemplate);这个 case源码调试进去之后就能跟踪到执行翻译阶段在如下方法中org.hibernate.validator.messageinterpolation.AbstractMessageInterpolator.interpolateMessage。点击查看大图再往后就是表达式求值了。以为这样就完了吗刚开始感觉能帮忙算简单的运算规则也就完了吧你还能把我怎么样其实这个相当于暴露了一个入口支持用户输入任意 EL 表达式进行执行。网上通过关键字 “SpEL表达式注入漏洞” 找找就能发现事情并没有想象中那么简单。我们构造恰当的 EL 表达式注意各种转义下文的输入参数相对比较明显在做什么了实际上还有更多黑科技比如各种二进制转义编码啊等等就能直接执行输入代码例如可以直接执行命令“ls -al” 返回了一个 UNIXProcess 实例命令已经被执行过了。点击查看大图比如我们执行个打开计算器的命令搞个计算器玩玩~图片放大看得更清楚我录制了一个动图来个演示可能更生动一些。这还得了吗这相当于直接在公网上提供了一个 WebShell 的功能呀你看想运行啥命令就能运行啥命令例如 ping 本人博客地址ping www.tanglei.name下面动图gif 图上传总是失败试试微信公众号嵌入视频功能演示一下整个过程从运行 ping 到 kill ping。这样岂不是直接创建一个用户然后远程登录就可以了。后果非常严重啊别人想干嘛就干嘛了。漏洞根因我们跟踪下对应的代码看看内部实现就会“恍然大悟”了。点击查看大图点击查看大图经验教训幸亏这个漏洞被扼杀在摇篮里否则后果还真的挺严重的。通过这个案例我们有啥经验和教训呢那就是作为程序员我们要对每一行代码都保持“敬畏”之心。也许就是因为你的不经意的一行代码就带来了严重的安全漏洞要是不小心被坏人利用轻则……重则……自己想象吧此外我们也应该看到程序员需要对常见的安全漏洞例如XSS/CSRF/SQL注入等等有所了解并且要有足够的安全意识其实有时候研究一些安全问题还挺好玩的例如用户权限分离运行程序的用户不应该用 root例如新建一个“web”或者“www”之类的用户并设置该用户的权限比如不能有可执行 xx 的权限之类的。本文 case如果权限进行了分离遵循最小权限原则应该也不会这么严重。本文就刚好是因为是测试环境所以没有强制实施任何时候都不要相信用户的输入必须对用户输入的进行校验和过滤又特别是针对公网上的应用。敏感信息加密保存。退一万步讲假设攻击者攻入了你的服务器如果这个时候你的数据库账户信息等配置都直接明文保存在服务器中。那数据库也被脱走了。如果可能的话需要对开发者的代码进行漏洞扫描。一些常见的安全漏洞现在应该是有现成的工具支持的。另外让专业的人做专业的事情例如要有安全团队可能你会说你们公司没有不也活的好好的哈哈只不过可能还没有被坏人盯上而已坏人也会考虑到他们的成本和预期收益的当然这就更加对我们开发者提高了要求。一些敏感权限尽量控制在少部分人手中配合相应的流程来支撑不得不说大公司繁琐的流程还是有一定道理的。如果你对本文有不同意见或者更好的建议欢迎留言参与讨论。推荐阅读云计算巨头们的背水一战整理了一份Docker系统知识从安装到熟练操作看这篇就够了| 原力计划借助大数据进行社交媒体营销企业们得这么玩追忆童年教你用Python画出儿时卡通人物AI 终极问题我们的大脑是一台超级计算机吗公链的历史交叉口PoS还能走多远真香朕在看了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/92242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内建网站费用做网站需要记哪些代码

最近在学习java NIO,发现java nio selector 相对 channel ,buffer 这两个概念是比较难理解的 ,把学习理解的东西以文字的东西记录下来,就像从内存落地到硬盘,把内存中内容换成该知识点的索引。 在介绍Selector之前先明确以下3个问题&#…

北京金河水务建设有限公司网站做venn图网站

在一个看似平常却又暗藏玄机的午后,阿强正悠闲地坐在实验室里,翘着二郎腿,哼着小曲儿,美滋滋地品尝着手中那杯热气腾腾的咖啡,仿佛整个世界都与他无关。突然,实验室的门 “砰” 的一声被撞开,小…

品牌网站设计步骤长尾关键词举例

许多论文对插图有要求,直接插入png、jpg一般是不行的,这是一篇顶刊文章(pdf)的插图,放大2400%后依旧清晰,搜罗了网上的方法,总结了一下如何将图片无损放入论文中。 这里主要讨论的是数据生成的图…

哪些企业需要做网站建设wordpress 自定义标题

将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Inte…

连连跨境电商网站开发设计模板网站都有哪些

引言 在考虑生成对抗网络的文献时,Wasserstein GAN 因其与传统 GAN 相比的训练稳定性而成为关键概念之一。在本文中,我将介绍基于梯度惩罚的 WGAN 的概念。文章的结构安排如下: WGAN 背后的直觉;GAN 和 WGAN 的比较;…

张家界做网站公司传统类型的企业网站

tag常被称作里程碑,发版Release时用到。 怎么添加tag? 问 : 刚修改完代码 还未 Commit 可以直接 git tag v2.4.6.1 -m "[Update]更新proxy379ac539"吗? 答: 不可以,git tag 命令是用来给已经存…

企业网站 案例字节跳动员工人数2019

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我,若你是真心学习可以送你书籍,指导你学习,给予你目标方向的学习路线,无套路,博客为证。 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖…

网站建设费用上海公司做网站的费用如何记账

描述 小红正在玩一个“炸砖块”游戏,游戏的规则如下:初始有一个 n * m 的砖块矩阵。小红会炸 k 次,每次会向一个位置投炸弹,如果这个位置有一个砖块,则砖块消失,上方的砖块向下落。小红希望你画出最终砖块的图案。 输入描述 第一行输入三个正整数 n, m, k,代表矩阵的行…

网站建设与维护岗位职责南京企业网站做优化

OpenDDS、FastDDS数据分发服务中间件设计 软件架构 应用层DDS层RTPS层传输层 软件层次 FastDDS整体架构如下,这里可以看到DDS和RTPS的关系。另外缺少一部分IDL(统一描述语言),其应该是Pub、Sub的反序列化、序列化工具。 在RT…

旅游网站开发的国内外现状阳江做网站公司

解决方式 当使用自定义组件或者slot标签作为组件A的插槽内容时,在组件A中必须定义一个默认插槽,对普通view等标签无限制。且因为wx:if为false的插槽等同没有定义 场景复现(仅以自己遇到情况为例) 1、调试基础库2.19.4 2、使用w…

个人网站 内容建设四川省住房城乡建设厅官网查询

这里说的日期是指字符串的日期格式,如“2014-10-15”,我们要推断这个日期是否在今天之前,网上看到好多推断的方法,都是拿这个日期转换成Date对象 然后与new Date()比較,使用comparetTo() 或者before()方法&#xff0c…

大型美容网站建设动态图表制作方法

ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常用到的ES6语法做简要的介绍。 1.let,const l…

国外社交网站设计欣赏高端ppt制作

之前的一段时间让我意识到,零碎的知识记录和发布对自己的学习和掌握来说意义不大,如果不能从基础知识开始建立生动的原理,发布这些博客只是让自己成为一个无情的背诵者。另外更可悲的一点是,会让自己误认为学会了自己发布的内容。…

怎么自己做网站推广百度站长工具平台登录

简介 主芯片STM32F103ZET6,读取内部温度其他知识 内部温度所在ADC通道 温度计算公式 V25跟Avg_Slope值 参考文档 stm32f103ze.pdf 电压计算公式 Vout Vref * (D / 2^n) 其中Vref代表参考电压, n为ADC的位数, D为ADC输入的数字信号。 实现…

做如美团式网站要多少钱平台网站开发价格

组织机构 部门 部门可以创建下级部门部门可以设置部门主管,可以是多人部门可以默认构建,沟通群可以设置部门信息,比如电话、简介可以设置部门的可见性,比如隐藏本部门,本部门将不会在组织机构、搜索,个人…

做网站asp和asp.net有没有专门做布料的网站

前言 在C语言中,当我们定义了一个结构体时,通常需要编写一个函数来初始化它,否则在创建结构体变量时容易忘记调用初始化函数,导致程序出错。但在C中,我们将不会有这样的烦恼,前提是编写了正确的构造函数。…

做网站推销好做吗编程网址

FDTD2018a安装问题记录 目录问题解决方案 目录 问题 解决方案 电脑名字如果是中文改成英文

宏大建设集团有限公司网站人事怎么做招聘网站比对分析

转载自 对Java的URL类支持的协议进行扩展的方法JAVA默认提供了对file,ftp,gopher,http,https,jar,mailto,netdoc协议的支持。当我们要利用这些协议来创建应用时,主要会涉及到如下几个类:java.net.URL、java.net.URLConnection、InputStream。URL类默认…

接单做网站wordpress后台管理插件

计算机内存原理 要说递归和栈的问题,首先就要说下计算机内存的基本原理。简单理解计算机内存原理可以将一台电脑看作超市的存包柜,每个柜子都有柜号(即计算机中的地址,如0x000000f)。当需要将数据存储到计算机中时&…

怎么在网上查网站空间是双线还是单线嘉兴网站建设方案策划

目录 ​​​​​​​一、文件和目录(II) 1、文件 2、目录 二、文件存取方法、存取控制(II) 1、文件存取方法 2、文件的访问 3、文件控制 三、常见嵌入式文件系统(I) 一、文件和目录(I…