我怀疑Hibernate
对于Web应用程序(JSP,Servlet,Hibernate,MySQL)是否安全,在Web应用程序中“不同的用户”可以一次获得数千次访问。
我担心的原因如下。
想象一下,我有一个针对学校学生的Web应用程序。他们有自己的个人资料,并将维护自己的学生课程,成绩等。现在,肯定有1个以上的用户将始终使用自己的个人资料在线。这意味着,如果用户A
对其数学标记进行了编辑,则将在用户A
的个人资料中进行。它永远不会在所有的用户进行更换A
,B
和“谁在同一时间分别网上C`s轮廓。
Servlets
多线程提供上述支持。与纯JDBC一样,它可以正常工作。怎么样了 Hibernate
?
我也上传了我的资料HibernateUtil
供您参考。就我而言,我称其为SessionFactoryBuilder
public class SessionFactoryBuilder
{
private static SessionFactoryBuilder instance;
private static SessionFactory sessionFactory;
private SessionFactoryBuilder()
{
buildConfig();
System.out.println("hehehehe");
}
private static void buildConfig()
{
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
sessionFactory = configuration.buildSessionFactory(builder.build());
}
public static SessionFactoryBuilder getInstance()
{
if(instance == null)
{
instance = new SessionFactoryBuilder();
}
return instance;
}
public SessionFactory getSessionFactory()
{
return sessionFactory;
}
}
1) 在Hibernate中,每个应用程序都存在一个 SessionFactory对象 。
SessionFactory的内部状态是 不可变的 , 因此是线程安全的 。多个线程可以同时访问它以获取Session实例。
下面的代码描述了通过Utility类获取SessionFactory实例的标准方法。
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
/**
* Hibernate Utility class with a method to get Session Factory object.
*/
public class HibernateUtil {
private static final SessionFactory sessionFactory;//Once created, its properties cannot be changed
static {
try {
// Create the SessionFactory from standard (hibernate.cfg.xml) config file.
sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
} catch (Throwable ex) {
// Log the exception.
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
2) Hibernate Session
是Java应用程序层和hibernate之间的接口。这是用于执行数据库操作的核心接口。会话的生命周期受逻辑事务的开始和结束的限制。
Hibernate Session对象不是线程安全的 ,每个线程都应获取其自己的会话实例,并在工作完成后将其关闭。
实现者不是线程安全的。相反,每个线程/事务都应从SessionFactory获取其自己的实例。
A typical transaction should use the following idiom:
Session sess = factory.openSession();
Transaction tx;
try {
tx = sess.beginTransaction();
//do some work
...
tx.commit();
}
catch (Exception e) {
if (tx!=null) tx.rollback();
throw e;
}
finally {
sess.close();
}
如果会话引发异常,则必须回滚事务并丢弃会话。 发生异常后,会话的内部状态可能与数据库不一致。
2.1) 下面列出了两种广泛用于获取Hibernate会话对象的方法。
Hibernate SessionFactory的 getCurrentSession()方法返回绑定到上下文的会话。
但是要使其正常工作,我们需要在hibernate配置文件中对其进行配置。由于此会话对象属于hibernate上下文,因此我们无需关闭它。一旦SessionFactory关闭,该会话对象就被关闭。
<property name="hibernate.current_session_context_class">thread</property>
Hibernate SessionFactory的 openSession() 方法总是打开一个新的会话。一旦完成所有数据库操作,就应该
关闭 该会话对象。
我们应该在多线程环境中为每个请求打开一个新会话。
2.2)还有另外一种使用openStatelessSession()创建Hibernate
Session对象的方法,它为您提供了一个hibernate的无状态会话。
它是一个面向命令的API,用于对数据库执行批量操作。
无状态会话不会实现一级缓存,也不会与任何二级缓存交互,也不会实现事务后写或自动脏检查,也不会将操作级联到关联的实例。无状态会话将忽略集合。通过无状态会话执行的操作会绕过Hibernate的事件模型和拦截器。由于缺少一级缓存,无状态会话很容易受到数据别名的影响。
对于某些类型的事务,无状态会话的执行速度可能比有状态会话的执行速度稍快(例如:批处理/批量更新)
StatelessSession session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.scroll(ScrollMode.FORWARD_ONLY);
while ( customers.next() ) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
session.update(customer);
}
tx.commit();
session.close();
在此代码示例中,查询返回的Customer实例将立即分离。它们从不与任何持久性上下文相关联。
由StatelessSession接口定义的insert(),update()和delete()操作被视为直接数据库行级操作。它们分别导致立即执行SQL
INSERT,UPDATE或DELETE。
无状态会话不是线程安全的 ,使用无状态会话为“
org.hibernate.AssertionFailure:可能对该会话的非线程安全访问”时可能发生异常
3)
您的学生记录项目是一个多线程应用程序,因此在使用hibernate模式时需要格外小心。尝试通过打开新会话,使用事务,提交和回滚以及在需要时关闭会话来使用最佳编程实践。
我个人在我们的项目中使用过hibernate,那里有数百万的用户通过hibernate作为后端API访问数据库。由于我们使用了hibernate的最佳编程实践,因此我们在多线程环境中从未遇到过此类问题。即使数据库发生任何异常,整个事务也会回滚。
因此,与JDBC相比,可以以更高的成功率实现数据库事务的ACID属性(原子性,一致性,隔离性,持久性)。
攻击者无时无刻不在准备对你的 Web 应用程序进行攻击,因此提高你的 Web 应用程序的安全性是非常有必要的。幸运的是,来自The Open Web Application Security Project (OWASP) 的有心人已经整理了一份包含了已知安全问题和防御方式的全面的清单。这份清单对于具有安全意识的开发者来说是必读的。由 Padraic Brady 整理的 Survive The D
大部分的Spring Security用户都会使用到他们的HTTP或则Servlet API应用中。在这一部分我们将了解Spring Security如何在应用的web层提供验证和权限控制。我们将会看到在命名空间的背后实际上是哪些类和接口被装配起来用来提高web层的安全。在某些情况下,有必要使用传统的Bean的配置,提供完全的配置控制,因此我们也将看到如何直接配置这些没有命名空间的类。
下列章节描述了web应用渗透测试方法论的12个子类: 简介与目标 信息收集 配置以及部署管理测试 身份鉴别管理测试 认证测试 授权测试 会话管理测试 输入验证测试 错误处理测试 密码学测试 业务逻辑测试 客户端测试
问题内容: 我在检索与其他对象有许多关系的对象的多个实例时遇到性能问题。我正在将Spring和Hibernate的JPA实现与MySQL配合使用。问题是执行JPA查询时,Hibernate不会自动联接到其他表。这将导致n * r + 1个SQL查询,其中n是要检索的对象数,r是关系数。 例如,某人住在某个地址,有很多爱好,并且访问过许多国家: 当我执行JPA查询以获取所有名为Bob的个人时,数据库
问题内容: 什么: NodeJS应用程序可以二进制形式分发吗?即。您通过V8将.js应用编译为其本机二进制文件,然后将该二进制文件分发给客户端?(如果您拥有对NodeJS服务器的全部访问权限)…还是正在缩小代码,您可以做些什么? 原因: 我们在NodeJS中为客户端构建服务器端应用程序,这些应用程序通常必须托管在客户端的服务器上。分发源代码意味着客户可以轻松地窃取我们的解决方案并停止支付许可费用。
我们可以在PHPmailer中实现什么样的安全性,使其成为更安全的Gmail应用程序?https://support.google.com/accounts/answer/6010255我正在使用PHPmailer通过Gmail发送电子邮件。PS:我不想在此处启用“访问不太安全的应用程序”:https://www.google.com/settings/security/lesssecureapp