常见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,"<"); 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值是否准确。不准确直接中断操作
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。