漏洞描述:
Denial of Service 攻击试图让目标用户无法访问计算机或网络资源。如果应用程序存在 Denial Of Service(DoS)漏洞,攻击者就能阻止合法用户访问由该应用程序提供的服务。通过控制网络数据包、编程漏洞、逻辑漏洞或资源处理等漏洞,可以采用多种方式组织合法用户访问服务。攻击者可能通过对应用程序发送大量请求,而使它拒绝对合法用户的服务,但是这种攻击形式经常会在网络层就被排除掉了。导致出现很多问题的原因之一是资源释放不当的 bug,这种 bug 会导致应用程序在运行时停止。
原理、风险及预防:
拒绝服务(Dos)攻击的目的是使得资源(站点、应用程序、服务器)不能实现它预定的设计目的。
如果一项服务收到了大量的请求,那么它可能会停止向合法用户提供。
同样的道理,当程序漏洞被利用时,服务可能会停止或者处理它使用的资源的方式。
Dos攻击严重地降低了合法用户的使用体验。这些攻击会导致大量响应延迟,过度损耗和服务中断,从而直接影响可用性。示例:
修复建议:避免因流无限大,导致的死循环或内存溢出。
反例:
BufferedReader in = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = in.readLine()) != null) {
…
}
解决方案:
思路: 不再使用 readLine() 方法读取,替换为字节读取。
修复前:
try (InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream());
BufferedReader reader = new BufferedReader(inputStreamReader)) {
String line;
while ((line = in.readLine()) != null) {
// 业务处理
System.out.println(line);
}
}
修复后:
int len;
byte[] buffer = new byte[10 * 1024];
try (InputStream is = conn.getInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream()) {
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
byte[] bytes = os.toByteArray();
if (bytes.length > 0) {
String line = new String(bytes, StandardCharsets.UTF_8);
// 业务处理
System.out.println(line);
}
}
整理完毕,完结撒花~