常见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,"&lt;");
     s = s.replace(/>/g,"&gt;");
     s = s.replace(/ /g,"&nbsp;");
    s = s.replace(/\'/g,"&#39;");
    s = s.replace(/\"/g,"&quot;");
    return s;
 },
 /*2.用正则表达式实现html解码*/
 htmlDecodeByRegExp:function (str){
    var s = "";
    if(str.length == 0) return "";
    s = str.replace(/&amp;/g,"&");
    s = s.replace(/&lt;/g,"<");
    s = s.replace(/&gt;/g,">");
    s = s.replace(/&nbsp;/g," ");
    s = s.replace(/&#39;/g,"\'");
    s = s.replace(/&quot;/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

标签:Java,Web,安全,问题
0
投稿

猜你喜欢

  • java实现简单扫雷游戏

    2022-09-15 13:48:11
  • java编程下字符串的16位,32位md5加密实现方法

    2023-07-29 21:34:28
  • 教你怎么在IDEA中创建java多模块项目

    2023-05-28 19:25:58
  • C语言 MD5的源码实例详解

    2022-12-22 05:37:16
  • Token登陆验证机制的原理及实现

    2022-07-08 03:28:19
  • 关于mybatis遇到Integer类型的参数时动态sql需要注意条件

    2021-10-13 04:59:39
  • 详解SpringMVC重定向传参数的实现

    2022-09-20 19:01:02
  • Java线程的调度与优先级详解

    2023-04-30 13:48:13
  • Intellij Idea修改代码方法参数自动提示快捷键的操作

    2022-11-19 08:08:37
  • Android Studio 1.2版安装设置图文教程

    2023-01-05 02:49:10
  • Java自定义实现equals()方法过程解析

    2021-10-12 11:21:48
  • Android官方下拉刷新控件SwipeRefreshLayout使用详解

    2021-11-27 16:38:33
  • java实现静默安装apk

    2023-08-31 08:11:34
  • SpringBoot 文件上传和下载的实现源码

    2021-05-28 14:12:46
  • Java中的字节,字符输出流与字节和字符输入流的简单理解

    2022-11-30 01:56:13
  • Android自定义dialog简单实现方法

    2021-07-29 17:10:00
  • SpringBoot添加自定义拦截器的实现代码

    2023-11-26 13:30:54
  • c#获取两个特定字符之间的内容并输出的方法

    2021-12-02 19:47:11
  • C#实现对文件进行加密解密的方法

    2023-05-28 14:02:44
  • java 线程中start方法与run方法的区别详细介绍

    2023-08-23 20:41:31
  • asp之家 软件编程 m.aspxhome.com