Java控制台输入验证以防止DOS攻击

时间:2014-10-12 05:21:24

标签: java string securestring secure-coding

全部,

我编写了一个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通常会照顾它?

谢谢,

2 个答案:

答案 0 :(得分:2)

理论上,有人可能会通过提供极长的输入线来使您的应用程序崩溃。

在实践中,不值得担心:

  • 拒绝服务是微不足道的。如果您的程序崩溃,它对系统没有任何重要影响。 “攻击者”会对看到堆栈痕迹感到满意......但这就是损坏的限制。

  • “攻击”仅适用于可以运行程序的人员。如果他们能够做到这一点,他们可以采取更多糟糕的措施来“拒绝服务”。

由于攻击没有合理的影响,IMO不值得防范。但是如果 希望防范它,那么将每行预读为StringBuffer,一次读取一个字符并丢弃字符是一件简单的事情。比你认为合适的时间长。

请注意,只需键入一个很长的输入行就无法完成这种特殊的“攻击”。典型的命令shell(或控制台程序或“tty”驱动程序)在一行的长度上限制为几千个字符。 “坏人”需要重定向标准输入以获得更长的输入行。 (这并不难......)


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

答案 1 :(得分:1)

如果您担心某人为该计划提供了很长的支持,并且您使用了nextLine,那么您已经输了:

正如您在Javadoc中所看到的那样:

  

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

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

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