2012-12-31 11 views
15

Sto sviluppando un'applicazione utilizzando la modalità ibernazione. Quando provo a creare una pagina di accesso, si verifica il problema di Sql Injection. Ho il codice seguente:Come impedire SQL Injection in modalità di sospensione?

@Component 
@Transactional(propagation = Propagation.SUPPORTS) 
public class LoginInfoDAOImpl implements LoginInfoDAO{ 

@Autowired 
private SessionFactory sessionFactory;  
@Override 
public LoginInfo getLoginInfo(String userName,String password){ 
    List<LoginInfo> loginList = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName='"+userName+"' and password='"+password+"'").list(); 
    if(loginList!=null) 
     return loginList.get(0); 
    else return null; 
      } 
     } 

Come faccio a prevenire SQL Injection in questo scenario La creazione della sintassi tavolo del tavolo loginInfo è la seguente:?

create table login_info 
    (user_name varchar(16) not null primary key, 
    pass_word varchar(16) not null); 
+0

Si prega di fare riferimento a questo collegamento [1]: http://stackoverflow.com/questions/4606505/prevention-against-sql-injection-in-hibernate –

risposta

19
Query q = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName = :name"); 
q.setParameter("name", userName); 
List<LoginInfo> loginList = q.list(); 

altri sono disponibili opzioni troppo , guarda questo simpatico article dal mkyong.

+0

Grazie, Come possiamo includere la password nella query ?? @ Petr Mensik –

+0

Nello stesso modo in cui ho incluso l'userName –

0

Dovremmo sempre provare a utilizzare stored procedure in generale per evitare SQLInjection .. Se le stored procedure non sono possibili; dovremmo provare per le dichiarazioni preparate.

+0

concordo, è tecnicamente migliore, a causa della velocità. tuttavia, nessun framework ORM che conosca in nessuna lingua genera stored procedure s. Sarebbe davvero bello se lo facessero. Ma poiché non lo fanno, e la produttività fornita dai quadri ORM è essenziale, le dichiarazioni preparate stanno per dominare. – Dennis

+0

l'uso di stored procedure per tutto ciò che non è così saggio in ORM. le dichiarazioni preparate dovrebbero essere buone! – Diablo

15

È necessario utilizzare i parametri denominati per evitare l'iniezione sql. Inoltre (niente a che fare con SQL injection ma con sicurezza in generale) non restituisce il primo risultato ma usa getSingleResult quindi se ci sono più risultati per qualche motivo, la query fallirà con NonUniqueResultException e il login non sarà successo

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(); 
0
  1. parametro posizionale in HQL

    Query hqlQuery = session.createQuery ("da ordini come gli ordini dove orders.id =?");

    Elenco risultati = hqlQuery.setString (0, "123-ADB-567-QTWYTFDL"). List();

  2. nome parametro nella HQL

    Query hqlQuery = session.createQuery ("da dipendenti come emp dove emp.incentive>: incentivo");

    Elenco risultati = hqlQuery.setLong ("incentive", new Long (10000)). List();

  3. lista parametro denominato in HQL

    Elenco articoli = new ArrayList(); items.add ("libro"); Items.Add ("orologio"); Items.Add ("inchiostro");

    Elenco risultati = session.createQuery ("dal carrello come carrello dove cart.item in (: itemList)"). SetParameterList ("itemList", items) .list();

  4. JavaBean in HQL

Query hqlQuery = session.createQuery ("da libri come libri dove book.name =: nome e book.author =: autore");

Elenco risultati = hqlQuery.setProperties (javaBean).elenco();

  1. nativo-SQL

Query sqlquery = session.createSQLQuery ("select * from Libri cui autore =?");

Risultati elenco = sqlQuery.setString (0, "Charles Dickens"). List();

Problemi correlati