常见JavaWeb安全问题和解决方案

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,"'");
     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(/'/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值是否准确。不准确直接中断操作

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解CentOS安装tomcat并且部署Java Web项目

    1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图: b.因为tomcat的安装依赖于Java jdk,所以我们需要在判断linux系统下面是否安装jdk b.1 使用(Xshell)连接到Linux系统下面 b.2 输入命令:java -version,如果显示jdk版本号,则证明已经安装,如果不显示,则证明没有安装,如果没有安装,请参考下面地址进行安装:http://

  • Java实现基于NIO的多线程Web服务器实例

    代码地址:https://github.com/iyuanyb/webserver 实现了 静态.动态资源获取: Cookie.Session.HTTP 长连接,及 Session 和 HTTP 长连接的定时清除: 类似 Spring MVC 的注解式编程,如 @RequestMapping @RequestParam 等,方法中可以根据参数名从前台获取数据,可以传递对象,也支持级联属性,如: // GET /page?pageSize=10&pageNum=1 HTTP/1.1 @Reques

  • linux(center OS7)安装JDK、tomcat、mysql 搭建java web项目运行环境

    一.安装JDK 1.卸载旧版本或者系统自带的JDK (1)列出所有已安装的JDK rpm -qa | grep jdk (2)卸载不需要的JDK yum -y remove 安装包名称 2.下载并解压JDK (1)下载安装包 进入到/usr/local目录下新建java目录 mkdir java ,在Java目录下使用wget指令下载安装包,如 wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2

  • 使用纯Java实现一个WebSSH项目的示例代码

    最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne.webssh.shellinabox等,这些项目都可以很好地实现webssh的功能,但是最终并没有采用,原因是在于这些底层大都是python写的,需要依赖很多文件,自己用的时候可以使用这种方案,快捷省事,但是做到项目中供用户使用时,总不能要求用户做到服务器中必须包含这些底层依赖,这显然不太合理,

  • JSP学习之Java Web中的安全控制实例详解

    本文实例讲述了JSP学习之Java Web中的安全控制.分享给大家供大家参考.具体如下: 一.目标: ① 掌握登录之后的一般处理过程: ② 能够为每个页面添加安全控制: ③ 能够共享验证代码: ④ 使用过滤器对权限进行验证: ⑤ 能够对文件的局部内容进行验证: ⑥ 掌握安全验证码的基本实现方式: ⑦ 通过异常处理增强安全性. 二.主要内容: ① 通过修改前面的登录功能,分别对管理员和普通用户的登录进行处理: ② 为管理员才能访问的页面添加控制: ③ 共享各个页面中的控制代码,使用专门的文件,然后

  • Java web三件套listener、filter、servelt原理解析

    一.listener.filter.servelt 的执行顺序和生命周期 1.启动顺序 想知道 web 三大件的启动顺序其实只需要查看启动日志就好了,启动顺序为:listener.filter.servelt 2.生命周期 查看结束和运行时候的日志不难发现: 1> listener 的生命周期:一直从程序启动到结束,其中: ServletRequestListener (用来监控 session 的创建,销毁等):每次访问一个 Request 资源前,都会执行 requestInitialize

  • Java web xml文件读取解析方式

    其实解析xml文件有四种方式:DOM,JDOM,DOM4J,SAX. 我们来说与平台无关的两种官方解析方式:DOM 和 SAX 一.DOM 解析 在 Java 代码中,xml 文件是标记型文档,这时用 dom 来解析 xml 文件 dom 会根据 html 的层级结构在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象 DOM 解析步骤: 1.使用 newInstance 方法,创建一个 DocumentBuilderFactory 的对象. 2.创建一个 DocumentBuil

  • centos上安装配置java WEB环境

    趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk 1. 使用Xftp 5把jdk-8u65-linux-x64.tar.gz上传到centos服务器上.   2. 使用语句 tar -zxvf jdk-8u65-linux-x64.tar.gz -C 目的地址(如/usr/java/)   3. 使用语句 vim /etc/profile,添加以下语句     - export JAVA_HOME=/usr

  • 常见JavaWeb安全问题和解决方案

    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;

  • IOS 常见内存泄漏以及解决方案

    IOS 常见内存泄漏以及解决方案 整理了几个内存泄漏的例子,由于转载地址已经找不到了,在这里就不一一列出来了. 1 OC和CF转化出现的内存警告 CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)picDataString,NULL,CFSTR(":/?#[]@!$&'()*+,;="),kCFStringEncodingUTF8); N

  • 详解SimpleDateFormat的线程安全问题与解决方案

    1. 原因 SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String, Date等等, 都是交友Calendar引用来储存的.这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用, 并且, 观察 sdf.parse()

  • Android 常见bug汇总及解决方案

    作为开发人员,平时总会遇到各种各样的问题,之前都没有收集bug的习惯,遇到相同的问题总会有种莫名的熟悉感,或许把问题都汇总,方便查找,也可以给大家踩踩坑,后面会陆续更新补充! 1.关于使用OkHttp运行时出现的错误 报错如下: Static interface methods are only supported starting with Android N (--min-api 24):  okhttp3.Request okhttp3.Authenticator.lambda$stati

  • 详细总结Python常见的安全问题

    一.输入注入 注入攻击非常广泛而且很常见,注入有很多种类,它们影响所有的语言.框架和环境. SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串字面量与变量混合.可以通过https://www.jb51.net/article/187001.htm 这个链接查看 SQL 注入所有可能发生的复杂方式. 命令注入可能在使用 popen.subprocess.os.system 调用一个进程并从变量中获取参数时发生,当调用本地命令时,有人可能会将某些值设置为恶意值. 下面是个简单的脚本

  • 前端常见的安全问题以及防范措施总结大全

    目录 前言 前端安全问题 跨站脚本攻击(XSS) 反射型XSS攻击 基于DOM的XSS攻击 存储型XSS攻击 这几种XSS攻击类型的区别 XSS防范措施 输入过滤 预防存储型和反射型XSS攻击 预防DOM型XSS攻击 ContentSecurityPolicy 其他措施 XSS攻击案例 跨站请求伪造(CSRF) CSRF是怎么攻击的? 常见的CSRF攻击类型 GET类型的CSRF POST类型的CSRF 链接类型的CSRF CSRF的特点 CSRF防范措施 同源检测 CSRFToken 给Coo

  • Java线程安全问题的解决方案

    目录 线程安全问题演示 解决线程安全问题 1.原子类AtomicInteger 2.加锁排队执行 2.1 同步锁synchronized 2.2 可重入锁ReentrantLock 3.线程本地变量ThreadLocal 总结 前言: 线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的.在 Java 中, 解决线程安全问题有以下 3 种手段: 使用线程安全类,比如 AtomicInteger. 加锁

  • PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)

    浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF 前言: 首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围.但是作为一个phper对于安全知识是:"知道有这么一回事,编程时自然有所注意". 目录: 1.php一些安全配置(1)关闭php提示错误功能(2)关闭一些"坏

  • tomcat常见的错误与解决方案小结

    一.tomcat启动时错误 问题1:The JAVA_HOME environment variable is not defined This environment variable is needed to run this program: 解决:没有在tomcat的配置文件.bash_profile中设置环境变量JAVA_HOME,具体设置方法为:加入如下几行: JAVA_HOME=/home/tomcat/j2sdk1.4.2_08(具体值要以实际的jdk安装路径为准) export

  • JS常见内存泄漏及解决方案解析

    内存泄漏? 官方解释:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 通俗点就是指由于疏忽或者错误造成程序未能释放已经不再使用的内存,不再用到的内存却没有及时释放,从而造成内存上的浪费. 避免内存泄漏? 在局部作用域中,等函数执行完毕,变量就没有存在的必要了,垃圾回收机制很亏地做出判断并且回收,但是对于全局变量,很难判断什么时候不用这些变量,无法正常回收:所以,尽量少使用全局变量.在

随机推荐