2016-05-05 10 views
0

Ich habe gegenüber der zweiten Ordnung SQL-Injection in diesem folgenden CodeWie SQL zweiter Ordnung Injektionen in Java (Frühjahr Application)

if(subjectId!=null){Query query= sessionFactory 
      .getCurrentSession() 
      .createSQLQuery(HubQueryConstants.GET_QUERY) 
      .setParameter(MyConstants.SUBJECT_ID, subjectId) 
      .setFirstResult(offset) 
      .setMaxResults(limit) 
      .setResultTransformer(
        Transformers.aliasToBean(MyClass.class));} 

My Constant-Datei ist zu verhindern:

Constant Datei Abschlussklasse

GET_QUERY="Select * from MyClass where id=:id "; 

obwohl es in statischer Abfrage standardmäßig immer noch mein Sicherheitsbericht ist, wird es als zweite Ordnung SQL-Injektion geben

Sollen wir Konstanten in der Schnittstelle deklarieren? um Sicherheitsprobleme zu vermeiden?

+1

ich mit Ihrem Sicherheits Bericht falsch ist, sagen würde. – Andreas

+1

Ich denke, das Problem ist, dass Sie SQL in den ID-Parameter Ihrer Abfrage injizieren können. Aber da Sie Hibernate verwenden (ich vermute), wird Ihre Anfrage in ein preparedStement übersetzt. Du solltest also sicher sein. – EisenRatte

+0

Ich verwende Sql-Abfrage im obigen Snippet, obwohl ich HQL-Abfrage verwende, zeigt mein Bericht SQL-Injektion zweiter Ordnung –

Antwort

0

Eine SQL-Injection tritt auf, wenn ein Platzhalter durch einen SQL-Ausdruck ersetzt wird, der die ursprüngliche SQL-Zeichenfolge ändert, sodass SQL etwas anderes als beabsichtigt tut.

Sie können weitere Informationen finden Sie unter SQL_injection

SQL-Injection geschieht, wenn die Platzhalter des Parameters ersetzt werden. Das Deklarieren von Konstanten anstatt das SQL aus einer Eigenschaft zu lesen, hilft also nicht. Die Injektion erfolgt später unabhängig davon, wo die SQL-Zeichenfolge abgerufen wurde.

Der einfachste Weg, die SQL-Injektion zu verhindern, ist die Verwendung vorbereiteter Anweisungen.

Wenn eine vorbereitete Anweisung ausgeführt wird, werden die SQL-Zeichenfolge und die Parameter vom SQL-Server vollständig getrennt verarbeitet, wodurch die SQL-Injektion unmöglich wird.

Mit JPA können Sie die Annotation javax.persistence.NamedNativeQuery; verwenden, um eine SQL-Abfrage zu deklarieren, die als vorbereitete Anweisung ausgeführt wird.

finden Sie einen Tutorial NamedNativeQuers am Ende jpa-native-queries

Verwandte Themen