有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我通过命令行参数从用户那里获得一个StringJava程序

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

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

  • C中,用户指定的行太长且处理不当可能导致缓冲区溢出
  • PHP中,包含`字符且处理不当的行可能会导致SQL注入

现在我想不出任何特定的String格式来应用一些正则表达式进行检查。它可以是任意的,但如果它看起来有害,我想立即退出。字符串可能要通过网络发送到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安全得多,但是我应该注意什么


共 (3) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

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

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

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

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

  3. # 3 楼答案

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

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

    如果您担心用户输入出现在网页等上,则应将其转义为网页: Recommended method for escaping HTML in Java

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