java安全编码规范

java安全编码规范

该编码规范是基于借鉴阿里编码规范结合自己总结而来

安全规约

基于用户个人界面或功能必须加权限校验

说明:防止没有做水平权限校验就可以别人的数据,比如查看别人的私信或订单等类容
前后端最好都做校验。修改信息的接口直接暴露在外面是不安全的,需要校验接口调用修改者是不是拥有权限。

用户敏感的数据不能直接展示,需要进行脱敏

例如:用户手机号码137****8868隐藏中间4位,防止隐私泄露。

  1. 也就是view层需要一定的加密,对于网上商城系统甚至对于客服也要对客户的敏感信息进行加密处理。
  2. 数据库的数据需要明文,比如用户登陆的密码需要加密存入数据

用户输入的sql参数要严格使用参数绑定或者METADATA子段限定,防止sql注入,禁止字符串拼接访问数据库

  1. java技术栈里,mybatis框架一进有防依赖注入的措施。
    例如:

select s.name,s.age,s.sex from student s where s.name=#{studentName}
这里#{}代表编译后引用,避免使用${}字符串拼接容易sql注入
并且要使用pereStatament进行预编译,能有效防止sql注入。

拒绝服务

l问题简介

攻击者能够使程序发生冲突或者使合法用户无法获取资源。

l详细描述

攻击者可以通过向应用程序发送大量请求来使得应用程序无法向合法用户提供服务,但是这种洪水攻击(Flooding Attack)通常能在网络层进行防范。更重要的是有的bug使得攻击者可以通过使用少量的请求来让应用程序过载,这类bug使得攻击者可以指定请求所消耗的系统资源数量或者所占用系统资源的时间。

Example 1:下面的代码允许用户指定线程睡眠的时间。攻击者可以通过指定一个巨大的数字来无限期的占用该线程。通过少量的请求,攻击者就能够耗尽应用程序的线程池。

int usrSleepTime =

Integer.parseInt(usrInput); Thread.sleep(usrSleepTime);

Example 2:下面的代码从一个zip文件中读取一个字符串。因为它使用了ReadLine()方法,所以它将读取一个无限制的输入。攻击者可以利用该代码来导致OutOfMemory Exception,或者消耗大量的内存使得程序要耗费更多的时间来进行垃圾回收,又或者在接下来的操作中使得内存溢出。

InputStream zipInput =zipFile.getInputStream(zipEntry);

Reader zipReader = newInputStreamReader(zipInput);

BufferedReader br = newBufferedReader(zipReader);

String line = br.readLine();

l解决方案

拒绝服务攻击是一种滥用资源性的攻击。从程序代码角度讲,对涉及到系统资源的外部数据应该进行严格校验,防止大数目或者无限制的输入。从系统管理的角度来讲,主机应该:

1)关闭不必要的服务;

2)将数据包的连接数从缺省值128或512修改为2048或更大,以加长每次处理数据包队列的长度,以缓解和消化更多数据包的连接;

3)将连接超时时间设置得较短,以保证正常数据包的连接,屏蔽非法攻击包;

4)及时更新系统、安装补丁。此外,还可以对防火墙、路由器进行设置。禁止对主机非开放服务的访问,限制同时打开的数据包最大连接数,访问控制列表(ACL)过滤,设置数据包流量速率,利用负载均衡技术等等。

HTTP响应截断

l问题简介

在HTTP响应头中包含未经验证的数据将可能导致缓存中毒(cache-poisoning)、跨站脚本(cross-site scripting)、跨用户攻击(cross-user defacement)或者页面劫持(page hijacking)攻击。

l详细描述

HTTP响应截断攻击发生在:

1)数据通过一个非可信源进入web应用程序,最可能的是通过HTTP请求。

2)包含在HTTP响应头中发送给web用户的数据没有对恶意字符进行验证。与很多软件安全攻击一样,HTTP响应截断是一种达到目的的手段,它本身并不是目的。起初,这种攻击很简单:攻击者传递恶意数据给有漏洞的应用程序,应用程序将这些数据包含在HTTP响应头中。要想成功地使用该攻击,应用程序必须允许响应头中包含CR(回车,即%0d或者\r)和LF(换行,即%0a或者\n)字符。这些字符不仅使得攻击者可以控制应用程序发送的部分响应头和响应体,还使得攻击者可以创建能够完全控制的HTTP响应。

Example:面的代码段从HTTP请求中读取一篇博客文章的作者名author,然后将它放入HTTP响应的cookie头。

String author =request.getParameter(AUTHOR_PARAM);

Cookie cookie = newCookie(“author”, author);

cookie.setMaxAge(cookieExpiration);

response.addCookie(cookie);

假如在HTTP请求中提交的字符串是由标准的文字和数字字符组成,如“Jane

Smith”,那么HTTP响应中包含的cookie可能是如下形式:

HTTP/1.1 200 OK

Set-Cookie: author=Jane Smith

然而,因为cookie的值是根据未经验证的用户输入生成的,所以只有当提交的Author.Text的值中不包含任何CR和LF字符时,HTTP响应才会是以上形式。如果攻击者提交了一个恶意字符串,比如“WileyHacker\r\nHTTP/1.1200

OK\r\n…”,那么HTTP响应将被分割为如下两个响应:

HTTP/1.1 200 OK

Set-Cookie: author=Wiley Hacker

HTTP/1.1 200 OK

…显然,第二个响应是由攻击者完全控制的,它能够构成任何攻击者想要的响应头和响应体。这种攻击者可以构造任意HTTP响应的能力可以导致各种攻击,包括跨用户攻击、web和浏览器缓存中毒、跨站脚本和页面劫持。跨用户攻击:攻击者可以制作一个专门的请求发给有漏洞的服务端,服务端将会创建两个响应,第二个响应会被误解为是另一个请求的响应,这个请求是由使用同一个TCP连接访问服务端的另一个用户发来的。当攻击者诱使用户自己提交恶意请求时,或者更隐蔽的,当攻击者与用户共用同一个TCP连接到服务端(比如共享的代理服务)时,就可以完成上述攻击。最好的情况下,攻击者可以通过这种攻击使用户认为应用程序已经被修改了,导致用户对应用程序的安全性失去信心。最糟的情况下,攻击者可以模仿应用程序,提供相似的内容,诱使用户将私有信息(如账号和密码)发送给攻击者。跨站脚本:一旦攻击者可以控制应用程序发送的响应,他们就可以选择各种恶意内容来提供给用户。跨站脚本是最常见的攻击,它在用户浏览器上执行响应中包含的恶意JavaScript或者其他代码。基于XSS的攻击种类几乎是无限的,但是它们通常会包括:传送私有数据(如cookies或者其他session信息)给攻击者,将受害者的浏览器重定向到攻击者所控制的web内容中,或者假借有漏洞的站点在用户机器上进行其他恶意操作。针对一个有漏洞的应用程序的用户,最常见的也是最危险的攻击方式是通过JavaScript将session和认证信息发送给攻击者,使得攻击者能够完全控制受害者的账号。页面劫持:除了通过有漏洞的应用程序来发送恶意内容给用户以外,这种攻击还能够将服务端生成的要发送给用户的敏感内容重定向给攻击者。攻击者通过一个请求生成两个响应,一个是服务端原有的响应,一个是攻击者制造的响应。然后攻击者通过一个中间节点,如共享的代理服务,将服务端产生的发给用户的响应指向攻击者。因为攻击者制造的请求产生了两个响应,第一个作为攻击者请求的响应,第二个会保留在响应池中。当用户通过同一个TCP连接提出HTTP请求时,由于攻击者制造的响应已经存在,所以该响应会被当作用户的响应发送给用户。然后攻击者发送第二次请求给服务端,此时代理服务器就会把服务端生成的原本要发给用户的响应当作攻击者的响应发送给攻击者,这样攻击者就能从该响应中获取危及用户安全的敏感信息。

l解决方案

要想进行HTTP响应截断攻击,应用程序必须允许响应头中包含CR(回车,即%0d或者\r)和LF(换行,即%0a或者\n)字符。所以我们可以在数据进入应用程序之前把可能的危险拦截,针对CR和LF字符进行过滤。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值