1

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

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

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

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

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

4

3 回答 3

6

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

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

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

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

于 2013-01-25T07:45:43.757 回答
3

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

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

如果您担心用户输入出现在网页等上,那么您应该为网页转义它: 推荐的在 Java 中转义 HTML 的方法

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

于 2013-01-25T07:46:15.090 回答
0

恐怕,这个问题是牵强附会的问题。

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

于 2013-01-25T07:47:48.963 回答