2012-12-31 5 views
15

Ich entwickle eine Anwendung mit Hibernate.Wenn ich versuche, eine Login-Seite zu erstellen, entsteht das Problem der Sql-Injektion. Ich habe den folgenden Code:Wie kann SQL Injection im Ruhezustand verhindert werden?

@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; 
      } 
     } 

Wie werde ich SQL-Injection in diesem Szenario zu verhindern Die Tabelle Syntax der Logininfo Tabelle erstellen ist wie folgt:?

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

Bitte beziehen Sie sich auf diesen Link [1]: http://Stackoverflow.com/questions/4606505/prevention-against-sql-injection-in-hibernate –

Antwort

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

Sie andere haben Optionen zu Sieh dieses nette article von mkyong.

+0

Danke, wie können wir ein Passwort in die Abfrage ?? @ Petr Mensik –

+0

In der gleichen Weise, wie ich den Benutzernamen –

0

Wir sollten immer versuchen, gespeicherte Prozeduren im Allgemeinen zu verwenden, um SQLInjection zu verhindern .. Wenn gespeicherte Prozeduren nicht möglich sind; Wir sollten es für Prepared Statements versuchen.

+0

ich stimme zu, es ist technisch besser, wegen der Geschwindigkeit. Allerdings erzeugt kein ORM-Framework, das ich in irgendeiner Sprache kenne, gespeicherte Prozeduren. Es wäre wirklich schön, wenn sie es tun würden. Da dies jedoch nicht der Fall ist und die Produktivität der ORM-Frameworks wesentlich ist, werden die vorbereiteten Aussagen dominieren. – Dennis

+0

Verwendung von gespeicherten Prozeduren für alles ist nicht so weise in ORM. Vorbereitete Aussagen sollten gut sein! – Diablo

15

Sie müssen benannte Parameter verwenden, um SQL-Injektion zu vermeiden. Auch (nichts mit SQL-Injektion, aber mit Sicherheit im Allgemeinen) geben Sie nicht das erste Ergebnis, sondern verwenden getSingleResult, wenn es mehr als ein Ergebnis aus irgendeinem Grund gibt, wird die Abfrage mit NonUniqueResultException fehlschlagen und Login wird nicht sein

erfolgreiche
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. Positionsparameter in HQL

    Abfrage hqlQuery = session.createQuery ("von Orders als Aufträge, bei denen orders.id =?");

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

  2. benannten Parameter in HQL

    Abfrage hqlQuery = session.createQuery ("von Mitarbeitern als emp wo emp.incentive>: Anreiz");

    Listenergebnisse = hqlQuery.setLong ("anreiz", new Long (10000)). List();

  3. namens Parameterliste in HQL

    Listenelemente = new Arraylist(); items.add ("Buch"); items.add ("Uhr"); items.add ("Tinte");

    Ergebnisliste = session.createQuery ("aus dem Einkaufswagen als Einkaufswagen, wo cart.item in (: itemList)"). SetParameterList ("itemList", Artikel) .list();

  4. JavaBean in HQL

Abfrage hqlQuery = session.createQuery ("von Büchern wie Bücher, in denen book.name =: Name und book.author =: Autor");

Liste Ergebnisse = hqlQuery.setProperties (javaBean).Liste();

  1. das Native-SQL

Abfrage sqlquery = session.createSQLQuery ("select * from Books wo author =?");

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

Verwandte Themen