【问题标题】:Scanner Safety Reading User Input扫描仪安全读取用户输入
【发布时间】:2019-07-24 17:51:14
【问题描述】:

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

我曾经与某人交谈过,他说如果我使用 Scanner 类,他们很容易破坏我的程序。那一刻,我并没有给她太多压力,但它让我思考:在读取用户输入(字符串、整数等)时,我需要建立多少保护?

她所指的攻击类型的几个示例:输入太长而无法实际保存字符串(超过约 20 亿个字符,并且没有 \n),从而导致异常。如果要求名称,请输入数值。甚至可能会破坏扫描仪并以更复杂的方式强制其进入未定义的行为?

我正在考虑一种防止这种情况的方法,方法是在 Scanner.nextLine() 周围进行 try-catch 以防止输入太长,或者甚至可能逐个读取字符并确保它符合我的需要(尽管我发现 hasNext() 并不能真正用于用户输入,只能用于文件读取)。

我真正要问的是:防止有人故意尝试破坏您的扫描仪并导致异常或“未定义行为”的最佳方法是什么?扫描仪真的是最好的工具吗?在牢记恶意人员时,您是否更喜欢其他课程?

【问题讨论】:

  • 您无法控制用户输入的内容,但您为什么认为Scanner 类有问题?请edit 您的问题包含一个输入示例,该示例与Scanner 类有关。
  • 当然Scanner 遇到意外输入时会抛出异常——当调用nextInt() 并且用户输入'blah' 时它还应该做什么。您的职责是确保您处理应用程序中预期会正常发生的错误(“无效输入:'blah'”)或正常退出并在错误意外时通知用户。程序崩溃(通常)不是安全问题。每个软件都会不时崩溃。
  • Scanner 与整个 Java 生态系统一样安全——它可能像宇宙中的任何其他软件一样存在一些尚未公开的安全问题。但它背后也有大量人员来修复报告的错误并进行安全测试。
  • 另一方面,处理用户输入是完全不同的野兽。但我不确定你是否问过这个问题。
  • 回到安全问题 - 您的同事极不可能发现 Scanner 存在未公开的安全问题。但如果是这种情况,她应该报告。

标签: java java.util.scanner


【解决方案1】:

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

我认为 try-catch 会解决你所有的问题。 所有尝试都会捕获超过 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();}

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();}

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

再见。我希望你这个答案不错。 :)

【讨论】:

  • 第一个示例包含错字。第二个例子不起作用。
  • 您好 user207421!感谢您的评论。我重新检查了第二个,它工作!哇。我不知道为什么它在你的电脑上不起作用。对不起。并且,请教我错字在哪里。对糟糕的英语感到抱歉:)
  • 对不起,答案没有帮助。我特别说我问的是在控制台上读取用户输入,而不是从文件中读取。我赞成你的回答,无论如何都要取消 -1。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多