java 板


LINE

我只能说我真的感到很吃惊,因为我从来没想过可能会有这种事情 尤其又是在 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! 简言之,reflection 不要乱用,SecurityManager 有时候要考虑用一下。 -- Hear me exalted spirits. Hear me, be you gods or devils, ye who hold dominion here: I am a wizard without a home. I am a wonderer seeking refuge. Sacrifice --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18 ※ 编辑: godfat 来自: 220.135.28.18 (01/25 15:47)







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

请输入看板名称,例如:e-shopping站内搜寻

TOP