Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何验证命令行参数中的用户输入以获得更高的安全性?_Java_Security_Console_Command Line Arguments - Fatal编程技术网

Java 如何验证命令行参数中的用户输入以获得更高的安全性?

Java 如何验证命令行参数中的用户输入以获得更高的安全性?,java,security,console,command-line-arguments,Java,Security,Console,Command Line Arguments,我通过命令行参数从用户那里获得一个字符串到Java程序 问题是我应该执行什么样的检查来防止可能的攻击和漏洞 我不是安全领域的专家,但据我所知 在C中,用户指定的行太长且处理不当可能导致缓冲区溢出 在PHP中,包含`字符且处理不当的行可能会导致SQL注入 现在我想不出任何具体的字符串格式来应用一些正则表达式进行检查。它可以是任意的,但如果它看起来有害,我想立即退出。字符串可能要通过网络发送到Java服务器,在那里它可能用于SQL查询 if (args.length > 0) {

我通过命令行参数从用户那里获得一个
字符串
Java程序

问题是我应该执行什么样的检查来防止可能的攻击和漏洞

我不是安全领域的专家,但据我所知

  • C中,用户指定的行太长且处理不当可能导致缓冲区溢出
  • PHP中,包含`字符且处理不当的行可能会导致SQL注入
现在我想不出任何具体的
字符串格式来应用一些正则表达式进行检查。它可以是任意的,但如果它看起来有害,我想立即退出。字符串可能要通过网络发送到Java服务器,在那里它可能用于SQL查询

if (args.length > 0) {
    String arg0 = args[0];
    if (!isValidString(arg0)){
        System.exit(1);
    }
}

public boolean isValidString (String str) {
    if (str == null) return false;

    //TODO: many more checks here

    return true;
}

我确信Java比C或早期的PHP安全得多,但是我应该知道什么呢?

如果这个主类除了将其参数传递到其他地方之外什么都不做,那么验证字符串就不是它的责任了

如果这个字符串最终进入一个在SQL查询中使用它的类,那么这个类有责任使用一个准备好的语句,从而确保不可能发生SQL注入攻击

如果该字符串最终成为生成的HTML页面的一部分,则HTML生成器负责对该字符串进行HTML转义


一根绳子本身永远不会有害。如果您必须验证它,那么您需要知道它何时有效,何时无效。这取决于上下文

如果这个主类除了将其参数传递给其他地方之外什么都不做,那么验证字符串就不是它的责任了

如果这个字符串最终进入一个在SQL查询中使用它的类,那么这个类有责任使用一个准备好的语句,从而确保不可能发生SQL注入攻击

如果该字符串最终成为生成的HTML页面的一部分,则HTML生成器负责对该字符串进行HTML转义


一根绳子本身永远不会有害。如果您必须验证它,那么您需要知道它何时有效,何时无效。这取决于上下文

这一切都取决于您对字符串所做的操作,因为您期望的输入显然总是在使用它们之前对它们进行双重检查

如果您担心来自用户的SQL注入,您可以使用准备好的语句来帮助防止SQL注入,因为语句是在使用之前编译的,并且查询计划是为进一步使用而存储的,因此参数不会成为可执行SQL的一部分

如果您担心用户输入出现在网页等上,则应将其转义为网页:


您应该执行的转义/验证完全取决于您对字符串的使用。

这完全取决于您对字符串的操作,因为您期望的输入显然总是在使用它们之前对它们进行双重检查

如果您担心来自用户的SQL注入,您可以使用准备好的语句来帮助防止SQL注入,因为语句是在使用之前编译的,并且查询计划是为进一步使用而存储的,因此参数不会成为可执行SQL的一部分

如果您担心用户输入出现在网页等上,则应将其转义为网页:


您应该进行的转义/验证完全取决于您对字符串的使用。

恐怕这个问题是牵强的问题


在最坏的情况下,我认为,(我无法想象它是如何被复制的)如果传递到
main()
方法的字符串数组足够大,您可以处理
OutOfMemory
异常。

恐怕这个问题是牵强的问题


在最坏的情况下,我想,(我无法想象它是如何被复制的)如果传入
main()
方法的字符串数组足够大,你可以处理
OutOfMemory
异常。

也许他的问题与声纳问题和漏洞检查有关(请参阅:)。如果开发人员100%了解命令行参数的未来用途,那么创建一个输入验证程序来检查命令行参数是一个好主意?也许他的问题与声纳问题和漏洞检查有关(请参阅:)。如果开发人员100%了解命令行参数的未来用途,那么创建一个始终检查命令行参数的输入验证器是一个好主意吗?