华为技术有限公司内部技术规范.docx
《华为技术有限公司内部技术规范.docx》由会员分享,可在线阅读,更多相关《华为技术有限公司内部技术规范.docx(70页珍藏版)》请在文库网上搜索。
1、Java 语言编程规范 下卷 安全篇 仅内部使用2018-5-20 华为技术有限公司 Page 1 of 70华为技术有限公司内部技术规范DKBA 6915-2014.07Java语言编程规范下卷 安全篇华为技术有限公司版权所有 侵权必究Java 语言编程规范 下卷 安全篇 仅内部使用2018-5-20 华为技术有限公司 Page 2 of 70修订声明本规范拟制与解释部门:网络安全能力中心本规范的相关系列规范或文件:Java 语言编程规范 上卷 综合篇 (DKBA1040-2014.07) 、 C/.拒绝已知坏的数据这种策略被称为“黑名单”或者“负向”校验,相对于正向校验,这是一种较弱的校验
2、方式。这种策略比较危险,因为潜在的不合法数据可能是一个不受约束的无限集合。采取这种策略意味着你必须一直维护一个已知不合法字符或者模式的列表。除非对不合法的正则表达式进行日常更新以及定期研究新的攻击方式,否则程序中的校验就会很快过时。public String removeJavascript(String input) Pattern p = Ppile(“javascript“, Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(input); return (!m.matches() ? input : “; “白名单 ”方式净化对数据中任何
3、不属于某个已验证的、合法字符列表的字符进行删除、编码、或者替换,然后后再使用这些净化后的数据。以下给出了一些列子:如果你期望接收一个电话号码,那么你可以剔除掉输入中所有的非数字字符,因此,“(555)123-1234”,“555.123.1234”,与“555“;DROP TABLE USER;-123.1234”全部会被转换成“5551231234”。注意,这里你还需要继续对转换的结果进行校验。正如你所看到的,这样做不仅有利于安全,同时它允许你接收和使用一个更宽泛的有效用户输入。但是,对于一个用户评论栏的文本输入,确定一个合法的数据集合是非常困难的,因为几乎所有的字符都可以被用到。一种解决方
4、案是:将所有非字母数字替换成其编码后的版本,那么“I like your web page!”被净化后将输出为“I+like+your+web+page%21”,这里使用了URL编码。“黑名单 ”方式净化为了确保输入数据是“安全”的,可以剔除或者转换某些字符(例如,删除引号、转换成HTML实体)。跟“黑名单” 校验类似,这种策略需要对不合法字符进行日常维护,并且Java 语言编程规范 下卷 安全篇 仅内部使用2018-5-20 华为技术有限公司 Page 8 of 70不合法字符的范围很难保证是完整的。实际上大部分输入字段都有其特定的语法格式,相对于为了应对当前和未来所有攻击方式而引入一个复杂
5、、迟钝的净化程序,执行一个单纯针对正确输入的正向校验更加简单,高效,与安全。public static String quoteApostrophe(String input)if (input != null)return input.replaceAll(“, “);elsereturn null;规则 1.2 禁止直接使用不可信数据来拼接 SQL 语句说明:SQL注入是指原始SQL查询被动态更改成一个与程序预期完全不同的查询。执行这样一个更改后的查询可能导致信息泄露或者数据被篡改。防止SQL注入的方式主要可以分为两类: 使用参数化查询 对不可信数据进行校验参数化查询是一种简单有效的防止S
6、QL注入的查询方式,应该被优先考虑使用。另外,参数化查询还能改进数据库访问的性能,例如,SQL Server与Oracle数据库会为其缓存一个查询计划,以便在多次重复执行相同的查询语句时重复使用。错误示例(Java 代码动态构建 SQL):Statement stmt = null;ResultSet rs = null;tryString userName = ctx.getAuthenticatedUserName(); /this is a constantString sqlString = “SELECT * FROM t_item WHERE owner=“ + userName
7、+ “ AND itemName=“ + request.getParameter(“itemName“) + “;stmt = connection.createStatement();rs = stmt.executeQuery(sqlString);/ . result set handlingcatch (SQLException se)/ . logging and error handling这里将查询字符串常量与用户输入进行拼接来动态构建SQL查询命令。仅当itemName不包含单引号时,这条查询语句的行为才会是正确的。如果一个攻击者以用户名wiley发起一个请求,并使用以下条目
8、名称参数进行查询:name OR a = a那么这个查询将变成:SELECT * FROM t_item WHERE owner = wiley AND itemname = name OR a=a;此处,额外的OR a=a条件导致整个 WHERE子句的值总为真。那么,这个查询便等价于如下非常简单的查询:SELECT * FROM t_itemJava 语言编程规范 下卷 安全篇 仅内部使用2018-5-20 华为技术有限公司 Page 9 of 70这个简化的查询使得攻击者能够绕过原有的条件限制:这个查询会返回items表中所有储存的条目,而不管它们的所有者是谁,而原本应该只返回属于当前已认
9、证用户的条目。正确示例(使用 PreparedStatement 进行参数化查询):PreparedStatement stmt = nullResultSet rs = nulltryString userName = ctx.getAuthenticatedUserName(); /this is a constantString itemName = request.getParameter(“itemName“);/ .Ensure that the length of userName and itemName is legitimate/ .String sqlString = “
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为技术 有限 公司内部 技术规范