Java 扫描仪安全读取用户输入

Java 扫描仪安全读取用户输入,java,java.util.scanner,Java,Java.util.scanner,当我使用扫描仪时,特别是当要求用户输入而不是从文本文件中读取时,我无法找到一个关于安全性或缺乏安全性的好的总结。我知道在C语言中,读取用户输入有很多危险,我们需要时刻警惕缓冲区溢出之类的事情 我曾经和一个人交谈过,他说如果我使用Scanner类,他们很容易破坏我的程序。当时,我并没有给她施加太多压力,但这让我思考:在读取用户输入字符串、整数等时,我需要内置多少保护 她所指的攻击类型的几个示例:输入太长,字符串实际上无法容纳约20亿个字符,并且没有\n,因此导致异常。如果询问姓名,则在中输入数值。

当我使用扫描仪时,特别是当要求用户输入而不是从文本文件中读取时,我无法找到一个关于安全性或缺乏安全性的好的总结。我知道在C语言中,读取用户输入有很多危险,我们需要时刻警惕缓冲区溢出之类的事情

我曾经和一个人交谈过,他说如果我使用Scanner类,他们很容易破坏我的程序。当时,我并没有给她施加太多压力,但这让我思考:在读取用户输入字符串、整数等时,我需要内置多少保护

她所指的攻击类型的几个示例:输入太长,字符串实际上无法容纳约20亿个字符,并且没有\n,因此导致异常。如果询问姓名,则在中输入数值。甚至可能破坏扫描仪,以更复杂的方式迫使其进入未定义的行为

我在想一种防止这种情况发生的方法,就是在Scanner.nextLine周围安装一个try catch,以防止输入太长,或者甚至可以逐个字符读取,并确保它符合我的需要,尽管我发现hasNext实际上不适用于用户输入,只适用于文件读取


我真正想问的是:防止有人故意破坏你的扫描仪并导致异常或未定义行为的最佳方法是什么?扫描仪真的是最好的工具吗?当你记住恶意的人时,还有其他你喜欢的课程吗?

对不起我的英语。我只是想帮忙:

我想试抓能解决你所有的问题。 所有的尝试都像超过20亿个字符将被捕获。 没问题。哇

但是,还有其他选择。 您可以使用FileReader或FileInputStream。 下面是一个例子

try{//Use FileReader 
    File file = new File("text.txt");
    FileReader file_reader = new FileReader(file);
    int cur = 0;
    while((cur = file_reader.read()) != -1){
        System.out.print((char)cur);
    }
    file_reader.close();
}catch (Exception e) {e.getStackTrace();}

我不知道哪种防守方式好。 但我知道使用FileInputStream很好。它更快


再见。我希望你觉得这个答案不错

第一个示例包含一个输入错误。第二个例子不起作用。你好,用户207421!谢谢你的评论。我重新检查了第二个,它成功了!哇!我不知道为什么它不能在你的电脑上工作。很抱歉还有,请告诉我打字错误在哪里。关于糟糕的英语,我很抱歉:对不起,答案没有帮助。我特别说过,我是在询问如何在控制台上读取用户输入,而不是从文件中读取。我把你的答案改为去掉-1。你不能控制用户输入的内容,但是为什么你认为Scanner类有问题?请将您的问题包括在Scanner类中有问题的输入示例中。当然,如果遇到意外输入,Scanner将抛出异常-当调用nextInt并在“blah”中键入用户时,它还应该做什么。您的职责是确保妥善处理预期会发生的错误无效输入:应用程序中的“blah”或妥善退出,并在出现意外错误时通知用户。程序崩溃通常不是安全问题。每个软件都会时不时地崩溃。Scanner和整个Java生态系统一样安全——它可能和世界上任何其他软件一样存在一些尚未披露的安全问题。但它背后也有大量的人在修复报告的错误并进行安全测试。另一方面,处理用户输入是一个完全不同的问题。但我不确定你是否问过这个问题。回到安全问题上来——你的同事很可能发现扫描仪存在未披露的安全问题。但如果是这种情况,她应该报告。
try {//Use FileInputStream
    String filePath = "text.txt";
    FileInputStream fileStream =  new FileInputStream( filePath );
    byte[ ] readBuffer = new byte[fileStream.available()];
    while (fileStream.read( readBuffer ) != -1){
        System.out.println(new String(readBuffer));
    }
    fileStream.close();
} catch (Exception e) {e.getStackTrace();}