我正在通过命令行参数将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安全得多,但是我应该注意什么呢?
发布于 2013-01-25 07:45:43
如果这个主类只将它的参数传递到其他地方,那么验证字符串就不是它的责任了。
如果这个字符串最终转到一个在SQL查询中使用它的类,那么这个类就有责任使用一个准备好的语句,从而确保没有可能发生SQL注入攻击。
如果这个字符串最终成为生成的HTML页面的一部分,那么HTML生成器就有责任转义该字符串。
一根绳子本身是不会有害的。如果您必须验证它,那么您需要知道它何时有效,何时无效。这取决于背景。
发布于 2013-01-25 07:46:15
这完全取决于您对字符串所做的操作,就像您预期的输入一样,在使用字符串之前一定要对这些输入进行反复检查。
如果您担心来自用户的SQL注入,您可以使用准备好的语句来帮助防止SQL注入,因为语句是在使用之前编译的,查询计划存储在以后使用,这样参数就不会成为可执行SQL的一部分。
如果您担心用户输入出现在网页上等等,那么您应该将其转义到一个网页:Recommended method for escaping HTML in Java。
您应该进行的转义/验证完全取决于您对字符串的使用。
发布于 2013-01-25 07:47:48
恐怕这个问题太牵强了.
在最坏的情况下,我想(我无法想象它是如何被复制的),如果传入main()方法的字符串数组足够大,您就可以处理main()异常。
https://stackoverflow.com/questions/14517427
复制相似问题