Wie SQL-Injection verhindern mit JPA und Hibernate?
Ich entwickle eine Anwendung mit hibernate. Wenn ich versuche, eine zu erstellen eine Login-Seite, das problem Der Sql-Injection entsteht.
Ich habe den folgenden code:
@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 kann ich verhindern, dass Sql-Injection in diesem Szenario ?Die create table-syntax der loginInfo Tabelle ist wie folgt:
create table login_info
(user_name varchar(16) not null primary key,
pass_word varchar(16) not null);
- Bitte wenden Sie sich mit diesem link [1]: stackoverflow.com/questions/4606505/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie andere Möglichkeiten zu finden diese schönen Artikel von mkyong.
Müssen Sie die Verwendung von benannten Parametern zu vermeiden, die sql-injection. Auch (nichts mit sql-injection, aber mit Sicherheit im Allgemeinen) nicht wieder das erste Ergebnis aber verwenden getSingleResult also, wenn es mehr als ein Ergebnis für einige Grund, die Abfrage schlägt fehl mit NonUniqueResultException und login nicht erfolgreich
Was ist SQL Injection?
, Wie um zu verhindern, dass die SQL-injection-Angriff
Die Lösung ist sehr einfach und straight-forward. Sie müssen nur sicherstellen, dass Sie immer bind-Parameter:
Nun, wenn einige versucht, diesen hack-Abfrage:
SQL-Injection-Angriffe verhindert werden:
JPQL Injektion
SQL-Injection kann auch passieren, wenn Sie mit JPQL oder HQL-Abfragen, wie dies durch das folgende Beispiel:
Die JPQL Abfrage oben nicht verwenden, binden Sie Parameter, so dass es anfällig für SQL injection.
Überprüfen Sie heraus, was passiert, wenn ich die Ausführung dieses JPQL-Abfrage wie diese:
Ruhezustand führt die folgende SQL-Abfrage:
Dynamische Abfragen
Sollten Sie vermeiden, Abfragen, verwenden Sie die String-Verkettung zum erstellen der Abfrage dynamisch:
Wenn Sie möchten, verwenden Sie dynamische Abfragen, müssen Sie die Verwendung von Kriterien API statt:
return entityManager.createQuery(query).getResultList();
Weitere details, check-out dieser Artikel.
Wir sollten immer versuchen, zu verwenden gespeicherte Prozeduren in Allgemeines um zu verhindern, dass SQL-Injection.. Wenn gespeicherte Prozeduren sind nicht möglich; wir sollten versuchen, für Vorbereitete Anweisungen.
Positionsparameter in HQL
Abfrage hqlQuery = Sitzung.createQuery("from Bestellungen as Bestellungen where Bestellungen.id = ?");
List Ergebnisse = hqlQuery.setString(0, "123-ADB-567-QTWYTFDL").Liste();
benannten parameter in HQL
Abfrage hqlQuery = Sitzung.createQuery("from Mitarbeiter als emp where emp.incentive - > :Anreiz");
List Ergebnisse = hqlQuery.setLong("Anreiz", new Long(10000)).Liste();
benannten parameter-Liste in HQL
List items = new ArrayList();
Elemente.add("Buch"); items.add("Uhr"); items.add("Tinte");
List Ergebnisse = Sitzung.createQuery("aus dem Warenkorb als Warenkorb where Warenkorb.item in (:itemList)").setParameterList("itemList", Elemente).Liste();
JavaBean in HQL
Abfrage hqlQuery = Sitzung.createQuery("from Books als Bücher, in denen buchen.name = :name und buchen.Autor = :Autor");
List Ergebnisse = hqlQuery.setProperties(javaBean).Liste();
SqlQuery Query = session.createSQLQuery("Select * from Books where author = ?");
List Ergebnisse = sqlQuery.setString(0, "Charles Dickens").Liste();
Möchte ich hier hinzufügen, dass eine Besondere SQL-Injection, das ist möglich mit der Verwendung von Abfragen Wie in der Suche.
Lassen Sie uns sagen, wir haben ein query-string wie folgt:
Während der Einstellung der parameter "name", würden die meisten in der Regel verwenden Sie diese.
Nun, wie oben erwähnt, die traditionellen parameter wie "1=1" kann nicht injiziert werden, da der TypedQuery und Hibernate handle es standardmäßig.
Aber es ist eigenartig, SQL-Injection möglich ist, weil der, WIE Query-Struktur, die die Verwendung von unterstreicht
Wenn nun in unserem Szenario, wenn wir
und so weiter.
Ideale Update:
___ werden \_\_\_ (äquivalent zu 3 raw-Unterstriche)
Ebenfalls, die vice-versa-Abfrage auch eine Injektion in die %'s müssen escaped werden.