Java web应用中的安全问题整理
密码明文传输
当年初学Java Web时,简单的信息管理系统中,根本没有安全意识。仅仅靠表单的password类型掩盖了密码的表面形象而已。
但是,在实际应用中,这是个大问题,最初也知道这个问题,只是鉴于应用用户较少,而且只能处于内网环境中,就直接忽略了。但是表单中明文传送密码,的确不应该。最简单的方式是密码通过js加密传递到后台,然后Controller校验时直接取数据库中的密文进行匹配。
用户名被猜中
这个问题可能出现在密码校验逻辑中:校验结果的不同分支,返回给页面提示信息不同,密码错误和用户名不存在是两个不同分支中的。这样依一来,居心叵测者就可能通过多次输入并提交而猜中系统中可能存在的用户名。
这一点,Linux用户,Oracle用户,数据表的校验,处理都很高明,能预防敏感信息泄漏。(这点没有考证,初入职场时的入职培训老师讲过这些,印象较深刻,整理本文时就想起这几方面了。如有错误,欢迎指正!)
1 Linux的登录错误提示信息是统一的:用户名或密码错误!
2 文件目录一旦输入错误:统一提示文件或目录不存在的。
3 Oracle数据库查询操作查询时,如果表名称错误,提示信息是表不存在。
文件上传
文件上传最好使用专门的文件服务器,与当前web应用隔离开。如果条件不允许,应该用独于Web应用部署目录之外的目录,这样攻击者就不能通过web服务器内部的目录结构获取用户上传的文件信息了。
其次,对上传的文件的校验,处理页面空间的限制外,后台Controller也许要对对文件进行校验,比如文件名或这文件内容。因为攻击者发送的请求不是通过页面完成的,而是模拟表单请求的话,文件名称就可以是任意的。
所以,后台也应该对用户请求中的上传文件名称进行校验,保证只有系统允许的文件内容才能被处理。
文件下载
凡是涉及到文件下载的地方,应该提高安全意识,编码过程中,校验下载文件名称。应用下载文件的根目录应该是固定的,而且文件名称只能是最终名称,不能包含路径“.”的。
http://xxx/xxxx/download?fileName=./../.././../.././../.././../.././../.././../..//etc/passwd
如果一个文件下载请求中,直接使用用户请求的fileName参数,而不经过任何安全校验的话,那么不法分子就可能通过上述模拟请求下载到Linux服务器的密码文件。
加固措施为:校验文件名称参数,不能是包含路径的文件名称,只能是简单名称或者路径固定,即项目指定存放下载文件的路径。
表单输入校验
不能对用户的输入过于信任,所有的需要用户输入的地方,应该添加验证。例如:用户可以在一个input表单中输入js代码:
<script> alert(new Date());
</script>
- 1
- 2
这就是典型的CRSF,跨站请求伪造;此外,如果一个input输入框里面,用户输入了html标签
</button>
- 1
而后台又没有进行任何拦截处理,那么该表单数据回显的时候,页面就会多一个button按钮了。
解决办法:可以在前端统一对页面的input进行限制不能输入html标签;然后在Controller层使用Filter,对用户输入的请求头域的数据进行预处理,拦截或者过滤输入信息中的有害数据。
重要模块的CRSF
在任何一个登录后的页面上,进入一个敏感数据添加页面如:用户添加页面。输入表单信息之后,将页面源码扒下来,存储htm文件,点击htm文件的表单提交,就可以通过CRSF表单提交数据到指定服务器。
敏感信息的所有操作应该添加token信息,这点我想起了微信工作平台开发API中,所有的操作都是需要Token信息的,那么这里Token的作用应该是一样的,防止攻击者伪造表单请求。
服务器版本信息泄漏
下图404页面,开发过程中经常见到,但是它会对Web应用造成什么威胁呢?
显然,它泄漏Web应用服务器的信息。攻击者在知道应用的服务器信息后,就可能利用对应版本的服务器的漏洞,发起进一步攻击行为。
这个问题主要是web应用的404、500等常见错误页面信息的配置不当导致的。增强安全意识,应该避免使用服务器默认的错误页面信息,在web.xml中增加自定义的错误页面配置信息。
<!-- 配置系统错误显示的页面 -->
<error-page>
<error-code>500</error-code>
<location>/error/500.html</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.html</location>
</error-page>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
启示录
安全是一件大事,如果一点都没有注意的话,我们的Java Web应用是不是分分钟就能被攻击者黑掉呢?
想起以前遇到过iteye这个网站被黑掉添加很多垃圾信息的情况.
树立安全意识,Too simple ! Too dangerous!
上一篇: day5 函数
推荐阅读
-
Java日期时间API系列5-----Jdk7及以前的日期时间类TimeUnit在并发编程中的应用
-
说说Java Web中的Web应用程序|乐字节
-
Asp.net中处理一个站点不同Web应用共享Session的问题
-
Java Web开发过程中登陆模块的验证码的实现方式总结
-
java开发中,一些小的JS应用
-
巧用FileSystem组件实现WEB应用中的本地特定打印
-
asp.net Reporting Service在Web Application中的应用
-
Java中的位运算及简单的算法应用介绍
-
session在PHP大型web应用中的使用
-
Python中SOAP项目的介绍及其在web开发中的应用