限制缓冲区读取器以防止DoS攻击

时间:2018-08-19 17:04:38

标签: java security

我需要以下代码的帮助。我需要对其进行检查并解决代码中的安全性问题。我看到的问题是BufferReader应该分块读取。这可能会阻止DOS攻击。现在编写代码的方式将读取无限长。我不确定限制BufferReader的最佳方法。我们将不胜感激。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class example {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    // Read the filename from the command line argument
    String filename = args[0];
    BufferedReader inputStream = null;

    String fileLine;
    try {
        inputStream = new BufferedReader(new FileReader(filename));

        System.out.println("Email Addresses:");
        // Read one Line using BufferedReader
        while ((fileLine = inputStream.readLine()) != null) {
            System.out.println(fileLine);
        }
    } catch (IOException io) {
        System.out.println("File IO exception" + io.getMessage());
    } finally {
        // Need another catch for closing 
        // the streams          
        try {
            if (inputStream != null) {
                inputStream.close();
            }
        } catch (IOException io) {
            System.out.println("Issue closing the Files" + io.getMessage());
        }

    }
}

}

1 个答案:

答案 0 :(得分:0)

关于BufferedReader.readLine的警告后面的要求是对一个对手可能导致一次分配的最大内存量施加合理的限制。在这种情况下,重要的用法是String字符的大小,并在用于创建它的缓冲区中大致相同。如果对手可以一次执行多次,那么这也将受到限制。通常,如果资源可以停止但不能关闭(例如,通过网络文件系统),则可以将缓冲区无限期地保存在内存中。

一种简单而通用的解决方案是实现一个InputStream,以限制可以通过它读取的字节总数。这也可以在限制字符数的Reader级别上实现。肮脏的方法是忽略BufferedReader并读取char数组,然后自己组合成StringBuilder

大概各种第三方库都包含涵盖这些方法的代码。

(也:请使用try-with-resource。FileReader会选择保留为默认值的任何字符编码,这可能是错误的。将throws IOException添加到main会使更简单。)