日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java反射機制清空字符串導(dǎo)致業(yè)務(wù)異常分析

openEuler ? 來源:openEuler ? 作者:openEuler ? 2022-06-22 11:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

編者按筆者在處理業(yè)務(wù)線問題時遇到接口返回的內(nèi)容和實際內(nèi)容不一致的現(xiàn)象。根因是業(yè)務(wù)方通過Java反射機制將String類型敏感數(shù)據(jù)引用的value數(shù)組元素全部設(shè)置為'0',從而實現(xiàn)清空用戶敏感數(shù)據(jù)的功能。這種清空用戶敏感數(shù)據(jù)的方法會將字符串常量池相應(yīng)地址的內(nèi)容修改,進(jìn)而導(dǎo)致所有指向該地址的引用的內(nèi)容和實際值不一致的現(xiàn)象。

背景知識

JVM為了提高性能和減少內(nèi)存開銷,在實例化字符串常量時進(jìn)行了優(yōu)化。JVM在Java堆上開辟了一個字符串常量池空間(StringTable),JVM通過ldc指令加載字符串常量時會調(diào)用 StringTable::intern 函數(shù)將字符串加入到字符串常量池中。

  • StringTable::intern函數(shù)代碼
    oopStringTable::intern(Handlestring_or_null,jchar*name,
    intlen,TRAPS){
    unsignedinthashValue=hash_string(name,len);
    intindex=the_table()->hash_to_index(hashValue);
    oopfound_string=the_table()->lookup(index,name,len,hashValue);
    
    //Found
    if(found_string!=NULL){
    ensure_string_alive(found_string);
    returnfound_string;
    }
    
    debug_only(StableMemoryCheckersmc(name,len*sizeof(name[0])));
    assert(!Universe::heap()->is_in_reserved(name),
    "proposednameofsymbolmustbestable");
    
    Handlestring;
    //trytoreusethestringifpossible
    if(!string_or_null.is_null()){
    string=string_or_null;
    }else{
    string=java_lang_String::create_from_unicode(name,len,CHECK_NULL);
    }
    
    #ifINCLUDE_ALL_GCS
    if(G1StringDedup::is_enabled()){
    //Deduplicatethestringbeforeitisinterned.Notethatweshouldnever
    //deduplicateastringafterithasbeeninterned.Doingsowillcounteract
    //compileroptimizationsdoneone.g.internedstringliterals.
    G1StringDedup::deduplicate(string());
    }
    #endif
    
    //GrabtheStringTable_lockbeforegettingthe_table()becauseitcould
    //changeatsafepoint.
    oopadded_or_found;
    {
    MutexLockerml(StringTable_lock,THREAD);
    //Otherwise,addtosymboltotable
    added_or_found=the_table()->basic_add(index,string,name,len,
    hashValue,CHECK_NULL);
    }
    
    ensure_string_alive(added_or_found);
    
    returnadded_or_found;
    }
    
    
  • StringTable::intern 函數(shù)處理流程

    8346ea3e-f150-11ec-ba43-dac502259ad0.png

  • 字符串的創(chuàng)建方式

    根據(jù)StringTable::intern函數(shù)處理流程,我們可以簡單描繪如下6種常見的字符串的創(chuàng)建方式以及引用關(guān)系。

835414ac-f150-11ec-ba43-dac502259ad0.png


		

現(xiàn)象

某業(yè)務(wù)線使用fastjson實現(xiàn)Java對象序列化功能,低概率出現(xiàn)接口返回的JSON數(shù)據(jù)的某個屬性值和實際值不一致的現(xiàn)象。正確的屬性值應(yīng)該為"null",實際屬性值卻為"0000"。

原因分析

為了排除fastjson自身的嫌疑,我們將其替換jackson后,依然會低概率出現(xiàn)同樣的現(xiàn)象。由于兩個不同三方件同時存在這個問題的可能性不大,為此我們暫時排除fastjson引入該問題的可能性。為了找到該問題的根因,我們在環(huán)境中開啟遠(yuǎn)程調(diào)試功能。待問題復(fù)現(xiàn),調(diào)試代碼時我們發(fā)現(xiàn)只要是指向"null"的引用,顯示的內(nèi)容全部變成"0000",由此我們初步懷疑字符串常量池中的"null"被修改成"0000"。

一般導(dǎo)致常量池被修改有兩種可能性:

  1. 第三方動態(tài)庫引入的bug導(dǎo)致字符串常量池內(nèi)容被修改;
  2. 在業(yè)務(wù)代碼中通過Java反射機制主動修改字符串常量池內(nèi)容;

業(yè)務(wù)方排查項目中使用到的第三方動態(tài)庫,未發(fā)現(xiàn)可疑的動態(tài)庫,排除第一種可能性。排查業(yè)務(wù)代碼中使用到Java反射的功能,發(fā)現(xiàn)清空密碼功能會使用到Java反射機制,并且將String類型密碼的value數(shù)組元素全部設(shè)置為'0'。

業(yè)務(wù)出現(xiàn)的現(xiàn)象可以簡單通過代碼模擬

  1. 在TestString對象類中定義一個nullStr屬性,初始值為"null";
  2. 定義一個帶有password屬性的User類;
  3. 在main方法中創(chuàng)建一個密碼為"null"的User對象,使用Java反射機制將密碼字符串的所有字符全部修改為'0',分別在密碼修改前后打印TestString對象nullStr屬性值;

復(fù)現(xiàn)代碼

importjava.lang.reflect.Field;
importjava.util.Arrays;

publicclassTestString{
privateStringnullStr="null";

publicStringgetNullStr(){
returnnullStr;
}

staticclassUser{
privatefinalStringpassword;

User(Stringpassword){
this.password=password;
}

publicStringgetPassword(){
returnpassword;
}
}

privatestaticvoidclearPassword(Useruser)throwsException{
Fieldfield=String.class.getDeclaredField("value");
field.setAccessible(true);
char[]chars=(char[])field.get(user.getPassword());
Arrays.fill(chars,'0');
}

publicstaticvoidmain(String[]args)throwsException{
Useruser=newUser("null");
TestStringtestString=newTestString();
System.out.println("beforeclearpassword>>>>");
System.out.println("User.password:"+user.getPassword());
System.out.println("TestString.nullStr:"+testString.getNullStr());
System.out.println("--------------------------------");
clearPassword(user);
System.out.println("afterclearpassword>>>>");
System.out.println("User.password:"+user.getPassword());
System.out.println("TestString.nullStr:"+testString.getNullStr());
}
}

復(fù)現(xiàn)代碼字符串引用關(guān)系如下圖所示。

83671084-f150-11ec-ba43-dac502259ad0.png

User對象的password屬性和TestString的nullStr屬性引用都同時指向常量池中的"null"字符串,"null"字符串的value指向 {'n','u','l','l'} char數(shù)組。使用Java反射機制將User對象的password屬性引用的value數(shù)組全部設(shè)置為'0',導(dǎo)致TestString的nullStr屬性值也變成了 "0000"。

輸出結(jié)果如下:

beforeclearpassword>>>>
User.password:null
TestString.nullStr:null
--------------------------------
afterclearpassword>>>>
User.password:0000
TestString.nullStr:0000

通過輸出結(jié)果我們可以發(fā)現(xiàn)在通過Java反射機制修改某一個字符串內(nèi)容后,所有指向原字符串的引用的內(nèi)容全部變成修改后的內(nèi)容。

總結(jié)

在保存業(yè)務(wù)敏感數(shù)據(jù)時避免使用String類型保存,建議使用byte[]或char[]數(shù)組保存,然后通過Java反射機制清空敏感數(shù)據(jù)。

后記

如果遇到相關(guān)技術(shù)問題(包括不限于畢昇 JDK),可以通過 Compiler SIG 求助。Compiler SIG 每雙周周二舉行技術(shù)例會,同時有一個技術(shù)交流群討論 GCC、LLVM 和 JDK 等相關(guān)編譯技術(shù),感興趣的同學(xué)可以添加如下微信小助手入群。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67871
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    161

    瀏覽量

    13088
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    27476

原文標(biāo)題:Java反射機制清空字符串導(dǎo)致業(yè)務(wù)異常分析

文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    黑馬-Java+AI新版V16零基礎(chǔ)就業(yè)班百度云網(wǎng)盤下載+Java+AI全棧開發(fā)工程師

    默認(rèn)結(jié)果,金融風(fēng)控場景則更需要顯式拒絕。此外,建立模型輸出的運行時校驗層,檢測業(yè)務(wù)規(guī)則違例、特征合理性越界等情況,并可通過飛輪機制異常樣本記錄用于模型迭代。這些工程細(xì)節(jié)常被忽視,卻直接決定了系統(tǒng)從
    發(fā)表于 05-01 11:29

    [完結(jié)15章]Java轉(zhuǎn) AI高薪領(lǐng)域必備-從0到1打通生產(chǎn)級AI Agent開發(fā)

    拒絕原地踏步:Java工程師AI轉(zhuǎn)型的底層技術(shù)破局之道 在軟件工程范式被大語言模型(LLM)徹底顛覆的今天,傳統(tǒng)的“Java CRUD boy”正面臨著前所未有的生存危機。當(dāng)業(yè)務(wù)邏輯的生成可以被
    發(fā)表于 04-30 13:46

    飛凌嵌入式ElfBoard-環(huán)境變量之添加修改環(huán)境變量setenv

    ,不會出現(xiàn)由于字符串的生命周期導(dǎo)致環(huán)境變量失效的問題。1)頭文件#include 2)函數(shù)原型int setenv(const char *name, const char *value, int
    發(fā)表于 03-26 09:24

    求助 LabVIEW 字符串比較

    請教大神 ,用一個字符串和多個字符串比較程序應(yīng)該怎么做。 比如:A字符串和B字符串組(B組字符串個數(shù)不定可以是一個也可以是10個) 比較 A
    發(fā)表于 03-02 17:24

    打開工程后工程中的字體沒有顯示,如字符串,數(shù)字等控件不能預(yù)覽顯示字體?

    打開工程后工程中的字體沒有顯示,如字符串,數(shù)字等控件不能預(yù)覽顯示字體?
    發(fā)表于 02-25 17:39

    字符串控件與靜態(tài)字符串控件中預(yù)覽字符顯示亂碼,如何修改顯示正常?

    字符串控件與靜態(tài)字符串控件中預(yù)覽字符顯示亂碼,如何修改顯示正常?
    發(fā)表于 01-20 17:17

    字符串,數(shù)字控件如何控制背景顏色和前景字體顏色?

    字符串,數(shù)字控件如何控制背景顏色和前景字體顏色?
    發(fā)表于 01-20 15:12

    Linux下怎么讓中文字符串按照拼音排序?

    求教 Linux 下怎么讓中文字符串按照拼音排序?
    發(fā)表于 01-06 07:40

    分析嵌入式軟件代碼的漏洞-代碼注入

    字符串。在這種情況下,沒有更多的參數(shù),但機器在執(zhí)行的時候并不了解這一點; 它所知道的全部是,函數(shù)的一些參數(shù)已經(jīng)被推送到堆棧。 因為在C運行時沒有機制可以告訴機器已經(jīng)沒有更多的參數(shù)了,所以printf將
    發(fā)表于 12-22 12:53

    字符串關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16位數(shù)據(jù),可以使用16位數(shù)字變量顯示字符串嗎?

    字符串關(guān)聯(lián)數(shù)字變量如何使用?我們的地址都是16位數(shù)據(jù),可以使用16位數(shù)字變量顯示字符串嗎?
    發(fā)表于 12-15 08:24

    C++程序異常的處理機制

    的健壯不僅僅有算法上的優(yōu)越性,還存在程序?qū)Ω鞣N異常情況的識別和處理能力,如果對這些異常沒有得到較好的處理,就非常容易引起程序的奔潰。 那么C++設(shè)計了一套異常處理機制,一方面能夠使得
    發(fā)表于 12-02 07:12

    飛凌嵌入式ElfBoard-標(biāo)準(zhǔn)IO接口之格式化輸出

    寫入的字符數(shù)(不包括加在字符串末尾的結(jié)束空字符);如果出錯,返回負(fù)值。5)示例:(將數(shù)據(jù)寫入緩沖區(qū),再寫入標(biāo)準(zhǔn)輸出)#include int main(){char buf[30];sprintf
    發(fā)表于 11-11 08:43

    labview如何生成一個帶字符串返回的dll

    labview如何生成一個dll,如下圖,要求一個輸入,類型是字符串,返回類型也是字符串
    發(fā)表于 08-28 23:20

    在Python中字符串逆序有幾種方式,代碼是什么

    對于一個給定的字符串,逆序輸出,這個任務(wù)對于python來說是一種很簡單的操作,畢竟強大的列表和字符串處理的一些列函數(shù)足以應(yīng)付這些問題 了,今天總結(jié)了一下python中對于字符串的逆序輸出的幾種常用
    的頭像 發(fā)表于 08-28 14:44 ?1319次閱讀

    harmony-utils之StrUtil,字符串工具類

    ,致力于助力開發(fā)者迅速構(gòu)建鴻蒙應(yīng)用。其封裝的工具涵蓋了APP、設(shè)備、屏幕、授權(quán)、通知、線程間通信、彈框、吐司、生物認(rèn)證、用戶首選項、拍照、相冊、掃碼、文件、日志、異常捕獲、字符、字符串、數(shù)字、集合
    的頭像 發(fā)表于 07-03 11:32 ?821次閱讀
    昔阳县| 满洲里市| 老河口市| 耒阳市| 随州市| 淮滨县| 福清市| 清水河县| 贵定县| 保康县| 昌吉市| 博乐市| 神农架林区| 古田县| 宁津县| 惠水县| 南充市| 西乌珠穆沁旗| 漠河县| 邛崃市| 增城市| 宿州市| 兴和县| 廉江市| 南靖县| 鸡东县| 寻乌县| 新源县| 木兰县| 苏尼特右旗| 大连市| 大宁县| 郑州市| 玛曲县| 沂源县| 五指山市| 西华县| 内黄县| 清徐县| 南康市| 龙江县|