java - 编写EnhancedUserType在Hibernate中保存类似字符串的信息,避免SQL注入(inject)

标签 java hibernate escaping sql-injection custom-type

我有一些实体,例如地址。由于性能问题,我想将整个实体保存在单个字段中,例如“street;zip;city”。

可以创建一个EnhancedUserType来做到这一点。在一些示例中,我发现在 hibernate 源中,方法“objectToSQLString”始终是这样实现的:

@Override
public String objectToSQLString(Object object) {
    if (object != null) {
        Address oo = (Address)object;
        return "'" + oo.toSomeString() + "'";
    } else {
        return "";
    }       
}

我不明白该方法是否返回 SQL 表示形式。为什么特殊符号(例如 ['])在字符串内没有转义?我该如何逃离他们?标准的 SQL 转义方式是 ['] -> [''],但在某些方言中 [反斜杠] 也必须转义。

是否有一些 Hibernate 实用程序可以根据方言为我进行转义? Hibernate本身是如何解决这个问题的呢?我在源代码中找不到它:-(

最佳答案

您确实必须返回一个 SQL 文字字符串,用单引号括起来,并转义内部范围。 AFAIK,只有单引号必须通过加倍转义:'O''Reilly'。至少这就是 apache commons-lang StringEscapeUtils 所做的(或所做的)。

但我怀疑将这样的整个地址放在一列中是否会获得任何好处。并且您将无法查询地址的各个字段。您是否测量过这三个字段导致了性能问题,并将它们放在单个列中可以解决问题?

关于java - 编写EnhancedUserType在Hibernate中保存类似字符串的信息,避免SQL注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933300/

相关文章:

java - LibGdx,渲染计数屏幕上的整数

java - 在指定数量的元素之间打印一组条件

Java的Thread.sleep导致我之前调用的方法取消

java - 提交实体对象后检索子对象

java - 使用 uniqueidentifier 主键获取实体时出现问题

hibernate - Hibernate/HQL/JPQL:当……然后NULL否则……END(ClassCastException)时,情况如何?

c# - 如何正确地将字符串传递给ffmpeg?

java - clientSecurity 运行失败的 geode 示例

c - K&R escape.. 中的练习 3-2.. 程序可以运行,但有一个小问题

html - 什么是所有 HTML 转义上下文?