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灯, 水草

请输入看板名称,例如:BuyTogether站内搜寻

TOP