2024-11-29 17:06
@zzutligang 只要你不将参数拼接到 sql 就没问题,这里的参数指:字段名、表名、参数值等等一切拼接成 String sql 语句的部分
2024-11-24 12:46
@caoyuan1 是否还需要这个:
if (UploadConfig.whitelist.contains(extName)) {
return true;
}
改为 :
if (UploadConfig.whitelist.contains(extName) || UploadConfig.whitelist.isEmpty()) {
return true;
}
这样全部放行了,安全性就降低了,现在绝大部分对 java 系统的攻击集中在文件上传 + sql 注入
2024-11-18 20:20
@北流家园网 在 baseController 覆盖一下 getModel 系列的方法,支持一下这个数组的注入
injectModel 回调了 getModel 方法,很方便扩展
2024-10-26 14:58
问一下 chat gpt ,回复可以参考一下,虽然结果出现了了幻觉,但思路值得借签,它提出继承 dialect, 其实应该是要继承 ModelBuilder、RecordBuilder,然后处理一下获取数的地方:
是的,您可以在 JFinal 中通过自定义 Dialect(方言)来解决从 SQLite 数据库读取 Blob 类型数据的问题,而无需修改 JFinal 的源代码。
问题原因:
SQLite JDBC 驱动程序未实现 getBlob 方法,因此当 JFinal 使用默认的 getBlob 方法读取 Blob 数据时,会抛出 “not implemented by SQLite JDBC driver” 的异常。
解决方案:
创建自定义 Dialect:
您可以创建一个自定义的 Dialect 类,继承自 JFinal 提供的 SQLiteDialect 或直接继承 com.jfinal.plugin.activerecord.dialect.Dialect。
java
复制代码
public class CustomSQLiteDialect extends SQLite3Dialect {
@Override
public Object getValue(ResultSet rs, String colName, Class type) throws SQLException {
if (type == byte[].class) {
// 使用 getBytes 方法读取 Blob 数据
return rs.getBytes(colName);
}
return super.getValue(rs, colName, type);
}
}
注册自定义 Dialect:
在您的 JFinal 配置中,注册您自定义的 Dialect:
java
复制代码
ActiveRecordPlugin arp = new ActiveRecordPlugin(...);
arp.setDialect(new CustomSQLiteDialect());
me.add(arp);
使用自定义类型映射(可选):
如果需要,您还可以自定义类型转换器,以确保 Blob 类型的数据被正确地映射为 byte[]:
java
复制代码
public class CustomTypeConverter extends TypeConverter {
@Override
public Object convert(Class type, Object value) {
if (value instanceof byte[]) {
return value;
}
return super.convert(type, value);
}
}
然后在配置中设置自定义的类型转换器:
java
复制代码
arp.setTypeConverter(new CustomTypeConverter());
总结:
通过自定义 Dialect,您可以控制 JFinal 在从 ResultSet 中读取数据时的行为,使用 getBytes 或 getBinaryStream 方法来读取 Blob 数据类型。这种方式无需修改 JFinal 的源代码,且解决了 SQLite JDBC 驱动未实现 getBlob 方法的问题。