全部,
我编写了一个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通常会照顾它?
谢谢,
答案 0 :(得分:2)
理论上,有人可能会通过提供极长的输入线来使您的应用程序崩溃。
在实践中,不值得担心:
拒绝服务是微不足道的。如果您的程序崩溃,它对系统没有任何重要影响。 “攻击者”会对看到堆栈痕迹感到满意......但这就是损坏的限制。
“攻击”仅适用于可以运行程序的人员。如果他们能够做到这一点,他们可以采取更多糟糕的措施来“拒绝服务”。
由于攻击没有合理的影响,IMO不值得防范。但是如果 希望防范它,那么将每行预读为StringBuffer
,一次读取一个字符并丢弃字符是一件简单的事情。比你认为合适的时间长。
请注意,只需键入一个很长的输入行就无法完成这种特殊的“攻击”。典型的命令shell(或控制台程序或“tty”驱动程序)在一行的长度上限制为几千个字符。 “坏人”需要重定向标准输入以获得更长的输入行。 (这并不难......)
在某些情况下,超长线可能是一个可行的DOS攻击......但不是在这里。
答案 1 :(得分:1)
如果您担心某人为该计划提供了很长的支持,并且您使用了nextLine,那么您已经输了:
正如您在Javadoc中所看到的那样:
由于此方法继续搜索输入以查找行分隔符,因此如果没有行分隔符,它可以缓冲搜索要跳过的行的所有输入。
另外,两次调用nextLine不会得到相同的结果。存储返回值并检查。
存储返回值不会分配更多存储空间,因为它只是存储对字符串的另一个引用。 nextLine在准备返回值时已经分配了该存储。如果您确实希望确保不分配非常长的字符串,则需要将System.in中的字节读取为预定大小的数组(使用read()方法)。这比使用Scanner.nextLine要困难一些。考虑一下真的是否需要这种级别的检查。