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

时间:2013-01-25 07:39:32

标签: java security console command-line-arguments

我通过命令行参数从用户那里获得String Java 程序。

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

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

  • 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 个答案:

答案 0 :(得分:4)

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

如果此字符串最终转到在SQL查询中使用它的类,则此类负责使用预准备语句,从而确保不会发生SQL注入攻击。

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

字符串本身永远不会有害。如果你必须验证它,那么你需要知道什么时候它有效,什么时候不是。这取决于具体情况。

答案 1 :(得分:3)

这完全取决于你在使用字符串做什么,因为你期望的输入显然总是在你使用之前仔细检查它们。

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

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

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

答案 2 :(得分:0)

我担心,这个问题是一个牵强附会的问题。

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