常见JavaWeb安全问题和解决方案
作者:风缱云流 发布时间:2023-11-09 01:02:17
1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。
字符型注入:黑色部分为拼接的问题参数
select * from t_user where name='test' or '1' = '1';
数字型注入:黑色部分为拼接的问题参数(对于强类型语言,字符串转int类型会抛异常。所以这种注入方式一般出现在php等弱类型语言上)
select * from t_user where id=1;drop table t_userinfo;
搜索型注入:对表名进行猜测
select * from t_user where userName like ‘%test%' and 1=2 union select 1,2 from t_admin';
修复方法:
a、在mybatis中使用#把参数当做一个字符串,不能使用$符号
b、在JDBC中使用预编译的方式对参数进行绑定,详细如下:
String userName = request.getParameter("userName");
String sql = "select * from t_user where userName = ?";
JdbcConnection conn = new JdbcConnection();
PreparedStatement pstmt = conn.preparedStatement(sql);
pstmt.setString(1,userName);
2、XSS跨站脚本攻击(恶意将脚本代码植入到供其他用户使用的页面中)
反射型:经过后端,不经过数据库
存储型:经过后端经过数据库
DOM型:基于文档对象模型DOM,通过控制url参数触发
修复方法:
a、后台设置XSSFilter,继承RequestServletWrapper类,对前端请求中的可控参数进行过滤
b、服务端设置Http-only安全属性,使浏览器控制cookie不被泄露
c、对引入到DOM中的参数使用htmlEncodeByRegExp编码,在对应的展示框中用htmlDecodeByRegExp进行解码(比较常用)
var HtmlUtil = {
/*1.用正则表达式实现html转码*/
htmlEncodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/\'/g,"'");
s = s.replace(/\"/g,""");
return s;
},
/*2.用正则表达式实现html解码*/
htmlDecodeByRegExp:function (str){
var s = "";
if(str.length == 0) return "";
s = str.replace(/&/g,"&");
s = s.replace(/</g,"<");
s = s.replace(/>/g,">");
s = s.replace(/ /g," ");
s = s.replace(/'/g,"\'");
s = s.replace(/"/g,"\"");
return s;
}
};
3、敏感信息泄露
程序造成的泄露:
1、服务端返回冗余敏感数据:用户只申请了单个账户的信息,却返回了多个用户的信息
2、将敏感信息直接写在前端页面的注释中
3、写在配置文件的密码未进行编码处理
4、请求参数敏感信息未脱敏处理(可以将数据在前端用RSA加密,后台在进行解密)
5、前端展示的敏感信息,没有在后台进行脱敏处理(后台对数据进行处理,可以将中间部分使用*号代替)
6、越权
4、越权:攻击者能够执行本身没有资格执行的权限
水平越权:权限类型不变,权限Id变化(同等角色下的用户,不但能够访问自己私有的数据,还能访问其他人私有的数据)
垂直越权:权限ID不变,权限类型变化(即低权限的角色通过一些途径,获得高权限的能力)
交叉越权:上面两者的交集
修复方法:
1、根据请求携带的用户信息进行鉴权操作,对当前请求携带的用户信息进行用户角色和数据权限匹配。每一个重要操作的功能、分步操作的每个阶段都进行权限判断。权限不足就中断操作。
5、文件下载:
任意文件下载:下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也可以下载数据库的配置信息,以及对内网的信息探测等等
文件越权下载:
修复方法:
1、针对任意文件下载的修复,增加当前请求下载的文件上一级的绝对路径同配置文件中允许下载的路径直接的比较(file.getCanonicalFile().getParent()获取上一级的绝对路径)
if(!file.getCanonicalFile().getParent().equals(new File(Constants.TMP_PATH).getCanonicalPath())){
return ;
}
2、文件越权下载:允许下载之前对请求所带的用户信息进行判断,拥有足够的权限菜允许下载。
6、文件上传:网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
修复方法:
1、客户端、服务端白名单验证(不建议用黑名单),客户端的校验不够安全,很容易被绕过。
String fileName = file.getOriginalFilename();
String extName = fileName.subString(fileName.lastIndexof(".")+1);
获取上传文件的后缀名,并同白名单上的后缀名进行比较,包含在白名单上则允许通过,不包含则直接中断请求。
2、MiME类型检测:文件上传时浏览器会在Header中添加MIMETYPE识别文件类型,服务端要对此进行检测。
String mime = file.getContentType();//获取文件的ContentType类型值
同白名单上的contentType类型名进行比较,包含在白名单上则允许通过,不包含则直接中断请求。
3、文件内容检测:用不同的方法将不同的文件内容流的进行读取。
BufferedImage image = ImageIO.read(file.getInputStream());
7、CSRF:跨站请求伪造,完成CSRF攻击,需要完成两个步骤:1、登录受信任的网站A,并在本地生成cookie;2、在不登出A的情况下,访问危险网站B
CSRF本质原因:Web的隐式身份验证机制。Web的身份验证机制虽然可以保证请求来自用户的浏览器,但是无法保证该请求时用户批准发送的。
修复方法:
CSRF Token校验:在页面中添加一个hidden用于存放token字段,请求发送时携带token到服务端,服务端校验token值是否准确。不准确直接中断操作
来源:https://www.cnblogs.com/8593l/p/10641368.html
猜你喜欢
- 一、demo简介1.效果展示如下图,我截了三个瞬间,但其实这是一个连续的动画,就是这个大圆不停地吞下小圆。2.这个动画可以拆分为两部分,首先
- 本文实例为大家分享了C语言自定义扫雷游戏的具体代码,供大家参考,具体内容如下实现过程对于用C语言实现扫雷游戏得实现,可将游戏过程分为两个板块
- 本文实例为大家分享了flutter日期时间选择器的具体代码,供大家参考,具体内容如下1 日期选择器 //设置默认显示的日期为当前 DateT
- java项目中常用maven工具来进行工程管理,但经常遇到的一个问题是生成的jar包越来越大,编译一次工程越来越慢。怎么有效地去除冗余依赖,
- 所谓回调,就是客户程序C调用服务程序S中的某个方法A,然后S又在某个时候反过来调用C中的某个方法B,对于C来说,这个B便叫做回调方法。下面看
- Android版本更新实例详解1、导入xutils的jar包 2、在AndroidManifest.xml中添加权限 3、选择下载的路径,和
- 目录一、图示二、链表的概念及结构三、单链表的实现四、完整代码的展示一、图示二、链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据
- 当我们在做前后端分离的开发时,在使用fetch交换数据的时候,提示Access-Control-Allow-Origin跨域问题,解决方案跟
- 本文实例讲述了Java基于IO流读取文件的方法。分享给大家供大家参考,具体如下:public static void readFile(){
- [LeetCode] 131.Palindrome Partitioning 拆分回文串Given a string s, par
- 大家好,在这篇文章中,我们将学习如何添加动画,同时从一个页面到其他在 Flutter。我们将覆盖不同类型的动画和实现基本动画 Flutter
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- Java读取json数据并存入数据库1. pom依赖<dependency> &nbs
- 如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用CountDownTimer定时器简单封装下此效果,方便我们
- 反射方式获取JPA Entity属性和值在记录日志或者调试的时候,往往需要输出数据库查询或者写入的值,或者在接 * 互的时候,可能需要将实体转
- 需求:有些时候,我们需要连接多个数据库,但是,在方法调用前并不知道到底是调用哪个。即同时保持多个数据库的连接,在方法中根据传入的参数来确定。
- 一、判断语句最常用的顺序结构只能顺序执行,并不能进行判断和选择。于是便有了下面两种分支结构if语句switch语句1. if语句一个if语句
- 前言环境: flutter sdk v1.7.8+hotfix.3@stable对应 flutter engine: 54ad777f这里关
- 背景在接口请求过程中,传递json对象,springboot转换为实体VO对象后,所有属性都为null。post请求:后台接收请求:当时就懵
- 一、目的本篇文章的目的是记录本人使用flutter加载与调用第三方aar包。二、背景本人go后端,业余时间喜欢玩玩flutter。一直有一个