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

标签 java security console command-line-arguments

我正在通过命令行参数从用户那里获取 StringJava 程序。

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

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

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

现在我想不出任何特定格式的 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 安全得多,但是我应该注意什么?

最佳答案

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

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

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

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

关于java - 如何验证命令行参数中的用户输入以获得更高的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14517427/

相关文章:

java - Jsch 或 SSHJ 或 Ganymed SSH-2?

security - OAuth 2.0 中的客户端 key

c# - 不需要 SSL 和客户端证书的 TCPClient 服务器与客户端的连接失败

javascript - 每次打开 Chrome DevTools 时,如何让 "Console Drawer"默认隐藏?

java - 使用基于事件的计时器与轮询的性能注意事项

java - 如何在maven中使用tomcat插件部署多个war

java - 检测流中的重复组

sql-server - 如何保护 Excel VBA 项目中的 ADO 连接?

azure - 有没有办法保护只能从特定 Azure 逻辑应用程序调用的 Azure 函数?

具有指定辅音比例的 C# 随机字母生成器 :vowels