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