2012-04-12 15 views
5

SQL-Injektionen zu vermeiden, normalerweise Positionsparameter und benannte Parameter können in HQL verwendet werden, wie es Demos here und Stackoverflow hat auch Proben. Ich möchte wissen, welche Schritte unternommen werden können, wenn Criteria verwendet wird. Bitte helfen Sie mit Beispielcodes oder nützliche Links.SQL Injection durch Hibernate-Kriterien & Session.save (Objekt)

Bearbeiten
Auch wenn wir ein Objekt dann speichern? Nehmen wir an, das Objekt kann eine String-Variable haben und jemand kann eine anfällige SQL-Abfrage zuweisen.

myObject.setName(somevulnerablesql); session.save(myObject); 

In diesem Fall müssen wir die Benutzereingaben separat prüfen, bevor sie dem Objekt zugewiesen werden? oder irgendwelche anderen Schritte, um solche SQL-Injektionen zu vermeiden?

Antwort

4

Ich bin ziemlich sicher, dass das Criteria-Object sichere HSQL erstellen wird.

Sie müssen vorsichtig sein mit dem Expression Objekt. Sie können dort eine SQL-Injektion erstellen. Aber nehmen Sie einen Blick auf die generierten SQL: Hibernate show real SQL

edit: Es sei denn, es einen großen Fehler in Ruhezustand ist, Sie müssen nicht darauf achten, dass Ihre String s entkommen sind, bevor Sie sie speichern. Hibernate arbeitet mit vorbereiteten Anweisungen. Es gibt also keine String-Verkettung und keine SQL-Injektion mit der Hibernate-Sitzung.

Möglicherweise müssen Sie die Ausgabe jedoch nach dem Lesen mit Hibernate verlassen. Zum Beispiel: Sie haben einen Entity Benutzer

class User{ 
    String name; 
} 

Und Sie rufen Sie den Benutzer "‘ oder 1 = 1; DROP DATABASE Benutzer; -" Dieser String wird in der Datenbank gespeichert werden. Wenn Sie den Benutzer mit einem Criterion-Objekt abfragen, finden Sie ihn (ohne die Datenbank zu löschen). Wenn Sie den Benutzer mit dem Expression-Objekt abfragen, können Sie die Datenbank löschen (wenn Sie Zeichenfolgen berücksichtigen).

Wenn Sie den Namen des Benutzers in HTML ausgeben, müssen Sie die Ausgabe maskieren. Andernfalls ist ein Benutzer mit dem Namen "/><script>evilJavascript()</script> für Ihre Anwendung nicht geeignet.

bearbeiten 2: mal hier vorbeischauen: https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

+0

Danke. Meine nächste Frage war die !!! Ich habe meine Frage bearbeitet. –

3

Die Kriterien erlauben es Ihnen nicht, anfällige SQL/HQL selbst zu schreiben, daher sollte es kein Problem mit SQL-Injection geben (außer es gibt einen Fehler in Hibernate selbst).

bearbeiten:

Wie @ckuetbach darauf hingewiesen, Kriterien tatsächlich ermöglicht es Ihnen, mit SQL Expression.sql(String sql) oder Restrictions.sqlRestriction(String) zu schreiben.

+1

Das ist nicht richtig, ergänze ich denke: http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/criterion/ Expression.html –

+0

@ ckuetbach.Thanks. Würden Sie bitte mehr mit einem Code-Snip erklären? –

+0

@ckuetbach stimmte zu, ich war mir dessen nicht bewusst. Ich werde meine Antwort aktualisieren. – Thomas