Blog

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Terjeng egy mítosz a Hibernate HQL nyelvének "sebezhetetlenségéről"... vagyis az SQL injection elleni védettségéről. Pedig a HQL ugyanúgy sebezhető, mint az SQL: ha rosszul használjuk. Nézzünk miképp is néz ki ez:

Code Block
String goodParameter = "Raj lane";
Query badQuery = session.createQuery("from Address a where a.street='" + goodParameter + "'");

Látszik, hogy a paramétert hozzáfűzzük mezei szövegművelettel, amely lehetőséget ad a HQL injection elvégzésére:

Code Block
String badParameter = "la' or '1'='1";
Query reallyBadQuery = session.createQuery("from Address a where a.street='" + badParameter + "'");

Eredményül nem az utcára szűkítést kapjuk, hanem a tábla teljes tartalmát, mivel a feltételhez odakerült egy '1'='1', mégpedig VAGY kapcsolatban a többi feltétellel. Az HQL injection ellen a paraméterek átadásával tudunk védekezni:

Code Block
String badParameter = "la' or '1'='1";
Query reallyBadQuery = session.createQuery("from Address a where a.street=:street");
reallyBadQuery.setParameter("street", badParameter);

Így a trükk semmit nem ér... :)