我有一个类是下面的一个..
public class DataBaseDAO {
private DataBaseDAO() { }
public static synchronized DataBaseDAO getInstance() {
if (dao == null) {
dao = new DataBaseDAO();
}
return dao;
}
}
}
现在这个getinstance()方法可以被黑客攻击:换句话说,这个单例可以被黑客入侵,并且可以创建更多的对象。
如何确保安全? 这可以通过反思,类加载器和deserilizaton来打破 我应该使用同步块而不是在整个方法上进行同步吗? 它会对性能产生影响吗?
感谢大家,实际上我不想介绍新的枚举,因为在现有的结构中会发生很多变化,我正在寻找如何用现有的方法改进现有的单片......
答案 0 :(得分:2)
您可以使用
更安全地做同样的事情public enum DataBaseDAO {
INSTANCE
}
e.g。您可以使用反射来使用setAccessible(true)
的私有构造函数,但不能创建新的枚举实例。
而不是
DataBaseDAO.getInstance().whateverMethod()
你可以使用
DataBaseDAO.INSTANCE.whateverMethod()
答案 1 :(得分:1)
实际上你应该不担心让你的单身被黑客攻击。一般来说,单例被认为是一种糟糕的(过时的)设计实践(它们往往会妨碍声纳或更晚,导致可扩展性问题并使测试变得不必要地复杂化。)
您已经定义了一种清晰的访问方法,它不是您(作为设计师或程序员)的责任,以防止聪明的黑客不顾一切地滥用您的单身人士。有一些项目指南可以防止这种情况发生。
答案 2 :(得分:0)
您需要使用双重检查锁定,单例模式 检查此链接:
http://www.ibm.com/developerworks/java/library/j-dcl/index.html
http://onjavahell.blogspot.co.il/2009/04/uses-of-singleton-design-pattern-in.html
答案 3 :(得分:0)
以下3种方法都是安全的,前两种是通过类加载机制,最后一种是通过同步。
除非你使用SecurityManagers,否则你无法保护自己免受反射,我觉得这很复杂。
另一个注意事项:不要使用单身人士;-P
class YourClass
{
public static final YourClass instance = new YourClass();
}
// or
class YourClass2
{
private static final YourClass2 instance = new YourClass2();
public static synchronized YourClass2 getInstance()
{
return instance;
}
}
// or
class YourClass3
{
private static YourClass3 instance;
public static synchronized YourClass3 getInstance()
{
if (instance == null)
instance = new YourClass3();
return instance;
}
}