Java安全编码规范

SQL Injectioin防范

ibatis框架
先看一段ibatis的xml配置

<select id="queryByAccountId" parameterClass="java.util.Map" resultMap="ApplicationInstanceResult">

    SELECT * FROM product where account_id = $accountId$

</select>

以上的sql中存在一个问题
$accountId$是变量替换的形式, 容易引入sql注入, 例如$accountId$是前台用户输入的"‘;select * from admin--", 那么数据库端就会执行两个sql, 所以需要改成#accountId#, 进行预编译处理
修改后的配置如下:

<select id="queryByAccountId" parameterClass="java.util.Map" resultMap="ApplicationInstanceResult">

    SELECT * FROM product where account_id = #accountId#

</select>

再看一段ibatis的xml配置

<select id="queryByAccountId" parameterClass="java.util.Map" resultMap="ApplicationInstanceResult">

    SELECT * FROM product where account_id = #accountId# ORDER BY $columnName$ $sortType$ LIMIT #start#, #rowNum#

</select>

可能由于某种需要搜索结果的排序很灵活, sql中有ORDER BY后$columnName$和$sortType$两个变量,在这里没法用变量绑定, 只能用$符号去替换,所以也存在隐患
其实如果这两个变量是程序中指定的, 那么是没有风险的
但是如果这两个变量是web前端选择填入的,那么就可以被利用构造sql注入的value, 就一定存在安全隐患, 碰到这样的情况, 我们需要映入安全开发的ibaits版本

<dependency>

  <groupId>com.alibaba.external</groupId>

  <artifactId>sourceforge.ibatis</artifactId>

  <version>2.3.4.726-patch</version>

</dependency>

然后是我们可以指定$columnName$和$sortType$的元数据类型, 如:$columnName:METADATA$, $sortType:SQLKEYWORD$, 这样ibatis就会做检查, 杜绝风险.
修改后的配置如下:

<select id="queryByAccountId" parameterClass="java.util.Map" resultMap="ApplicationInstanceResult">

    SELECT * FROM product where account_id = #accountId# ORDER BY $columnName:METADATA$ $sortType:SQLKEYWORD$ LIMIT #start#, #rowNum#

</select>

其他框架
禁止sql拼接生成, 必须使用变量绑定.
如使用spring jdbcTempalte的一段代码:

String insert = "insert into spacemapping (oldspaceid,oldspacekey,newspaceid,newspacekey) values (?,?,?,?)";

jdbcTemplate.batchUpdate(insert, new BatchPreparedStatementSetter() {

    public void setValues(PreparedStatement ps, int i) throws SQLException {

        Object[] spaceMapping = spaceMappings.get(i);

        ps.setLong(1, (Long)spaceMapping[0]);

        ps.setString(2, (String)spaceMapping[1]);

        ps.setLong(3, (Long)spaceMapping[2]);

        ps.setString(4, (String)spaceMapping[3]);

    }

    public int getBatchSize() {

        return spaceMappings.size();

    }

});

XSS 防范

攻击者在页面中注入恶意的js或者html代码,从而完全控制用户浏览器
假设一个模板中有以下内容

<table>

  <tr>

    <td>用户名:</td>

    <td>$userName</td>

  </tr>

</table>

假设用户输入的$userName为"<script src=xxx></script>", 那么就插入了恶意脚本的标签, 所以我们先对$userName进行一次html字符的转义处理, 就可以防止.
修改后的代码如下:

<table>

  <tr>

    <td>用户名:</td>

    <td>$stringEscapeUtil.escapeHtml($userName)</td>

  </tr>

</table>

假设模板中有一段构建js的代码,js的功能是同态构建html内容

#foreach ( $node in $nodeList )

   var input = document.createElement("input");

   input.name="$node.name";

   input.value= "$!node.value";

   someForm.appendChild(input);

#end

假设node中数据是用户输入的, 就可以植入js恶意脚本,如:";alert(/alibaba/);"导致安全漏洞, 所以我们就需要对node的数据输出时进行一次js字符的转义处理, 修改后的代码如下:

#foreach ( $node in $nodeList )

   var input = document.createElement("input");

   input.name = "$stringEscapeUtil.escapeJavaScript($node.name)";

   input.value = "$stringEscapeUtil.escapeJavaScript($!node.value)";

   someForm.appendChild(input);

#end

webx的template service plugins配置

<plugins>

                <vm-plugins:escape-support defaultEscape="html">

                    <vm-plugins:noescape>

                        <vm-plugins:if-matches pattern="^control\." />

                        <vm-plugins:if-matches pattern="^screen_placeholder" />

                        <vm-plugins:if-matches pattern="^stringEscapeUtil\.escape" />

                        <vm-plugins:if-matches pattern="^csrfToken\.(get)?(\w*)hiddenField" />

                        <vm-plugins:if-matches pattern="^tree" />

                    </vm-plugins:noescape>

                </vm-plugins:escape-support>

            </plugins>

加了这段配置,velocity进行模板渲染时会把所有的变量中内容进行html转义, noescape定义了不需要进行html转义的变量名表达式, 例如:<vm-plugins:if-matches pattern="^tree" />表明$tree这个变量不需要进行html转义
我们要求所有使用webx3框架的应用,都需要加入这段配置,在vm模板中输出js字符串,都需要显示的调用$stringEscapeUtil.escapeJavaScript($someString)

另外在pipeline.xml中替换webx框架的RenderResultAsJsonValve,如下配置:

<when>

                    <!-- 创建JSON,无模板,无layout。 -->

                    <pl-conditions:target-extension-condition extension="json" />

                    <performAction />

                    <performScreen />

                    <valve class="com.aliyun.console.common.web.valve.AliyunRenderResultAsJsonValve" />

                </when>

用以json请求或其他ajax请求输出时的js标签安全转义

CSRF 防范

集团防御CSRF方案是采用随机字符串CSRF_TOKEN, 使用的准则是:所有涉及到数据增删改的操作必须只允许使用POST方式提交,并且在提交的数据中要包括CSRF_TOKEN, 服务端收到请求后对CSRF_TOKEN进行校验,决定是否接受请求.

TODO WEBX3默认方案?

Access Control

业务逻辑中权限控制, 对数据库任何操作都需要做身份认证,特别是UPDATE、 DELETE、INSERT的时候更需要注意.
actioin里取得当前登录用户的session信息, 从session中取得当前用户loginId,根据loginId及被操作数据的ower对比结果,进行数据更新,删除.
另外也可以在sql里增加判断条件来控制,如在where条件中增加login_id=‘xxx‘

File upload

当应用允许用户上传文件时, 应用必须在服务端对文件类型进行检查, 在安全部门规定的白名单类型下, 才允许上传. 文件上传存放目录必须是不具有执行环境的独立存储,不能将文件放在应用目录下。需要保存到专门的文件存储服务器上, 如盘古.
应用必须明确允许上传的文件类型,程序必须要根据白名单在服务器端进行检测。其中严禁上传的文件类型有:exe,txt,html,php
对于上传的图片, 我们需对其进行重格式化, 可以去掉多余的meta信息
对于上传的其他文件, 进行病毒扫描.
另外我们必须对上传的文件大小进行限制, webx3的upload service配置如下:<services:upload sizeMax="5M" />

URL redirect

Web应用程序接收到用户提交的URL参数后,没有对参数做"可信任URL"的验证,就向用户浏览器返回跳转到该URL的指令。
如果alibaba.com下的某个web应用程序存在这个漏洞,恶意攻击者可以发送给用户一个alibaba.com的链接,但是用户打开后,却来到钓鱼网站页面,将会导致用户被钓鱼攻击,账号被盗,或账号相关财产被盗.

故我们只信任集团相关公司的url, 可以使用fasttexst提供的工具类进行检查, 如:
Boolean inWhiteList =  CheckSafeUrl.getDefaultInstance().inWhiteList(URL);
检查在白名单内的,我们执行跳转, 否则定向到错误页面

Cookie

防止cookie中用户的敏感信息泄漏, 我们需要对cookie进行高强度的加密, 同时将设置httpOnly的属性.
webx3中sessionStore的配置如下:

<session-stores:single-valued-cookie-store id="xxxCookieStore" >

    <session-stores:cookie name="xxx" httpOnly="true" />

    <session-stores:encoders>

        <session-value-encoders:simple-value-encoder charset="UTF-8"/>

    </session-stores:encoders>

</session-stores:single-valued-cookie-store>

这里配置的encoders不能满足我们的安全要求,我们可以实现一个高强度的加解密类,替换之.

Java安全编码规范

时间: 2024-10-15 10:53:07

Java安全编码规范的相关文章

Java Script 编码规范

Java Script 编码规范 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 参考规范 ECMAScript 5.1 注解版 EcmaScript 语言规范, 5.1 版 基本原则: 无论有多少人在维护,所有在代码仓库中的代码理应看起来像同一个人写的. 前言 下面的章节描述的是一个 合理 的现代 JavaScript 开发风格指南,并非硬性规定.其想送出的核心理念是高度统一的代码风格(the law of code style consiste

【原】JAVA SE编码规范

/* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * 4.包名都使用小写,比如:cn.yeah.com.ali.com.baidu.... * 5.类名.接口名的命名: * 1)名称中只有一个单词的,首字母大写,比如:Hello.Person.... * 2)名称中有多个单词的,每个单词的首字母都大写,比如:HelloWorld.TestPerson....

Java权威编码规范

一.编程规约 (一) 命名规约 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _nam / __name / $Object / name_  / name$ / Object$2. [强制] 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式. 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义.注意,即使纯拼音命名方式也要避免采用. 反例: DaZhePromotion [打折] / getPingfenByName

Java的编码规范具体要求

? 包package:包名采用完整的英文描述符,全部小写字母组成,package java.awt.event ? 类class和接口interface:类名采用完整的英文描述符,所有单词的第一个字母均大写,class MyFirstClass ? 组件/部件(Component):使用完整的英文描述来说明组件的用途,末端应接上组件类型 ? 异常(Exception):通常采用字母e表示异常的实例 ? 变量variable和方法method:采用完整的英文描述,第一个单词全部小写,后面任何单词的

【java】java基本编码规范

原文地址:https://www.cnblogs.com/marcohorse/p/8267751.html

Java编码规范(华为)

Document number 文档编号 Confidentiality level 密级 内部公开 Document version 文档版本 Total 29 pages 共 29 页 V1.00 Java语言编码规范 Prepared by 拟制 Date 日期 yyyy-mm-dd Reviewed by 评审人 Date 日期 yyyy-mm-dd Approved by 批准 Date 日期 yyyy-mm-dd Revision Record 修订记录 Date 日期 Revisi

JavaEE程序编码规范

目   录 JAVA程序编码规范1 1变量的命名规则1 1.1常量(包含静态的)1 1.2类变量(静态变量)及实例变量1 1.3局部变量1 1.4参数2 1.5其它2 2方法的命名规则3 3类及接口的命名规则3 3.1一般类名3 3.2值对象3 3.3Action3 3.4MyBatis配置文件4 3.5DAO4 3.6Application Service4 3.7工具类4 3.8门面类4 3.9代理类4 3.10异常类4 3.11接口类5 3.12接口实现类5 4作用域5 4.1类的作用域5

[转]JavaScript程序编码规范

原文:http://javascript.crockford.com/code.html 作者:Douglas Crockford 译文:http://www.yeeyan.com/articles/view/cloudwater/4042 译者:cloudwater 更新:2009-12-13 01:08:29 这是一套适用于JavaScript程序的编码规范.它基于Sun的Java程序编码规范.但进行了大幅度的修改, 因为JavaScript不是Java. 软件的长期价值直接源于其编码质量.

java编码规范

右括号") "与其后面的关键字之间,关键字与其后面的左括号"("或"{"之间,以及"}"与"{"之间,要以一个空格隔开:除". "外,所有二元操作符的前.后要加空格:在逗号后边加一个空格. 说明: 一个紧跟着括号的关键词应该被空格分开: 空白应该位于参数列表中逗号的后面: 所有的二元运算符,除了".",应该使用空格将之与操作数分开.一元操作符和操作数之间不应该加空格,