如何在hibernate中阻止SQL注入?
我正在使用hibernate开发一个应用程序。当我尝试创建一个Login页面时,出现了Sql Injection的问题。 我有以下代码:
@Component @Transactional(propagation = Propagation.SUPPORTS) public class LoginInfoDAOImpl implements LoginInfoDAO{ @Autowired private SessionFactory sessionFactory; @Override public LoginInfo getLoginInfo(String userName,String password){ List loginList = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName='"+userName+"' and password='"+password+"'").list(); if(loginList!=null ) return loginList.get(0); else return null; } }
在这种情况下如何防止Sql注入?loginInfo表的create table语法如下:
create table login_info (user_name varchar(16) not null primary key, pass_word varchar(16) not null);
Query q = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName = :name"); q.setParameter("name", userName); List loginList = q.list();
你也有其他选择,请参阅mkyong的这篇好文章 。
您需要使用命名参数来避免sql注入。 另外(与sql注入无关,但通常有安全性)不返回第一个结果但是使用getSingleResult因此如果由于某种原因有多个结果,查询将失败并出现NonUniqueResultException并且登录将不会成功
Query query= sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName=:userName and password= :password"); query.setParameter("username", userName); query.setParameter("password", password); LoginInfo loginList = (LoginInfo)query.getSingleResult();
我们应该总是尝试使用存储过程来防止SQLInjection ..如果存储过程不可行; 我们应该尝试准备好的陈述。
-
HQL中的位置参数
查询hqlQuery = session.createQuery(“从Orders作为订单,其中orders.id =?”);
list results = hqlQuery.setString(0,“123-ADB-567-QTWYTFDL”)。list();
-
HQL中的命名参数
查询hqlQuery = session.createQuery(“来自Employees as emp,其中emp.incentive>:incentive”);
list results = hqlQuery.setLong(“incentive”,new Long(10000))。list();
-
HQL中的命名参数列表
List items = new ArrayList(); items.add( “书”); items.add( “时钟”); items.add( “墨水”);
list results = session.createQuery(“from Cart as cart where cart.item in(:itemList)”)。setParameterList(“itemList”,items).list();
-
HQL中的JavaBean
查询hqlQuery = session.createQuery(“from books as books where book.name =:name and book.author =:author”);
list results = hqlQuery.setProperties(javaBean).list();
- 本机SQL
查询sqlQuery = session.createSQLQuery(“Select * from Books where author =?”);
list results = sqlQuery.setString(0,“Charles Dickens”)。list();
- HibernateException:无法获取当前线程的事务同步会话
- 为什么这个未处理的org.apache.tiles.impl.CannotRenderException?
- Hibernate性能最佳实践?
- 为什么我得到org.hibernate.id.IdentifierGenerationException?
- 使用OR条件而不是AND条件连接列的注释
- 创建bean’entalManagerFactory’时出错,嵌套HibernateException:无法获取默认的Bean Validation工厂
- 如何在unit testing期间注入PersistenceContext?
- 使用JPA在PostgreSQL中保留UUID
- 我可以在ConstraintValidator中为Method参数更改属性路径吗?