阿粉相信大家做开发这么久了,肯定都看了阿里公布出来的,阿里开发手册,不管是什么版本的,比如有,泰山版,华山版,终极版,等等,反正不管是什么版本,总归就是很多很多的,而阿粉也相信大家在这些开发手册的帮助下,获益匪浅,而且很多同学也会在使用 IDEA 的时候,加上了阿里的插件,来帮助自己写代码规范起来。
今天阿粉就来看看腾讯是怎么规定的,毕竟鹅厂,也算是和阿里抗衡的存在。
数据持久化
阿粉相信,谈到数据持久化的时候,就有很多同学想到了 Mybatis 和Hibernate ,这不是数据持久化的框架么,是的,没错,持久化就是这么个意思,把数据都保存到文件或者数据库或者其他位置(保存数据、查找数据)
腾讯规定【必须】SQL语句默认使用预编译并绑定变量
这是什么意思呢?
从本质上来说就是
Web后台系统应默认使用预编译绑定变量的形式创建sql语句,保持查询语句和数据相分离。以从本质上避免SQL注入风险。
如使用Mybatis作为持久层框架,应通过#{}语法进行参数绑定,MyBatis 会创建 PreparedStatement 参数占位符,并通过占位符安全地设置参数。
实际上这句话的意思就是,防止被SQL注入,我们都知道,如果你在写web端的代码的时候,如果有的人成功获取到你的参数和你的接口地址之后,就会给你在请求里面拼接上一系列的参数,比如说在你的参数里面拼接上一些非法字符,直接去到你的数据库去执行某些操作,这时候巧了,你们公司并没有做处理SQL注入的防范措施,那么就会出现一些比较坑的错误,比如在SQL后面就出现了一堆莫名的操作。
阿粉记得最早的时候,在微信小程序提交审核的时候,微信就会对你项目中的一些接口进行一些注入的操作,来测试你的项目是否会被注入SQL而导致出现数据泄露的错误。
而这也就是一个比较基础的面试题,#{}和${}的区别了
也就是Mybatis中的
{}传入SQL语句后实际执行时调用的是PreparedStatement.execute(),同样存在注入风险)
文件操作
【必须】文件类型限制
这是什么意思呢?
也就是说须在服务器端采用白名单方式对上传或下载的文件类型、大小进行严格的限制。仅允许业务所需文件类型上传,避免上传.jsp、.jspx、.class、.java等可执行文件。
当我们做文件上传或者文件下载的时候,要针对方法来考虑你要下载的文件类型是什么样子的,或者上传文件的类型是什么样子的,如果你是图片上传,那么你就给他限制一下后缀格式,比如 .jpg或者.jpeg再或者是.bmp和.png,如果不是这些类型的,那就直接error。
一般这种情况,在前端实际上就已经可以完成校验了,很少的需要后端再去处理一些这些内容了,但是不怕一万,就怕万一呀,如果他没限制的话,那你写的时候 是不是有点崩。
示例代码:
代码语言:javascript复制 String file_name = file.getOriginalFilename();
String[] parts = file_name.split("\.");
String suffix = parts[parts.length - 1];
switch (suffix){
case "jpeg":
suffix = ".jpeg";
break;
case "jpg":
suffix = ".jpg";
break;
case "bmp":
suffix = ".bmp";
break;
case "png":
suffix = ".png";
break;
default:
//handle error
return "error";
}
【必须】禁止外部文件存储于可执行目录
禁止外部文件存储于WEB容器的可执行目录(appBase)。建议保存在专门的文件服务器中。
阿粉相信,现在做开发的,几乎不太可能把外部文件存储到自己的项目中,那就是闹着玩呀,现在的云服务器这么猛,都有专门的文件服务器来进行文件的存储,所以这个压根不太会出现。
响应输出
【必须】设置正确的HTTP响应包类型
响应包的HTTP头“Content-Type”必须正确配置响应包的类型,禁止非HTML类型的响应包设置为“text/html”。此举会使浏览器在直接访问链接时,将非HTML格式的返回报文当做HTML解析,增加反射型XSS的触发几率。
这种情况按照目前的发展水平来说,几乎不太可能,这种情况很多只会出现在新手身上。
【必须】外部输入拼接到response页面前进行编码处理
需要对以下6个特殊字符进行HTML实体编码(&, <, >, “, ‘,/)。示例:
& —> &
< —> <
> —> >
“ —> "
‘ —> '
/ —> /
实际上就是对各种特殊字符进项编码,防止被攻击。
查询业务
【必须】返回信息最小化
返回用户信息应遵循最小化原则,避免将业务需求之外的用户信息返回到前端。
这个实际上就和安全方面不太相关了,但是和性能方面,就相关了,查询的话,返回信息能有多准确,那你就返回多准确的数据,不要把一些没用的字段返还给前端,毕竟人家要的就是那么多数据,
【必须】个人敏感信息脱敏展示
这个就很容易理解了,比如,手机号,中间的四位数字就经过特殊处理,成了 134****8888 就出现了脱密之后的字符。
【必须】数据权限校验
查询个人非公开信息时,需要对当前访问账号进行数据权限校验
- 验证当前用户的登录态
- 从可信结构中获取经过校验的当前请求账号的身份信息(如:session)。禁止从用户请求参数或Cookie中获取外部传入不可信用户身份直接进行查询。
- 验证当前用户是否具备访问数据的权限
而这些实际上就是腾讯的一些关于代码方面的写作要求,你学会了么?