我在自己的Persistence-class中有以下泛型方法:
@SuppressWarnings("unchecked")
public static <T> T getByCondition(Class<T> clazz, String database, Object id){
EntityManager em = getEntityManager(database);
Query q = em.createQuery("SELECT t FROM "+clazz.getName()+" t WHERE t.id = :id").setParameter("id", id);
T result = (T) q.getSingleResult();
return result;
}
该方法工作得很好,但我担心查询中的"+clazz.getName()+"
,因为我不太确定这是否会导致sql注入。
是否有更好的方法来声明我想在查询中搜索的班级?
提前感谢您的回答。 : - )
答案 0 :(得分:1)
您发布的代码是安全的,因为课程Class
是最终的,无法延期,并且与其所代表的课程密不可分,这意味着您不会成为能够传递一个假类,getName()
返回一个自定义字符串,而且你不能有一个包含使用SQL注入所必需的标点符号的类名。例如,这是不可能的:
class ' or '1'='1; DROP TABLE USERS; --