java 板


LINE

※ 引述《godfat (godfat 真常)》之銘言: : 我只能說我真的感到很吃驚,因為我從來沒想過可能會有這種事情 : 尤其又是在 Java 這種強調安全的程式語言當中,居然可以玩這種花招 : 這是在 comp.lang.c++.moderated 看來的(咦?) : topic 是 The D Programming Language(咦咦?) : 內容是在講 Java 的 string literal(咦咦咦?) : well, 我不太會找連結,有人願意的話可以幫忙提供個 link : 這邊就引用一些來自那裡的文章,希望作者不會介意 : (順便補上一點翻譯好了,不過我只翻重點) : Niklas Matthies wrote: : > Well, it depends what one considers "basic". It's possible in Java to : > have the statement : > System.out.println("Hello, world!"); : 這行 Java 敘述,是有可能- : > output "Suprise!" (or any other arbitrary string), by appropriate : > preceding code. : 印出 "Suprise!"(或是其他任何的字串),藉由印出字串前的一些手段。 : > (This is because string literals within a class are guaranteed to be : > shared, so a different occurrence of "Hello, world!" in the source : > code can be used to manipulate the contents of that shared String : > object.) : 因為字面字串是被共享的。 : 有人問起了這怎麼可能?(How is it possible? - by Andrei Alexandrescu) : 於是 Niklas Matthies 就提供了 code... : 我做了一點修改,增加一些其他人提供的例子 : class Test : { : public static void main(String[] args) throws Exception : { : java.util.HashSet<String> set = new java.util.HashSet<String>(); : set.add("Hello, World!"); : doEvil(); : set.add("Hello, World!"); : System.out.println(set); // prints "[Surprise!, Surprise!]" : System.out.println("Hello, World!"); // prints "Surprise!" : System.out.println("Hello, World!".indexOf('H')); // prints -1 : String s = new String("Hello, World!"); : System.out.println(s); // prints "Surprise!" : } : static void doEvil() throws Exception : { : String s = "Surprise!"; : String hw = "Hello, World!"; : setField(hw, "value", s.toCharArray()); : setField(hw, "count", Integer.valueOf(s.length())); : setField(hw, "hash", Integer.valueOf(0)); : } : static void setField(Object object, String name, Object value) : throws Exception : { : java.lang.reflect.Field : field = object.getClass().getDeclaredField(name); : field.setAccessible(true); : field.set(object, value); : } : } : 另外也有人說,有個網站上也有一篇文章指出這個問題 : (做了一點編輯上的修改) : peter koch larsen : Andrei Alexandrescu (See Website For Email) skrev: : > I didn't know that! How is it possible? Got code? Heck, it's not : > possible in many C and C++ implementations - they put constant strings : > in read-only pages. : cheers! Andrei, : I accidently fell over an article called something like : "hi there".equals("cheers !") == true : and skimming the article shows that this is exactly the article you : requested. It is referenced at Kevlin Heeney'(?)s web (curbralan?), and : I believe it was an article from Artima. Anyway, a quick google should : get you home no sweat. : hi there : Peter : 有興趣的人可以去 google 看看,我是懶得看了 : 而我因為好奇而稍微翻了一下 Java API reflection 的部份, : 大概知道是發生了什麼事情。上面紅色標起來的那段程式是重點。 : 他找到了 string literal 的儲存所在地,然後修改那段記憶體裡的東西, : 於是,Surprise! : 重點就是,Java 為什麼允許這樣的修改? : Niklas Matthies 說這是為了使程式不用在 debugging mode 下也能進行 debug. : 而,如果這個程式真的有安全性問題的話,應該要使用 SecurityManager : 來阻止這件事發生,也就是使得那行 field.setAccessible(true); 失敗 : Niklas Matthies : On 2006-12-15 13:23, James Kanze wrote: : > In the case of Java, the problem concerning literals may be the : > most shocking, externally, but the fact that you can modify a : > String after having passed it to another subsystem is far more : > serious, since it undermines many of Java's security measures. : No, it doesn't, because a security-conscious application will : run under a SecurityManager that will prevent such accesses : (the setAccessible() call will fail). : The motivation for enabling such accesses is of course for use by a : debugger without causing the debugging-enabled Java implementation to : become non-conformant. : -- Niklas Matthies : what a surprise! : 簡言之,reflextion 不要亂用,SecurityManager 有時候要考慮用一下。 http://groups.google.com.tw/group/comp.lang.c++.moderated/b rowse_thread/thread/a048420165ad4719/645ca9ac8aff4dab?lnk=st& q=%22it+depends+what+one+considers+%22basic%22%22&rnum=2& hl=zh-TW#645ca9ac8aff4dab 請自行接成一行 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.187.14.39







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP