常见的JavaWeb安全问题及修复

1.SQL注入:程序向后台数据库传递SQL时,用户提交的数据直接拼接到SQL语句中并执行,从而导入SQL注入攻击。php

字符型注入:黑色部分为拼接的问题参数html

select * from t_user where name='test' or '1' = '1';

数字型注入:黑色部分为拼接的问题参数(对于强类型语言,字符串转int类型会抛异常。因此这种注入方式通常出如今php等弱类型语言上)前端

select * from t_user where id=1;drop table t_userinfo;

搜索型注入:对表名进行猜想web

select * from t_user where userName like%test%’ and 1=2 union select 1,2 from t_admin';

修复方法:正则表达式

a、在mybatis中使用#把参数当作一个字符串,不能使用$符号sql

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);

二、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,"&amp;"); 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; } };

三、敏感信息泄露

程序形成的泄露:

  一、服务端返回冗余敏感数据:用户只申请了单个帐户的信息,却返回了多个用户的信息

  二、将敏感信息直接写在前端页面的注释中

  三、写在配置文件的密码未进行编码处理

  四、请求参数敏感信息未脱敏处理(能够将数据在前端用RSA加密,后台在进行解密)

  五、前端展现的敏感信息,没有在后台进行脱敏处理(后台对数据进行处理,能够将中间部分使用*号代替)

  六、越权

四、越权:攻击者可以执行自己没有资格执行的权限

  水平越权:权限类型不变,权限Id变化(同等角色下的用户,不但可以访问本身私有的数据,还能访问其余人私有的数据)

  垂直越权:权限ID不变,权限类型变化(即低权限的角色经过一些途径,得到高权限的能力)

  交叉越权:上面二者的交集

修复方法:

  一、根据请求携带的用户信息进行鉴权操做,对当前请求携带的用户信息进行用户角色和数据权限匹配。每个重要操做的功能、分步操做的每一个阶段都进行权限判断。权限不足就中断操做。

五、文件下载:

任意文件下载:下载服务器的任意文件,web业务的代码,服务器和系统的具体配置信息,也能够下载数据库的配置信息,以及对内网的信息探测等等

文件越权下载:

修复方法:

一、针对任意文件下载的修复,增长当前请求下载的文件上一级的绝对路径同配置文件中容许下载的路径直接的比较(file.getCanonicalFile().getParent()获取上一级的绝对路径)

if(!file.getCanonicalFile().getParent().equals(new File(Constants.TMP_PATH).getCanonicalPath())){ return ; }

二、文件越权下载:容许下载以前对请求所带的用户信息进行判断,拥有足够的权限菜容许下载。

六、文件上传:网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件能够是木马,病毒,恶意脚本或者WebShell等。

修复方法:

一、客户端、服务端白名单验证(不建议用黑名单),客户端的校验不够安全,很容易被绕过。

String fileName = file.getOriginalFilename(); String extName = fileName.subString(fileName.lastIndexof(".")+1);

获取上传文件的后缀名,并同白名单上的后缀名进行比较,包含在白名单上则容许经过,不包含则直接中断请求。

二、MiME类型检测:文件上传时浏览器会在Header中添加MIMETYPE识别文件类型,服务端要对此进行检测。

String mime = file.getContentType();//获取文件的ContentType类型值

同白名单上的contentType类型名进行比较,包含在白名单上则容许经过,不包含则直接中断请求。

三、文件内容检测:用不一样的方法将不一样的文件内容流的进行读取。

BufferedImage image = ImageIO.read(file.getInputStream());

七、CSRF:跨站请求伪造,完成CSRF攻击,须要完成两个步骤:一、登陆受信任的网站A,并在本地生成cookie;二、在不登出A的状况下,访问危险网站B

CSRF本质缘由:Web的隐式身份验证机制。Web的身份验证机制虽然能够保证请求来自用户的浏览器,可是没法保证该请求时用户批准发送的。

修复方法:

CSRF Token校验:在页面中添加一个hidden用于存放token字段,请求发送时携带token到服务端,服务端校验token值是否准确。不许确直接中断操做

相关文章
相关标签/搜索