【发布时间】: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存在未公开的安全问题。但如果是这种情况,她应该报告。