我通过命令行参数从用户那里获得String
到 Java 程序。
问题是我应该采取什么样的检查来防止可能的攻击和漏洞?
我不是安全领域的专家,但据我所知
目前我无法考虑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更安全,但我应该注意什么?
答案 0 :(得分:4)
如果这个主类除了将其参数传递给其他地方之外什么都不做,那么验证字符串不是它的责任。
如果此字符串最终转到在SQL查询中使用它的类,则此类负责使用预准备语句,从而确保不会发生SQL注入攻击。
如果此字符串最终成为生成的HTML页面的一部分,则HTML生成器负责HTML转义字符串。
字符串本身永远不会有害。如果你必须验证它,那么你需要知道什么时候它有效,什么时候不是。这取决于具体情况。
答案 1 :(得分:3)
这完全取决于你在使用字符串做什么,因为你期望的输入显然总是在你使用之前仔细检查它们。
如果您担心来自用户的SQL注入,您可以使用预准备语句来帮助防止SQL注入,因为语句在使用之前已经编译并且存储了查询计划以供进一步使用,因此参数不会成为可执行文件的一部分SQL。
如果您担心网页上出现用户输入等,那么您应该将其转义为网页: Recommended method for escaping HTML in Java
你应该做的转义/验证完全取决于你对字符串的使用。
答案 2 :(得分:0)
我担心,这个问题是一个牵强附会的问题。
在最坏的情况下,我认为,(我无法想象它是如何被复制的)如果传递给OutOfMemory
方法的String数组足够大,你可以处理main()
异常