JPA本机查询:在运行时将列和表名称作为变量进行攻击

时间:2016-08-25 10:58:24

标签: java spring-data-jpa

我知道在JPA查询中动态修改表名和列名是不可能的。它们必须是硬编码的。

但是,我有一个架构,它有许多不同的表,前三列的结构都相同。而不是必须编写一个类或方法来查询每个这些,我想知道是否有使用变量修改表名和列名的快速黑客?我现有的查询如下:

public interface ExampleRepository extends JpaRepository<Example, Long>,
    JpaSpecificationExecutor<Example> {

    @Query(value = "SELECT name_ln FROM ?1 WHERE ?2 = ?3",
        nativeQuery = true)
    String getName(String tableLookUp, String idColumn, long namespaceRefId);
}

这不起作用,由于表和列名称的引号,MySQL产生以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''table_name' WHERE 'column_id' = 211833' at line 1

1 个答案:

答案 0 :(得分:0)

您可以尝试对查询中的传递值使用参数注释。

例如:

@Query(value = "SELECT name_ln FROM :tableName WHERE :columnName = :value", nativeQuery = true)
String getName(@Param("tableName") String tableLookUp, @Param("columnName")  String idColumn, @Param("value") long namespaceRefId);

确保查询结果将是一条记录。这可能会导致错误。