最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的RASP機制實現(xiàn)詳解

 更新時間:2019年08月29日 10:37:57   作者:Solinx  
這篇文章主要介紹了Java中的RASP實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

RSAP

RASP是Gartner公司提出的一個概念,稱:程序不應該依賴于外部組件進行運行時保護,而應該自身擁有運行時環(huán)境保護機制;

RASP就是運行時應用自我保護(Runtime application self-protection)的縮寫,正如RASP字面意思一樣,這是運行在運行時的一種防護技能;也就是說RASP能夠在程序運行期間實施自我保護,監(jiān)控與過濾有害信息,還能夠擁結合程序的當前上下文實施精確、實時的防護;

Java中的RASP

不嚴格來說Java是半編譯、半解釋型語言,我們也都知道Java中也有運行時(Runtime)那Java的運行時在哪呢?

不急,我們先看看Java從編譯到運行的流程圖;

上圖的流程為:Java編譯程序如Javac編譯.java源碼文件,生成Java字節(jié)碼文件.class,接著.class文件進入JVM中解釋執(zhí)行; 從中我們可以看到Java的最后執(zhí)行階段是在JVM中,也就可以說Runtime運行時是JVM的重要組成部分;除此之外我們還發(fā)現(xiàn)

Java中實現(xiàn)RASP的幾個關鍵點:

1、 我們的防護程序必須能夠分析、修改java的.class文件;

2、 必須在JVM解釋執(zhí)行.class文件時進行注入(Java Runtime);

通過上面的分析我們知道了要實現(xiàn)Java的RASP所要具備的能力,然后我們發(fā)現(xiàn)在Java中有Javassist、與ASM可以實現(xiàn)對Java字節(jié)碼的修改;有了修改.class字節(jié)碼文件的技能,還需要能夠在Java運行期間注入我們的防護程序,通過上面我們發(fā)現(xiàn)Java運行時是發(fā)生在JVM中,通過查找相關資料與JVM參數(shù)發(fā)現(xiàn)在JVM參數(shù)中有-javaagent參數(shù)配置Java代理可以在 運行時注入我們的防護程序;

Java RASP實現(xiàn)

在上面的分析中我們發(fā)現(xiàn)只要在JVM的-javaagent參數(shù) 中配置我們的保護程序,就能夠輕松實現(xiàn)Java的RASP;

Java代理程序入口類需要有名為premain的靜態(tài)方法 ,還需要在jar的META-INF/MAINIFEST.MF文件中包含 Premain-Class配置,下面是RASP保護程序的入口類;

JavaRASPApp:

/**
 * @author linx
 * @date 2017-06-25
*/
public class JavaRASPApp {

 public static void premain(String agentArgs, Instrumentation instru) throws ClassNotFoundException, UnmodifiableClassException {
  System.out.println("premain");
  instru.addTransformer(new ClassTransformer());
 }
}

ClassTransformer類實現(xiàn)了Java的代理程序機制提供的ClassFileTransformer接口 ,能夠在運行時(Runtime)對類的字節(jié)碼進行替換與修改;

ClassTransformer也很簡單,只有一個實現(xiàn)方法:transform,此方法中可以獲取得到ClassLoader、className、classfileBuffer等,分別為類加載器、類名、字節(jié)碼 ;

此時我們可以在transform方法中做文章,實現(xiàn)我們的防護程序;

/**
 * @author linxin
 * @version v1.0
 *     Copyright (c) 2017 by linx
 * @date 2017/6/23.
*/
 public class ClassTransformer implements ClassFileTransformer {
 public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer){
  byte[] transformeredByteCode = classfileBuffer;
  try {

    if (className.equals("co/solinx/demo/Test")) {
      System.out.println(String.format("transform start %s",className));
      ClassReader reader = new ClassReader(classfileBuffer);
      ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
      ClassVisitor classVisitor = (ClassVisitor) createVisitorIns("co.solinx.demo.visitor.TestVisitor", writer, className);
      reader.accept(classVisitor, ClassReader.EXPAND_FRAMES);
      transformeredByteCode = writer.toByteArray(); 
    }
  } catch (Exception e) {
    e.printStackTrace();
  }catch (Throwable t){
    t.printStackTrace();
  }
  return transformeredByteCode;
}
 public Object createVisitorIns(final String name, ClassVisitor cv, String className)
    throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException {
  Constructor<?> ctor = Class.forName(name).getDeclaredConstructor(new Class[]{ClassVisitor.class, String.class});
  ctor.setAccessible(true);
  return ctor.newInstance(new Object[]{cv, className});
 }
}

可以看到我們在transform方法中co/solinx/demo/Test類進行攔截,并通過ASM修改字節(jié)碼注入我們的保護邏輯,下面代碼是TestVisitorAdapter類中的onMethodEnter方法實現(xiàn)了通過ASM調用攔截器,拋出異常的字節(jié)碼;

@Override
protected void onMethodEnter() { 
  mv.visitTypeInsn(NEW,"co/solinx/demo/filter/SqlFilter");
  mv.visitInsn(DUP);
  mv.visitMethodInsn(INVOKESPECIAL,"co/solinx/demo/filter/SqlFilter","<init>","()V",false);
  mv.visitVarInsn(ASTORE,2);
  mv.visitVarInsn(ALOAD,2);
  mv.visitVarInsn(ALOAD,1);
  mv.visitMethodInsn(INVOKEVIRTUAL,"co/solinx/demo/filter/SqlFilter", "filter","(Ljava/lang/Object;)Z",false);
  Label label = new Label();
  /**
   * IFEQ filter返回值也就是棧頂int型數(shù)值等于true時跳轉,拋出異常
   */
  mv.visitJumpInsn(IFEQ, label); 
  mv.visitTypeInsn(NEW, "java/sql/SQLException");
  mv.visitInsn(DUP);
  mv.visitLdcInsn("invalid sql because of security check");
  mv.visitMethodInsn(INVOKESPECIAL, "java/sql/SQLException", "<init>", "(Ljava/lang/String;)V", false);
  mv.visitInsn(ATHROW);
  mv.visitLabel(label);
  /**
   * 必須要調該方法,手動設置Stack Map Table,否則會有 java.lang.VerifyError: Expecting a stackmap frame at branch target 26異常
   * 在jdk1.7中可以使用JVM參數(shù)-UseSplitVerifier,關掉class驗證,但jdk1.8中該參數(shù)已經(jīng)去掉,所以要在1.8中運行必須調用該方法;
   */
  mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
 } 

SqlFilter攔截類:

public class SqlFilter {
public boolean filter(Object sql){
  boolean ret=false;
  System.out.println(String.format("sql filter : %s ",sql));
  if(sql.toString().contains("1=1")){
    ret=true;
  }
  return ret;
}
}

TestVisitorAdapter類中的onMethodEnter方法中通過調用filter攔截器,返回true就是被攔截了,拋出異常,否則放行;至此一個簡單的JAVA RASP demo就完成了; 通過后面的方式即可使用我們的RASP程序:java -javaagent:respjar-1.0-SNAPSHOT.jar app.jar;

通過RASP可以通過無嵌入、無需修改代碼的實現(xiàn)安全保護,在RASP中可以攔截SQL、會話、有害請求、OGNL等等信息;

Demo源碼:https://github.com/linxin26/javarespdemo

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Springboot中的Controller解析

    Springboot中的Controller解析

    這篇文章主要介紹了Springboot中的Controller解析,Controller是SpringBoot的基本組件,也是MVC結構的組成部分,其作用是將用戶提交來的請求通過URL匹配,分發(fā)給不同的接收器,該接收器會對其進行相應處理,然后返回處理結果,需要的朋友可以參考下
    2023-09-09
  • SpringBoot項目中定時器的實現(xiàn)示例

    SpringBoot項目中定時器的實現(xiàn)示例

    在Spring?Boot項目中,你可以使用Spring框架提供的@Scheduled注解來編寫定時任務,本文就來介紹一下SpringBoot項目中定時器的實現(xiàn),感興趣的可以了解一下
    2023-11-11
  • Java獲取當前時間并轉化為yyyy-MM-dd?HH:mm:ss格式的多種方式

    Java獲取當前時間并轉化為yyyy-MM-dd?HH:mm:ss格式的多種方式

    這篇文章主要介紹了Java獲取當前時間并轉化為yyyy-MM-dd?HH:mm:ss格式的多種方式,每種方式結合實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Java異常體系非正常停止和分類

    Java異常體系非正常停止和分類

    這篇文章主要介紹了Java異常體系非正常停止和分類,指的是程序在執(zhí)行過程中,出現(xiàn)的非正常的情況,最終會導致JVM的非正常停止更多相關內容需要的朋友可以參考一下
    2022-06-06
  • MapStruct升級遇到的問題及解決方案

    MapStruct升級遇到的問題及解決方案

    MapStruct是一個用于生成類型安全,本文來介紹一下MapStruct升級遇到的問題及解決方案,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • 詳解如何為SpringBoot Web應用的日志方便追蹤

    詳解如何為SpringBoot Web應用的日志方便追蹤

    在Web應用程序領域,有效的請求監(jiān)控和可追溯性對于維護系統(tǒng)完整性和診斷問題至關重要,SpringBoot是一種用于構建Java應用程序的流行框架,在本文中,我們探討了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以參考下
    2023-11-11
  • Quartz定時任務管理方式(動態(tài)添加、停止、恢復、刪除定時任務)

    Quartz定時任務管理方式(動態(tài)添加、停止、恢復、刪除定時任務)

    這篇文章主要介紹了Quartz定時任務管理方式(動態(tài)添加、停止、恢復、刪除定時任務),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實現(xiàn)插入公式到PPT的示例代碼

    Java實現(xiàn)插入公式到PPT的示例代碼

    PPT中可插入公式,用于放映時演示相關內容的論證、推算的依據(jù)。通過代碼,我們可借助特定的工具來實現(xiàn)在PPT中的插入公式,本文將對此作詳細介紹
    2022-07-07
  • java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂)

    這篇文章主要介紹了java 實現(xiàn)簡單圣誕樹的示例代碼(圣誕節(jié)快樂),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • java中自定義Spring Security權限控制管理示例(實戰(zhàn)篇)

    java中自定義Spring Security權限控制管理示例(實戰(zhàn)篇)

    本篇文章主要介紹了java中自定義Spring Security權限控制管理示例(實戰(zhàn)篇) ,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-02-02

最新評論

全州县| 二连浩特市| 理塘县| 沙湾县| 双鸭山市| 巨鹿县| 汪清县| 虎林市| 锡林浩特市| 三门县| 抚远县| 怀远县| 洮南市| 黔西| 临夏县| 甘泉县| 托里县| 同德县| 汕头市| 新蔡县| 鸡东县| 仲巴县| 皋兰县| 财经| 南华县| 平原县| 大同县| 武穴市| 临安市| 西乡县| 崇左市| 大洼县| 信宜市| 黄浦区| 彭州市| 九龙城区| 沛县| 崇明县| 上林县| 普安县| 衡水市|