大家好我是孙嵓,因为我单位对web安全要求很高,前几天单位找了一家安全测试的公司,对软件做了相关的测试,当然我上线的系统也未能幸免而且有大量的漏洞哈哈。
于是我就改啊改,让人测啊测,终于将所有bug清零了,我也掌握了一些web安全的基本理论知识,并且受邀做了简单的web安全分析,今天在这跟大家浅谈浅谈。
跨站点脚本攻击,指攻击者往Web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到恶意攻击用户的目的。
主要出现在我们表单的input,textarea当中
⭐解决方案
rules: {
email: [
{ type: 'string', message: '长度不能超过50位', trigger: 'blur', max: 50 },
{ required: true, validator: checkEmail, trigger: 'blur' }]
}
后端对前端传过来的参数进行校验(例如可以用validation校验框架通过注解的形式对其进行做一些长度校验,当然也可以自定义校验方法具体的大家另行百度)。
@Email(message = “邮箱格式不正确”)
@Size(min = 0, max = 50, message = “邮箱长度不能超过50个字符”)
@NotBlank(message= “邮箱不能为空”)
private String email;
数据库字段长度进行限制像varchar类型别不要动不动255需要多少就设置多少预留一点长度即可,字段太长也影响性能的。
能用select代替input尽量用select限制用户输入。
对HTML转义处理。将其中的”<”,”>”等特殊字符进行转义编码/过滤html标签(ruoyi脚手架有专门的过滤器和包装的servlet对其进行过滤有兴趣的可以自己研究下)。
DoS攻击又叫拒绝服务,其目的是使计算机或网络无法提供正常的服务。常见的有SYN FLOOD(制造大量发送SYN的TCP连接请求占有资源让系统无法建立tcp连接)、带宽攻击(我什么都不干就是不断的请求接口将服务器瘫痪)等等。
DDOS又叫分布式拒绝服务,这两大同小异,只不过DDOS跟分布挂钩就意味着控制多台服务器。
⭐解决方案
跨站点请求伪造,指攻击者通过跨站请求,以合法的用户的身份进行非法操作。可以这么理解CSRF攻击:你打开一个网站没有注销,然后又打开了一个恶意攻击的网站盗用你的身份,以你的名义向你未注销的网站发送恶意请求。这样能做到利用你的身份发邮件,发短信,进行交易转账,甚至盗取账号信息。(建议看电影的时候把该关的都关了,懂的都懂)
⭐解决方案
文件上传漏洞,指的是用户上传一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力
⭐解决方案
文件上传的目录设置为不可执行。
单独设置文件服务器的域名。
前端对上传的文件进行大小,类型的判断。
后端限制上传文件的大小。
判断文件类型。在判断文件类型的时候,可以结合使用MIME Type,后缀检查等方式。不能单靠后缀检查攻击者可以将可执行文件的后缀名称改为图片或其他后缀类型,诱导用户执行。
对上传的文件类型进行白名单校验,只允许上传可靠类型。
上传的文件需要进行重新命名,使攻击者无法猜想上传文件的访问路径,将极大地增加攻击成本,同时向shell.php.rar.ara这种文件,因为重命名而无法成功实施攻击。
每种类型文件的文件头是不同的,我们可以读取文件的前几个字节来判断文件是否符合上传的类型。
文件上传前后进行MD5校验防止中间被篡改。
5.访问越权
垂直越权
访问控制实际上是建立用户与权限之间的对应关系,即“基于角色的访问控制”。不同角色的权限有高低之分。高权限角色访问低权限角色的资源往往是被允许的,而低权限角色访问高权限的资源往往被禁止的。
比如说拿员工来说员工只能看自己的信息,即使知道部门操作的接口也是无权操作的。
⭐解决方案
Spring Security, Apache Shiro都可以建立垂直权限管理
平行越权问题在同一个角色上,系统只验证了访问数据的角色,没有对角色内的用户做细分。
比如说两个人登录系统我只知道这两是应聘者但我不知道他是张三还是李四。
⭐解决方案
尽量都用post请求,防止用户利用get请求猜测参数直接在地址栏上请求。
id尽量别用1,2,3,4,5自增的主键,建议用UUID/Mybatis-plus的雪花算法形成的id当主键,让他们猜不到,这种情况也就避免了。
在业务上对用户进行区分获取登陆用户的id用其id做一遍查询查看他是否有此需要获取信息的id,没有就抛出异常或者这个表有用户的id这个字段做关联直接与用户id联合查询即可。(这个方法有点粗糙,可以尝试联合索引的方式比如说一个表的主键去配合user_id去做联合查询锁定唯一)
6.SQL注入攻击
在HTTP请求中注入恶意的SQL代码,服务器使用参数构建数据库SQL命令时,这个恶意SQL在数据库中执行。(比如说where一个字段后边接一段 or 1=1where之前的语句就会被执行出来
⭐解决方案
限制字符串输入的长度
过滤SQL需要的参数中的特殊字符。比如单引号、双引号。
数据库字段长度限制等。
不用拼接SQL字符串的形式,使用预编译的PrepareStatement在mybatis就是用#代替$占位符。
以上就是本文的全部内容了,能力有限,理性对待
如果感觉还不错的话,欢迎点赞和关注
分享经验,贴近项目,crud永不为奴!!!
1.一文搭建本地git服务器
2.Java实现短信验证码