赞
踩
catch(IOException e) {
System.out.println(“Invalid file”);
// System.out.println(“Error code: 0001”);
return;
}
严重性中,可能性低。
(1) 重排逻辑,使得产生异常的代码在改变对象状态的代码之前执行;
catch(Exception e) {
// revert
money -= PADDING;
return -1;
}
(2) 在出现异常导致操作失败的情况下,使用事务回滚机制;
(3) 在对象的临时拷贝上执行操作,成功后再提交给正式的对象;
(4) 回避修改对象的需求,尽量不去修改对象。
I/O 操作
=======
编码规则:可写的文件不可执行,可执行的文件不可写。
严重性低,可能性高。
Java 垃圾回收器回自动释放内存资源,非内存资源需要开发人员手动释放,比如 DataBase,Files,Sockets,Streams,Synchronization 等资源的释放。
try {
Connection conn = getConnection();
Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sqlQuery);
processResults(resultSet);
} catch(SQLException e) {
// forward to handler
} finally {
if (null != conn) {
conn.close();
}
}
严重性中,可能性中。
(1) 自动清除:
File tempFile = Files.createTempFile(“tempname”, “.tmp”);
try {
BufferedWriter writer = Files.newBufferedWriter(tempFile.toPath(),
StandardCharsets.UTF_8, StandardOpenOption.DELETE_ON_CLOSE)
// operate the file
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
(2) 手动清除。
严重性中,可能性中。
wrap、duplicate 创建的 buffer 应该以只读或拷贝的方式返回:
Charbuffer buffer;
public Duplicator() {
buffer = CharBuffer.allocate(10);
}
/** 获取只读的 Buffer */
public CharBuffer getBufferCopy() {
return buffer.asReadOnlyBuffer();
}
严重性中,可能性高。
(1) 校验用户可控的参数(推荐白名单);
(2) 文件路径保存到数据库,让用户提交文件对应的 ID 去下载文件:
<%
String filePath = getFilePath(request.getParameter(“id”));
download(filePath);
%>
(3) 判断目录和文件名:
if(!“/somedir/”.equals(filePath) || !“jpg”.equals(fileType)) {
…
return -1;
}
(4) 下载文件前做权限判断。
补充:禁止将敏感文件(如日志文件、配置文件、数据库文件等)存放在 web 内容目录下。
严重性高,可能性中。
在服务器端用白名单方式过滤文件类型,使用随机数改写文件名和文件路径。
if(!ESAPI.validator().isValidFileName(
“upload”, filename, allowedExtensions, false)) {
throw new ValidationUploadException(“upload error”);
}
补充:如果使用第三方编辑器,请及时更新版本。
序列化/反序列化操作
==========
编码原则:不信任原则。
严重性高,可能性低。
使用 transient、serialPersistentFields 标注敏感数据:
private static final ObjectStreamField[] serialPersistentFields = {
new ObjectStreamField(“name”, String.class),
new ObjectStreamField(“age”, Integer.TYPE)
}
当然,正确加密的敏感数据可以序列化。
严重性高,可能性低。
如果一个类的构造方法中含有各种安全管理器的检查,在反序列化时也要进行检查:
private void writeObject(ObjectOutputStream out) throws IOException {
performSecurityManagerChek();
out.writeObject(xxx);
}
补充:第三方组件造成的反序列化漏洞可通过更新升级组件解决;
禁止 JVM 执行外部命令,可减小序列化漏洞造成的危害。
运行环境
====
编码原则:攻击面最小化原则。
严重性中,可能性低。
启用 Java 字节码验证:Java -Xverify:all ApplicationName
严重性高,可能性低。
(1) 生产环境中安装默认的安全管理器,并且不要使用 -agentlib,-Xrunjdwp 和 -Xdebug 命令行参数:
${JAVA_HOME}/bin/java -Djava.security.manager ApplicationName
(2) iptables 中关闭相应 jdwp 对外访问的端口。
严重性中,可能性中。
移除项目中多余的 main 方法。
业务逻辑
====
编码原则:安全设计 API。
过程如下:
(1) identification <-- 宣称用户身份(鉴定提供唯一性)||–> (2) authentication <-- 验证用户身份(验证提供有效性)||–> (3) authorization <-- 授权访问相关资源(授权提供访问控制)||–> RESOURCE||–> (4) accountability <-- 日志追溯
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-jk5pBED1-1712721485008)]
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
[外链图片转存中…(img-iFjTMunV-1712721485009)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Cfs1y276-1712721485009)]
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。