Java 开发安全规范.docx

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java 开发安全规范

Java 开发安全规范目 录一. 安全隐患11.1 ProcessBuilder注入允许攻击者执行代码11.2 确保public和static字段被定义为final11.3 包含敏感调用的方法应标记为final21.4 执行数据库查询前设置查询类型31.5 实现Serializable接口时没有定制序列化协议31.6 限制特权代码的可访问性41.7 确保SecurityManager权限检查的完整性61.8 避免在public方法中返回private内部数据81.9 避免危险的public static final数组声明8二. 环境配置92.1 不要将多类URL映射到同一个Servlet92.2 不要在配置文件中存放敏感信息92.3 确保Servlet有名字并正确配置102.4 限制字段最大长度避免DoS或注入攻击11三. 代码质量123.1 谨慎使用Thread.yield()方法123.2 使用notifyAll方法替代notify133.3 避免使用Thread的stop方法133.4 重新抛出ThreadDeath异常133.5 确保锁在发生异常时被正确释放143.6 避免在获取锁后调用sleep方法163.7 避免在finally块中抛出异常16四. 安全特性174.1 确保密码学加密算法密钥强度174.2 避免使用过时的加密算法174.3 避免使用不安全的填充(Padding)模式174.4 避免使用弱初始化向量(Initialization Vector)174.5 不要依赖isSecure()方法来决定是否传递敏感信息184.6 在敏感信息不再需要时显式清除它18安全隐患ProcessBuilder注入允许攻击者执行代码与Runtime类相似,如果ProcessBuilder对象根据不可信输入被构造,则有可能被攻击者用来进行命令注入攻击。错误的用法:public static void execUsingCommand(String command) throws Exception {String[] args = new String[] { cmd, /c, dir + command };Process process = new ProcessBuilder().command(args).start();InputStream is = process.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String line;while ((line = br.readLine()) != null) { System.out.println(line); }}在上述代码中,如果command参数来自不可信输入,如网页请求参数或请求URL,则代码存在命令注入漏洞。攻击者可以通过构造一个恶意输入,例如“/home/user rm /app/config”,通过命令行同时执行多条命令。正确的做法是永远不要使用不可信输入构造ProcessBuilder对象,可以通过预定义可能的命令行列表,并根据用户输入来选择执行。确保public和static字段被定义为final如果一个public和static的字段,没有被定义为final,则不受信任的代码有可能通过修改此字段,影响对象的状态,造成潜在的攻击可能性。错误的用法:public class MyClass{ public static int counter = 123; //...}正确的用法:public class MyClass{ public static final int counter = 123; //...}包含敏感调用的方法应标记为final如果一个class没有被标记为final,那么他的所有方法都可以被重载(override)。如果它的一个方法调用了SecurityManager进行特权检查或其他敏感操作,例如AccessController.doPrivileged等,则应确保此方法被标记为final,否则可能被恶意使用者通过重载此方法,跳过预设的检测逻辑。错误的用法:public class BadSecurityCheck {private int id;public BadSecurityCheck() {securityCheck();id = 1;}protected void doSecurityCheck() {SecurityManager sm = System.getSecurityManager();if (sm != null)

文档评论(0)

zhuwenmeijiale + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档