前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Thymeleaf异常处理Calling methods is forbidden for type

Thymeleaf异常处理Calling methods is forbidden for type

作者头像
路过君
发布于 2023-05-01 02:07:39
发布于 2023-05-01 02:07:39
33600
代码可运行
举报
运行总次数:0
代码可运行

版本

thymeleaf 3.0.15

现象

在thymeleaf模板中通过${session.SPRING_SECURITY_LAST_EXCEPTION.getMessage()}获取异常消息时报错

Caused by: org.springframework.expression.EvaluationException: Calling methods is forbidden for type ‘java.lang.RuntimeException’ in Thymeleaf expressions. Blacklisted classes are: [java.util.concurrent.RunnableFuture, java.util.concurrent.Executor, java.lang.Runtime, java.util.concurrent.FutureTask, java.util.concurrent.ListenableFuture, java.lang.Runnable, java.util.concurrent.Future, java.lang.Thread, java.lang.reflect.Executable, java.lang.Class, java.lang.ClassLoader, java.sql.DriverManager].

原因

在thymeleaf 3.0.15中将java.lang.Runtime前缀的类加入了黑名单不允许在模板中访问

解决

异常以Exception抛出不要以RuntimeException抛出,其他类似问题通解

源码

  • 包thymeleaf-spring5-3.0.15

org.thymeleaf.spring5.expression.ThymeleafEvaluationContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static final class ThymeleafEvaluationContextACLMethodResolver extends ReflectiveMethodResolver {

        ThymeleafEvaluationContextACLMethodResolver() {
            super();
        }

        @Override
        public MethodExecutor resolve(
                final EvaluationContext context, final Object targetObject,
                final String name, final List<TypeDescriptor> argumentTypes) throws AccessException {

            final Class<?> type = (targetObject instanceof Class ? (Class<?>) targetObject : targetObject.getClass());
            // 判断对象是否时允许访问的类型
            if (!ExpressionUtils.isTypeAllowed(type.getName())) {
                // We will only specifically allow calling "Object.getClass()" and "Class.getName()"
                if (!(Class.class.equals(type) && "getName".equals(name))
                        && !(Object.class.equals(type) && "getClass".equals(name))) {
                    throw new EvaluationException(
                            String.format(
                                    "Calling methods is forbidden for type '%s' in Thymeleaf expressions. " +
                                    "Blacklisted classes are: %s.",
                                    type.getName(), ExpressionUtils.getBlacklist()));
                }
            }
            return super.resolve(context, targetObject, name, argumentTypes);
        }

    }
  • 包thymeleaf-3.0.15 org.thymeleaf.util. ExpressionUtils
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public final class ExpressionUtils {
	// 所有黑名单类名前缀
    private static final Set<String> BLOCKED_CLASS_NAME_PREFIXES =
            new HashSet<String>(Arrays.asList(
                    "java.lang.Runtime", "java.lang.Thread", "java.lang.Class", "java.lang.ClassLoader",
                    "java.lang.Runnable", "java.lang.reflect.Executable",
                    "java.util.concurrent.Future", "java.util.concurrent.FutureTask",
                    "java.util.concurrent.RunnableFuture", "java.util.concurrent.ListenableFuture",
                    "java.util.concurrent.Executor",
                    "java.sql.DriverManager"));

    public static boolean isTypeAllowed(final String typeName) {
        Validate.notNull(typeName, "Type name cannot be null");
        final int i0 = typeName.indexOf('.');
        if (i0 >= 0) {
            final String package0 = typeName.substring(0, i0);
            if ("java".equals(package0)) { // This is the only prefix that might be blocked
                for (final String prefix : BLOCKED_CLASS_NAME_PREFIXES) {
                    if (typeName.startsWith(prefix)) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
    public static List<String> getBlockedClasses() {
        final List<String> blocked = new ArrayList<String>();
        blocked.addAll(BLOCKED_CLASS_NAME_PREFIXES);
        return blocked;
    }
    private ExpressionUtils() {
        super();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA安全之Thymeleaf模板注入检测再探
从之前的文章中我们分析后发现Thymeleaf 3.0.15版本中只要检测到"{"就会认为存在表达式内容,随后直接抛出异常停止解析来防范模板注入问题,此类场景用于我们URL PATH、Retruen、Fragment等可控的情况下进行,但是如果我们存在对模板文件进行更改、创建、上传等操作的时候我们还可以精心构造恶意的JAVA代码并将其写入模板中,随后触发执行
Al1ex
2024/10/18
1270
JAVA安全之Thymeleaf模板注入检测再探
thymeleaf模板注入学习与研究--查找与防御
实际开发过程中 依靠我丰富的想象力只能想出 换主题 这种场景下可能会出现 大佬们自行脑补吧。
FB客服
2022/11/14
6430
thymeleaf模板注入学习与研究--查找与防御
JAVA安全之Thymeleaf模板注入防护绕过
若依CMS中使用到了Thymeleaf模板引擎且存在模板注入可控点,但是在漏洞测试过程中发现常规的通用载荷并不生效,遂对其进行调试分析,最后发现是和Thymeleaf版本有莫大的关系,其中3.0.12版本增加了多处安全机制来防护模板注入漏洞,本篇文章将基于此背景对Thymeleaf模板的注入防御措施和绕过进行深入刨析
Al1ex
2024/10/14
2670
JAVA安全之Thymeleaf模板注入防护绕过
Java中常见死锁与活锁的实例
可以看到bThread持有锁0x00000007aaee5758,同时等待0x00000007aaee5748,然而恰好aThread持有锁0x00000007aaee5748并等待0x00000007aaee5758,从而形成了死锁
爬蜥
2019/07/09
7380
Thymeleaf 5 分钟教程
Thymeleaf 是一个用于 web 和独立环境的现代服务器端 Java 模板引擎。
acc8226
2022/05/17
4470
Thymeleaf SSTI 分析以及最新版修复的 Bypass
前段时间补上了迟迟没有写的 文件包含漏洞原理与实际案例介绍一文,在其中就提到了 Thymeleaf SSTI 漏洞,昨天在赛博群里三梦师傅扔了一个随手挖的 CVE——Thymeleaf SSTI Bypass,想着之前项目的代码还没清理,一起分析来看看
p4nda
2023/01/03
2.5K0
Thymeleaf SSTI 分析以及最新版修复的 Bypass
Thymeleaf的使用前言:一、thymeleaf简介:二、thymeleaf标准方言:三、thymeleaf与springboot集成案例:总结:
最近听说thymeleaf好像也挺流行的,还说是spring官方推荐使用,那thymeleaf究竟是什么呢?spring为什么推荐用它呢?怎么用呢?本文将为你揭秘!
贪挽懒月
2018/08/02
1.1K0
Thymeleaf的使用前言:一、thymeleaf简介:二、thymeleaf标准方言:三、thymeleaf与springboot集成案例:总结:
Java 多线程系列(1) —— 线程入门
Java 中线程的优先级范围为 1~10,是一个 int 类型的值 其中最小的优先级 (MIN_PRIORITY) 为 1 正常优先级 (NORM_PRIORITY) 为 5 最高优先级 (MAX_PRIORITY) 为 10 【源码中定义的线程优先级】
求和小熊猫
2020/11/25
3610
Java 多线程系列(1) —— 线程入门
SpringBoot整合Thymeleaf
可能在开发过程中,大家会觉得每次更改页面后,都要重新重启服务,很是麻烦与反人类,可以通过配置热启动来改善(即上面的写法:spring.thymeleaf.cache=false)
用户10198968
2022/12/21
1.4K1
Thymeleaf引擎支持Multi Prefix
最近团队的一个项目在重构,希望引入Thymeleaf减少页面端的代码复杂性。在重构过程中,发现html文件需要保存在多个不同的目录中,但Thymeleaf缺省的实现不支持这种方式。
程序猿讲故事
2019/09/27
1K0
Thymeleaf引擎支持Multi Prefix
JsonUtil.java 递归反序列化一个复杂嵌套对象的 json
package com.teda.util; import java.lang.reflect.Array; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.u
一个会写诗的程序员
2019/12/11
2.7K0
Spring杂谈 | 你真的了解泛型吗?从java的Type到Spring的ResolvableType
Type是Java 编程语言中所有类型的公共高级接口(官方解释),也就是Java中所有类型的“爹”;其中,“所有类型”的描述尤为值得关注。它并不是我们平常工作中经常使用的 int、String、List、Map等数据类型,而是从Java语言角度来说,对基本类型、引用类型向上的抽象;
程序员DMZ
2020/07/06
2.3K0
探索 Spring Boot 高级应(四)用:Thymeleaf、全局异常处理与 AOP
大家好,我是默语,一个专注于分享技术干货的博主。这篇博客将深入探讨Spring Boot的高级应用,涵盖Thymeleaf模板引擎的集成、全局异常处理以及AOP切面的实现。通过丰富的代码案例和详细的讲解,希望能够帮助大家全面掌握这些高级技术,提高项目的开发效率和代码质量。关键词包括Spring Boot集成Thymeleaf、全局异常处理、Spring Boot AOP等。
默 语
2024/11/20
1450
实现一个简易的RPC
作者:黄青石 链接:https://www.cnblogs.com/huangqingshi/p/12289820.html
好好学java
2020/03/05
4060
Spring Boot 集成Thymeleaf
thymeleaf 语法——input、select、radio、textarea 回显
HLee
2021/03/09
2.2K0
Spring Boot 集成Thymeleaf
风骚的操作:区块链监控个人账户即时在线充值
在区块链的世界里,常常很多时候用户需要充值,要不拉起钱包,要不支付到某个特定账号,这个时候可以监控合约交易记录实现实时到账,有的时候上某些网站的时候,至于是哪些网站,小编就不太好说了,有见过直接备注信息充值扫码支付到个人二维码,然后立马就会充值成功,那么这个是怎么实现的呢
肉眼品世界
2020/12/02
6700
thymeleaf--简单使用
用户8200753
2023/10/22
1510
thymeleaf--简单使用
使用thymeleaf生成mybatis模板
我们在使用mybatis做数据库访问的时候,有很多重复的东西要写,如DAO里面的增删改查,mapper/provider里面的各种东东,还有实体类,其实这些都是可以通过名称关联起来的,因此就有这么一个需求,去写一个工具类,根据模板去生成这些文件
微笑的小小刀
2019/07/30
1.1K0
dubbo/dubbox 增加原生thrift及avro支持
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但是依赖的版本较早,只支持0.8.0,而且还对协议做一些扩展,并非原生的thrift协议。 github上虽然也有朋友对dubbo做了扩展支持原生thrift,但是代码实在太多了,只需要一个类即可: Thrift2Protocal.java: package com.alibaba.dubbo.rpc.proto
菩提树下的杨过
2018/01/18
1.2K0
CGLIB动态代理实现原理
CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,
Java栈
2019/07/28
2.3K0
推荐阅读
相关推荐
JAVA安全之Thymeleaf模板注入检测再探
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验