sheet injection evitar como cheat java sql jdbi

java - injection - ¿Cómo hacer in-query en jDBI?



sql injection cheat sheet (3)

¿Cómo puedo ejecutar cosas como esta en jDBI?

@SqlQuery("select id from foo where name in <list of names here>") List<Integer> getIds(@Bind("nameList") List<String> nameList);

Tabla: foo(id int,name varchar)

Similar a @SelectProvider desde myBatis.

Se han formulado preguntas similares. ¿Cómo creo una consulta dinámica de SQL en tiempo de ejecución utilizando la API de objetos SQL de JDBI? , pero de alguna manera la respuesta no me queda clara.


Con PostgreSQL, pude usar CUALQUIER comparación y vincular la colección a una matriz para lograr esto.

public interface Foo { @SqlQuery("SELECT id FROM foo WHERE name = ANY (:nameList)") List<Integer> getIds(@BindStringList("nameList") List<String> nameList); } @BindingAnnotation(BindStringList.BindFactory.class) @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.PARAMETER}) public @interface BindStringList { String value() default "it"; class BindFactory implements BinderFactory { @Override public Binder build(Annotation annotation) { return new Binder<BindStringList, Collection<String>>() { @Override public void bind(SQLStatement<?> q, BindStringList bind, Collection<String> arg) { try { Array array = q.getContext().getConnection().createArrayOf("varchar", arg.toArray()); q.bindBySqlType(bind.value(), array, Types.ARRAY); } catch (SQLException e) { // handle error } } }; } } }

NB: ANY no forma parte del estándar ANSI SQL, por lo que esto crea una gran dependencia de PostgreSQL.


Esto debería funcionar:

@SqlQuery("select id from foo where name in (<nameList>)") List<Integer> getIds(@BindIn("nameList") List<String> nameList);

No olvides anotar la clase que contiene este método con:

@UseStringTemplate3StatementLocator

anotación (debido a que JDBI utiliza la plantilla StringTemplate de Apache para realizar tales sustituciones). También tenga en cuenta que con esta anotación, no puede usar el carácter ''<'' en sus consultas SQL sin escapar (porque es un símbolo especial utilizado por StringTemplate).


Utilice @Definir anotación para crear consultas dinámicas en jDBI. Ejemplo:

@SqlUpdate("insert into <table> (id, name) values (:id, :name)") public void insert(@Define("table") String table, @BindBean Something s); @SqlQuery("select id, name from <table> where id = :id") public Something findById(@Define("table") String table, @Bind("id") Long id);