Groovy安全高效的执行(死循环,休眠,危险方法)

这篇具有很好参考价值的文章主要介绍了Groovy安全高效的执行(死循环,休眠,危险方法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

在很多场景下有需要执行异步任务,或者执行用户的自定义任务时,通常我们会使用Groovy脚本能力来完成任务。通过groovy动态脚本能力,在业务执行过程中动态执行不同业务线或者用户的脚本,来满足不同需求。
这样可以非常方便的进行业务拓展,但是也会带来一系列安全问题,
1 比如在脚本中调用了系统危险的方法,如System.exit 会导致整个服务停止
2 触发了死循环等场景,会导致任务卡死,使用多线程的话线程也很块就被占完。
3 使用Thread.sleep 将线程进行休眠

解决方案

关于以上三类问题,这里也进行了归纳总结,给出对应的方案

死循环执行

1 先定义一个死循环执行脚本,功能就是一直打印就可以了

    private static String script = "import groovy.transform.TimedInterrupt\n" +
            "\n" +
            "import java.util.concurrent.TimeUnit\n" +
            "\n" +
            "class GroovyScriptTest {\n" +
            "    public String execute(String key) {\n" +
            "        while (true) {\n" +
            "            print(11);\n" +
            "        }\n" +
            "        return key + \":updated\";\n" +
            "    }\n" +
            "}\n";

为了方便查看生成后的源码,这里将生成的目录设置为target目录下

  public class GroovyClassLoaderTest2 {
    private static String script = "import groovy.transform.TimedInterrupt\n" +
            "\n" +
            "import java.util.concurrent.TimeUnit\n" +
            "\n" +
            "class GroovyScriptTest {\n" +
            "\n" +
            "    public String execute(String key) {\n" +
            "        while (true) {\n" +
            "            print(11);\n" +
            "        }\n" +
            "        return key + \":updated\";\n" +
            "    }\n" +
            "}\n";

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {

        CompilerConfiguration config = new CompilerConfiguration();
        config.setTargetDirectory(GroovyClassLoaderTest2.class.getClassLoader().getResource("./").getPath());

        // 重置调用时间
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader(GroovyClassLoaderTest2.class.getClassLoader(), config);
        Class aClass = groovyClassLoader.parseClass(script);
        GroovyObject groovyObject = (GroovyObject) aClass.newInstance();
        Object o = groovyObject.invokeMethod("execute", "key");
        System.out.println("groovy执行结果:" + o);

    }

}

可以看到 运行起来后控制台一直在输出1,在实际业务场景中,我们需要对这种行为进行管控,可以使用Groovy自带的注解

@TimedInterrupt(unit = TimeUnit.MILLISECONDS, value = 1000L)

这里可以对方法进行执行时间设置,可以指定执行时间单位和时间,比如这里设置执行为1000ms,到时间后任务将自动结束
Groovy安全高效的执行(死循环,休眠,危险方法)
这样就达到了我们需要的效果。

Thread.sleep问题

在脚本中使用了指定睡眠时间的场景,如适用Thread.sleep(100000)会严重的拖慢了整体执行效率,此时可以通过Groovy自带的机制

@groovy.transform.ThreadInterrupt

添加此注解后,我们可以主动设置线程为已中断的,如果使用线程池的话可以使用futuretask的cancel(true)方式超时中断线程

危险方法调用

这里有两种方式,一种是通过执行过程中的拦截器进行处理,可以查看GroovyInterceptor,还有就是在编译期间就识别出来危险方法,在前置阶段进行拦截(SecureASTCustomizer.ExpressionChecker),核心代码如下:

public static class NoSupportClassTest implements SecureASTCustomizer.ExpressionChecker {
        @Override
        public boolean isAuthorized(Expression expression) {
            if (expression instanceof MethodCallExpression) {
                MethodCallExpression mc = (MethodCallExpression) expression;
                String className = mc.getReceiver().getText();
                String method = mc.getMethodAsString();

                System.out.println("=====>"+className + "." + method);

            }
            return true;
        }
    }

只要识别到需要拦截的方法,这里返回false就可以进行前置拦截。

原理分析

通过以上两种方式,可以对循环(for,while)和线程睡眠的方式进行拦截处理,到target目录下查看生成的class文件,在方法执行的时候会先判断线程是否已经被中断了,在每个循环执行的时候会判断下执行时间,这样组合起来就可以非常好的达到了我们需要的业务效果。Groovy安全高效的执行(死循环,休眠,危险方法)文章来源地址https://www.toymoban.com/news/detail-418638.html

完整代码

public class GroovyClassLoaderTest3 {
    private static String script = "import groovy.transform.TimedInterrupt\n" +
            "\n" +
            "import java.util.concurrent.TimeUnit\n" +
            "\n" +
            "class GroovyScriptTest {\n" +
            "\n" +
            "    @TimedInterrupt(unit = TimeUnit.MILLISECONDS, value = 1000L)\n" +
            "    @groovy.transform.ThreadInterrupt\n" +
            "    public String execute(String key) {\n" +
            "        while (true) {\n" +
            "            print(11);\n" +
            "        }\n" +
            "        return key + \":updated\";\n" +
            "    }\n" +
            "}\n";

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        CompilerConfiguration config = new CompilerConfiguration();
        config.setTargetDirectory(GroovyClassLoaderTest3.class.getClassLoader().getResource("./").getPath());

        SecureASTCustomizer secure = new SecureASTCustomizer();
        secure.addExpressionCheckers(new NoSupportClassTest());
        config.addCompilationCustomizers(secure);

        // 重置调用时间
        GroovyClassLoader groovyClassLoader = new GroovyClassLoader(GroovyClassLoaderTest3.class.getClassLoader(), config);
        Class aClass = groovyClassLoader.parseClass(script);
        GroovyObject groovyObject = (GroovyObject) aClass.newInstance();
        Object o = groovyObject.invokeMethod("execute", "key");
        System.out.println("groovy执行结果:" + o);

    }

    public static class NoSupportClassTest implements SecureASTCustomizer.ExpressionChecker {
        @Override
        public boolean isAuthorized(Expression expression) {
            System.out.println(expression);
            if (expression instanceof MethodCallExpression) {
                MethodCallExpression mc = (MethodCallExpression) expression;
                String className = mc.getReceiver().getText();
                String method = mc.getMethodAsString();

                System.out.println("=====>"+className + "." + method);

            }
            return true;
        }
    }

}


到了这里,关于Groovy安全高效的执行(死循环,休眠,危险方法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 构建安全高效的前端权限控制系统

    ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心哦!✨✨  🎈🎈作者主页: 喔的嘛呀🎈🎈 ✨✨ 帅哥美女们,我们共同加油!一起进步!✨✨  目录 引言 一、背景介绍 二 、具体实现方法 (1)用户角色管理 1. 安装依赖 2. 创建数据模型

    2024年04月11日
    浏览(54)
  • 设计安全高效网络的17个关键策略

    随着越来越多的业务流程走向数字化,拥有一个强大可靠的网络能够处理日益增长的日常流量对于维持生产力和服务至关重要。同时,网络攻击者永远不会停滞不前,每家组织都是潜在的目标。 技术领导者及其团队比以往任何时候更知道设计一种网络架构的重要性,以便提供

    2024年02月03日
    浏览(39)
  • 现浇钢筋混泥土楼板施工岗前安全VR实训更安全高效

    建筑行业天天与钢筋混凝土砼在,安全施工便成了企业发展的头等大事。 当今社会,人人都奉行生命无价,安全至上。可工地安全事故频繁发生,吞噬掉多少宝贵生命。破坏了多小个家庭?痛定死痛,为了提高施工人员的安全意识。 钢筋混泥土施工VR安全模拟培训具有许多益

    2024年02月10日
    浏览(45)
  • 机器学习中的智能安全:让安全更加智能化和高效

    作者:禅与计算机程序设计艺术 安全一直是人们头上的一个重担。在AI领域中,安全性也是需要关注的一点。所以,让机器学习模型更好的适应安全问题,将成为人工智能系统设计、研发和部署的重要方向之一。 随着科技的飞速发展,互联网的普及,越来越多的人将身边的电

    2024年02月15日
    浏览(64)
  • 基于风险的漏洞管理实现高效安全

    通常,网络中存在很多漏洞,修补和修复它们是一个永无止境的过程。但总会有这样的问题:“我应该首先补救什么?如果在我发现另一个开放漏洞之前就被攻击者利用怎么办?”  如何才能避免自己陷入怨恨和悔恨的想法中,希望先修复了这个漏洞,这样就可以阻止攻击。

    2024年02月04日
    浏览(49)
  • 黑客(网络安全)技术——如何高效自学

    前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习,最终也只是会无疾而终!黑客是一个大的概念,里面包含

    2024年02月06日
    浏览(42)
  • SecureCRT:高效安全的远程连接工具

    SecureCRT是一款功能强大的终端仿真工具,主要用于连接和运行包括Windows、UNIX和VMS在内的远程系统。它支持多种协议,如SSH1、SSH2、Telnet、SFTP、Rlogin、Serial、SCP等,确保用户与目标设备之间的通信安全,并防止网络攻击和窥探。 SecureCRT具备诸多高级功能,如多标签会话管理、

    2024年04月22日
    浏览(37)
  • 如何同时安全高效管理多个谷歌账号?

    您的业务活动需要多个 Gmail 帐户吗?出海畅游,Gmail账号是少不了的工具之一,可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台,可以说是海外网络的“万能锁”。但是大家都知道,以上这些平台注册多账号如果产生关联,会影响账号安全。 Gmail账号也一样,关联了容易在

    2024年04月10日
    浏览(39)
  • rsync 远程同步----------安全高效的异地备份方案

    目录 一、rsync介绍 rsync和cp的区别 rsync和scp的区别 二、rsync同步方式 rsync备份的方式 三、配置rsync源服务器 ①本地复制 ②下行同步 ③上行同步 四、常用Rsync命令 五、配置源的两种表达方法 六、部署rsync下行同步 ①环境准备 ②配置rsync源服务器-----------(192.168.246.8) 1)修改

    2024年04月14日
    浏览(41)
  • 隧道信息化智能化施工安全管理:打造安全高效的建设环境

    隧道信息化智能化施工安全管理:打造安全高效的建设环境 隧道是现代城市交通的重要组成部分,【云南恩田智能】为了确保隧道施工过程中的安全,隧道信息化智能化施工安全管理成为不可或缺的一环。在这篇文章中,我们将探讨隧道人员车辆UWB精确定位、隧道气体检测、

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包