如何在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 ..如果存储过程不可行; 我们应该尝试准备好的陈述。

  1. HQL中的位置参数

    查询hqlQuery = session.createQuery(“从Orders作为订单,其中orders.id =?”);

    list results = hqlQuery.setString(0,“123-ADB-567-QTWYTFDL”)。list();

  2. HQL中的命名参数

    查询hqlQuery = session.createQuery(“来自Employees as emp,其中emp.incentive>:incentive”);

    list results = hqlQuery.setLong(“incentive”,new Long(10000))。list();

  3. 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();

  4. HQL中的JavaBean

查询hqlQuery = session.createQuery(“from books as books where book.name =:name and book.author =:author”);

list results = hqlQuery.setProperties(javaBean).list();

  1. 本机SQL

查询sqlQuery = session.createSQLQuery(“Select * from Books where author =?”);

list results = sqlQuery.setString(0,“Charles Dickens”)。list();