0

全部,

我编写了一个 java 代码,需要检查用户使用控制台输入的文本,我希望代码测试输入的行不超过例如 20 个字母,我写如下:

String getName() {

boolean badName = true;
String Name = "";
Scanner console = new Scanner(System.in);


while (badName ){
      System.out.println("Please enter your first name ");
          Name = console.nextLine(); 

     //^ I want to check this string length while the user enters the line 
     // to prevent DOS attack when an attacker tries to enter very large line

    if (console.nextLine().length > 20) {
    //^ I tried  this but could not get the string value after this condition validated, 
    // I dont want to store it in a variable to not cause DOS attack.
           System.out.println("please enter valid name!!!");
           continue;
         }

       if (! Name.matches ("[a-zA-Z_]+")) {
          System.out.println("the name contains invalid character, please try again :");
         continue;
       } 
      if (Name.matches ("[a-zA-Z_]+")){
      badName = false;
        }

     }


    return Name;
}

不确定我是否真的需要检查以防止 DOS 攻击,或者 Java 通常会处理这个问题?

谢谢,

4

2 回答 2

2

理论上,有人可以通过提供极长的行作为输入来使您的应用程序崩溃。

在实践中,不必担心:

  • 拒绝服务是微不足道的。如果您的程序崩溃,它不会对系统产生任何影响。“攻击者”会因为看到堆栈跟踪而感到满足……但这就是损害的极限。

  • “攻击”仅适用于可以运行您的程序的人。如果他们能做到这一点,他们可以做很多更糟糕的事情来“拒绝服务”。

由于攻击没有合理的影响,IMO 不值得防御。但是,如果您确实想防御它,那么将每一行预读成 a StringBuffer,一次读取一个字符并在该行比您认为合适的长度时丢弃字符是一件简单的事情。

请注意,这种特殊的“攻击”不能通过简单地输入很长的输入行来完成。典型的命令外壳(或控制台程序,或“tty”驱动程序)的行长限制为几千个字符。“坏人”需要重定向标准输入以获得更长的输入行。(这并不难......)


在某些情况下,超长的行可能是一个可行的 DOS 攻击......但不是这里。

于 2014-10-12T06:18:01.360 回答
1

如果你担心有人给程序喂了很长的一行,而你使用 nextLine 你已经输了:

正如您在Javadoc中看到的:

由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

另外,调用 nextLine 两次不会得到相同的结果。存储返回值并对其进行检查。

存储返回值不会分配更多存储空间,因为它只是存储对字符串的另一个引用。nextLine 在准备返回值时已经分配了该存储空间。如果你真的想确保你不会分配一个很长的字符串,你需要从 System.in 中读取字节到一个预定大小的数组中(使用 read() 方法)。不过,这比仅使用 Scanner.nextLine 要难一些。考虑一下您是否真的需要这种级别的检查。

于 2014-10-12T05:29:00.367 回答