【问题标题】:Java console input validation to prevent DOS attackJava 控制台输入验证以防止 DOS 攻击
【发布时间】:2014-10-12 05:21:23
【问题描述】:

全部,

我编写了一个 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 通常会处理这个问题?

谢谢,

【问题讨论】:

  • 嗯...这是什么“DOS”攻击?
  • 拒绝服务攻击
  • 我不认为这可以防止任何攻击,但是您正在扫描输入并将其分配给name,因此当 if 语句尝试执行 `console.nextLine()' 时,它会发现什么都没有。
  • @Hex - 是的,DOS 就是这样,但它也是 Micro$lop 的磁盘操作系统。但是,我不确定 OP 是什么意思。如果他真的是说DOS/DDOS,那就奇怪了。
  • dramzy,这正是我得到的,当尝试检查长度而不存储值时,我丢失了值,我只能读取下一行。

标签: java string securestring secure-coding


【解决方案1】:

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

在实践中,并不值得担心:

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

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

由于攻击没有合理的影响,IMO 不值得防御。但是如果您确实想要防御它,将每一行预读到StringBuffer 中是一件简单的事情,一次读取一个字符,如果该行长于你认为合适。

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


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

【讨论】:

    【解决方案2】:

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

    正如您在Javadoc 中看到的:

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

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

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

    【讨论】:

    • 那是写,我试图找到另一种方法来验证来自控制台的输入,但到目前为止还没有运气:(
    • 添加了更多信息。基本上,如果您不想要不受控制的分配,您应该使用 System.in.read,但这需要更多的工作。或者,也许您可​​以使用扫描仪的 findWithinHorizo​​n 方法,水平 > 0。
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2011-05-26
    • 2023-04-07
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多