24H免费课程咨询  TEL:13401595960   QQ:1870218756  微信:13401595960(李老师)

东方博宜

网站首页 > 软件开发资讯 > Java开发

JavaWEB项目中的安全问题

2017-05-24 08:58:47 东方博宜 阅读

1.弱口令漏洞

解决方案:最好使用至少6位的数字、字母及特殊字符组合作为密码。数据库不要存储明文密码,应存储MD5加密后的密文,由于目前普通的MD5加密已经可以被破解,最好可以多重MD5加密。

 

2.未使用用户名及密码登录后台可直接输入后台URL登录系统。

解决方案:通过配置filter来过滤掉无效用户的连接请求。

timg (2).jpg

3.JSP页面抛出的异常可能暴露程序信息。有经验的入侵者,可以从JSP程序的异常中获取很多信息,比如程序的部分架构、程序的物理路径、SQL注入爆出来的信息等。

 

解决方案:自定义一个Exception,将异常信息包装起来不要抛到页面上。

 

4.合法用户“注销”后,在未关闭浏览器的情况下,点击浏览器“后退”按钮,可从本地页面缓存中读取数据,绕过了服务端filter过滤。

解决方案:配置filter对存放敏感信息的页面限制页面缓存。如:

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

httpResponse.setHeader("Cache-Control","no-cache");   

httpResponse.setHeader("Cache-Control","no-store");  

httpResponse.setDateHeader("Expires", 0);  

httpResponse.setHeader("Pragma","no-cache");  

 

5.SQL注入漏洞。

 

解决方案:在数据库访问层中不要使用“+”来拼接SQL语句!如:

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

String sql= “SELECT * FROM USERS WHERE 1=1”;  

if(null != user.getUserName() && !””.equals(user.getUserName())){  

    sql += “ and UNAME = ‘”+user.getUserName()+”’”;  

}  

而应使用PreparedStatement。如:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

PreparedStatement pstmt = con.prepareStatement("SELECT * FROM USERS WHERE UNAME=?");  

pstmt.setString(1, “Neeke”);  

冒号后面是一个named parameter,我们可以使用Query接口将一个参数绑定到name参数上:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

List result = session.createQuery(queryString)  

                  .setString("name", user.getUserName())  

                  .list();  

6.文件上传漏洞。前台仅使用JS对文件后缀做了过滤,这只能针对普通的用户,而恶意攻击者完全可以修改表单去掉JS校验。

 

解决方案:前台JS过滤加服务器端程序过滤。具体过滤掉哪些文件类型视具体情况而定。

 

7.可执行脚本漏洞。对用户提交的数据未转义,一些用户提交的含有JavaScript脚本的信息被直接输出到页面中从而被浏览器执行。

 

解决方案:使用org.apache.commons.lang.StringEscapeUtils对用户提交的数据进行转义。如:

 

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

@RequestMapping(params="method=addTopic",method=RequestMethod.POST)  

public ModelAndView addTopic(HttpServletRequest request, HttpServletResponse response, BbsTopic topic)  

{  

    BaseAdmin user = (BaseAdmin) request.getSession().getAttribute(Constant.SESSION_USER);  

    topic.setBaseAdmin(user);  

    topic.setTopicDate(new Timestamp(System.currentTimeMillis()));  

    topic.setTopicContent(StringEscapeUtils.escapeHtml(topic.getTopicContent()));  

    topic.setTopicTitle(StringEscapeUtils.escapeHtml(topic.getTopicTitle()));  

    this.bbsTopicService.save(topic);  

    return new ModelAndView(new RedirectView("bbs.do?method=topicList&bfid="+ topic.getBfid()));  

}  

8.Java WEB容器默认配置漏洞。如TOMCAT后台管理漏洞,默认用户名及密码登录后可直接上传war文件获取webshell。

 

解决方案:最好删除,如需要使用它来管理维护,可更改其默认路径,口令及密码。


 

开发的安全标准,总结如下。

 

      1.绝对绝对绝对要采用预处理的方式来进行sql操作,如果实在需要做sql语句的拼接,那么请做输入信息的过滤。selet,update,delete,insert,and,%,',_,这些都屏蔽了吧。

 

      2.一般的sql注入都是从网站的前台网页寻找漏洞,建议针对前台操作和后台操作分别建立数据库操作用户。前台的用户只赋予实际需要的基本权限。后台用户可权限可以宽松些但也只能针对当前库。切不可用root级别的用户作数据库连接。否则数据丢了,你都没地方哭去。

 

      3.用户登录表的密码一定要加密,如果可以也可将用户名一并加密。这是以防万一的最后手段,当对方看你的用户登录表的时候起码看到也不知道是什么。

 

      4.jsp文件集中放到指定的文件夹下,如果你使用struts那么你可以将struts使用的文件放在WEB-INF目录下的某个文件夹中,因为该WEB-INF文件夹网站浏览用户是看不到的。

 

      5.文件上传一定要做类型检查,一些jsp,php,asp等程序文件坚决不能让其上传。如果你用的是linux apache+tomcat 做的jk连接,你可以将文件直接上传到apache目录,或者用ln作软连接,万一对方上传了jsp文件你没判断出来,那么也是传到了apache目录下,你在jk指向中将jsp文件指定到tomcat中某一文件夹,对方在浏览器中是无法访问上传的jsp文件的。

 

      6.日志,建议增加服务的访问日志,记录来访者的IP,传递参数,对后台操作用户建立日志,记录其操作内容。完善的日志记录可以帮助你发现潜在的危险,找到已经发生的问题。

 


Powered by 东方博宜教育咨询江苏有限公司  ©2008-2017 www.czos.cn