本文目录一览:
- 1、黑客帝国单机版攻略
- 2、怎么样才能写出安全的Java代码?不被黑客攻击?
- 3、什么是信用盘改单? 有谁知道的?
- 4、信用盘改单不需要密码
- 5、微信链接改单技术、谁会改?
- 6、黑客修改足球注单真的可以改吗JS
黑客帝国单机版攻略
我是魔兽的不是你说的那个的但是我找到了这个
尼奥之路》完全攻略
游戏一开始NEO在一个虚拟的空间里,这里会不断出现敌人。其实这个就是个各位玩家熟悉一下操作,打到你挂了以后游戏才正式开始。(注意:这时候电脑会根据玩家的表现来评估适合玩家的游戏难度) 第1关 和电影一样,第一关讲述的是特工来抓NEO的剧情,本关是类似与MGS的潜入类型关卡不需要杀敌,根据游戏中给的提示(画面上会有闪光的地方)走,来到一个办公室,开窗子来到外面做升降机上楼,当升降机停下后走出来会发生一段小剧情,剧情后出现一个警察,把他推下楼,继续沿着墙边走,小心不要掉下去了,继续做升降机来到楼顶,出现很多警察,把他们推倒,然后快速进门,这里大家要注意一下,一旦本警察抓主,马上按键挣脱,点慢了马上就GAMEOVER,进门后顺着楼梯一直向下走,来到一个房间,这里有3个警察,小心不要被抓到,从房间右边的紧急出口向下跑,有来到NEO的办公室,继续跟着提示跑到终点本关结素。 PS。本关的设计比较人性化,对于某写对潜入类型苦手的玩家在被抓一次后可以直接挑过此关。 第2关 从本关以后的好几关都是叙述NEO怎样学习武功,虽然电影里NEO只是翻了几下白眼就说(I KNOW GONGFU)但是游戏中制作者把NEO学习功夫的剧情做为关卡详细的呈现给大家。本关开始NEO打扮成DOA里"李剑"华丽登场,而且连打人的动作都差不多,根据游戏的教学提示一直杀过去,中间没有分支,一直杀到头就是BOSS战。 BOSS战:很简单,回避到后面,发动FORCE,3招就能解决,但是要注意不要给他抓到,解决他以后本关结素。 PS:从本关以后,没关开始前都会让大家选择FORCE,在选择的时候可以按X键查看这个FORCE的功能和发动方法,并配有动画显示 第3关 本关是教导玩家怎样使用格斗武器,一开始玩家手上就有把日本刀,并且会得到新的FORCE,,根据教学提示把本关的敌人杀完OK了, 第4关 一上来就是BOSS战,BOSS是个日本武士,耍刀很厉害,多注意用刚刚学到的FORCE,打一会催尼缔会来帮忙,BOSS会用影分身之术,不过分身都不厉害,两人合作能轻松搞定。接着进入下半部分,一开始是在一个庭院里,冲过去砍死几个敌人,进入房间,房间里有BOSS,但是现在还杀不了他,跟着他走,路上他会放火墙,发动FORCE后在按X能跳过去,一路上有杂兵骚扰,全部灭之,杀到最里面的房间就是BOSS战,这个BOSS是个BC,没有特定打法,喜欢怎样虐待他,请大家自便吧。 第5关 相当恶搞的一关,场景是在一个中国的小酒馆里,任务为在限定时间里得到尽可能搞的分数。接着EG开始,从门外冲进一堆斧头帮帮众(样子和某电影里的一样)而且还打叫,"我要宰了你"(绝对中文发音)拿起旁边的斧子上去和他们对砍,坚持到时间结素即可过关。要注意的是后面会出现扔飞斧的敌人要小心 第6关 本关同样是教学关,不过只能使用射击武器,场景一样是中国,BOSS也是一开始出现,但是杀不了,跟着他整栋楼跑几次,最后来到顶楼才能杀他,本关的敌人同样全部持枪,而且火力很猛,多使用FORCE来躲子弹,打BOSS时先把旁边的杂兵杀完,如果你的HP还有1半以上,就去和BOSS硬拼吧。 第7关 终于来到电影中最精彩剧情之一 摩非斯 VS NEO, 摩非斯的攻击强,被他连到一套可不是开玩笑的,使用战术能很快解决他,打死他一次后,会他又会加满血和你打一次,并且给你新的FORCE。再次打败他后,进入下半部分,你必须比他先到达电话所在地,路上要跳好几个坑,还要爬抢,使用FORCE+跳能轻松过去,难点在最后一面墙那里,这面墙很高,所以FORCE的2段条也上不去,必须要先贴着右边或者左边跑,先跳到正面墙上,然后再跳到旁边的墙上如此反复3次即可。 第8关 到了本关游戏才真正开始,摩非斯带NEO去见先知,回来的路上被围捕,一开始NEO就和大家分开了,得到新的FORCE能打坏有裂缝的墙,本关象个迷宫一样,大家要多注意墙壁,看到裂缝就打破才能有新的通路,路上的敌人全是持枪警察,想怎么打随便玩家选择,个人推荐肉搏。 一直来到顶楼发生剧情摩非斯为了让众人撤退对子面对特工,NEO带着大家逃跑,路上出来的警察全部打倒会出现C4炸弹,根据催尼缔的提示把炸弹安放好,并且爆破。当来到第2根柱子的时候刚刚放好炸弹,NEO又被强行和大家分开,这是千万不要引爆炸弹,不然自己上西天,等同伴说完话后发生剧情,之后会出现一个特工,他是打不死的,就算把他打到台下也不会死,尽量和他周旋,过一会同伴会炸开墙,然后马上用FORCE跳过去,剧情后顺路走,消灭路上的敌人到达出口本关结素。 第9关 又是经典剧情之一,尼欧和催尼缔前去就摩非斯,一开始在大堂里出现成批敌人,不过全都是小白,各位在这里可以随意耍COOL,一共会增援3批敌人,第3批增援是4个小BOSS,不过都很菜。把敌人全灭后就可以进入下半部分,下半部分是在楼顶打,特工会出现好几次,而且普通攻击对他无效,要杀死他只能把他打到高压电上,或者打到楼下,而且敌人还会不段增援再加上有时间限制,可以说是很有难度的一关,在杀完一定数目的敌人后发生剧情,出现30秒倒计时,这时不要管旁边的敌人,直接往直升机方向跑,跑到大楼边缘的时候马上发动FORCE二段跳跳上飞机。
之后是最难的地方,在飞机上用机枪消灭房顶的敌人,打一会后会出现敌人的飞机,这时摩非斯的HP开始报警,注意这时候会有特工出现,要打死特工必须用FORCE射击,还有就是千万不要扫射,不然连老摩一起KO了,在老摩逃跑的时候旁边还会出现一个特工,大家注意一下,)把飞机打掉,在把楼房里的敌人杀完救出出老摩后出现剧情。剧情后就是NEO对SMITH,注意他是打不死的,会无限恢复HP,必须要象原作里那样把他打到地铁跑道上让地铁轧死他才行,之后就是逃跑,顺路一直往下走,走到指定地点本关结束。 第10关 本关开始在一个奇怪的地铁站,往前走地铁会来,但是需要车票,返回楼梯上会看到空中飘着好多闪光的东西,在那里按L2能拿到车票,上车后一直向车后面走,到第3节车厢时注意不要掉下去,来到第4节车厢看到电话,这时要发动FORCE才能走过去,通过电话得知要找到真确的门才能离开,回到第2节车厢,在墙上有个开关,按下去就能停车,这时候需要调整一下,首先反复进入这个车厢,直到车厢是正的为止,然后听到列车员说话马上按下开关就能找到正确的门,出来后又是一个地铁站,SIMITH和大群杂兵出现,这时不要只想着打,看到火车过来马上跳上去逃跑,因为杂兵是打不完的。下火车后上楼梯,之后又是大逃亡,千万不要打,顺路跑,只有1条路所以不用当心迷路,跑到303房间后发生剧情,NEO力量觉醒,然后开始虐待3个特工,虐待完后本关结束。 第11关 本关开始可以选关了,地图一共5快,先到下面最左边这块地图,任务是保护一个老头,从他家出来后大批敌人到来,不过还好我方也有人支援,快到火车站的时候会出现一个特工,不过现在特工对我们来说是小菜一碟,尽情虐待他吧。把老头动上火车后本关结束 第12关 来到下面右边的地图,本关和上一关一样是保护任务,不过这次保护的是个女人,没什么好说的把路上的人杀完,到达目的地过关。 第13关 同样是保护,不过这关有点难度因为被保护的人经常暴露在外面所以血下的很快,大家一定要速战速决 第14关 本关与其说是保护到不如说是共同作战,把门口杂兵清完后发生剧情,看到一个特工被打非出来,进去一看原来是个中国人干的(中国工夫果然最高- -! ),进去后要和他打一场,不过很好赢,打完之后是剧情,然后配合他把杂兵和特工搞定过关。 第15关 保护任务中最难的一关,一开始要追警察,快到顶楼的时候出现30秒倒计时,要在30秒没冲到顶楼,到了顶楼后有是和一个特工大战300回合,打赢后过关 第16关 为了节约版面,4关救人任务我就连在一起写了,首先是就一个老头(左下角地图),老头正被敌人包围,他要你想办法把敌人增援的门堵主,一开始先把周围敌人清完,不然老头很快就挂,然后跳到敌人近来的那道门的上面会看到一个支架,把支架打坏就能堵住门了,接着上电梯到跳车控制台控制吊车把老头送有右边的台子上,敌人又会出现增援,这是还有一个拿火箭炮的敌人,坚持一会后发生剧情,然后回去控制吊车把那个拿火箭炮敌人的房间压垮。把敌人消灭后过关,接着来到右下角的地图救老摩和催尼缔,中途只要快速清人,最后特工会驾驶飞机来攻击,马上拿起地上的火箭炮把飞机打下来过关。 来到地图右上角,把路上的杂兵消灭一直走看到要救的黑人,帮助他清光敌人后向里走,再清一堆敌人之后,3个特工登场,特工不厉害,好好招待他们吧, 最后来到左上角的地图救奈奥比,一开始只有几个杂兵,很容易对付,之后3个特工登场,虐待完毕后他们会在出现一次,把这里的敌人和特工全部KO后过关,注意敌人会有多次增援 第17关 大战塞拉夫,比较有意思的一关,先在房间里打,打死他一次之后开始中国武术传统"梅花桩"大战,注意这里只能把他打下去才会减血,接着来到电影院再次将他打败后发生剧情过关,电影院里打的这段比较有意思。 第18关 最经典之战 NEO大战史密斯×N ,没什么好说的尽情发挥吧,坚持一定时间就过关 第19关 先进入第一道门,相当变态的一关,我先代表广大玩家B4制作者,本关简直就是杀时间,在4个空间中找正确的门,第1个空间正确的门在中间靠左边的位置,第2个空间的门在一出来地方的后面,第3个空间的门要等那个女人帮你打开,第4个空间的门在一个高台上,注意从第2个空间开始会有红色的蚂蚁来骚扰你,只有用火能打死他们,但是貌似是无限增援,所以大家还是跑吧,给大家一个小技巧,按方向键上打开找门会比较简单。 第2道门,没什么难点就是敌人比较厉害,多使用武器就能通过,最后要打一个BOSS,这个BOSS会瞬间移动,不过不是很强 第3道门,进去就是BOSS战,BOSS到是不强,关键是有个女人要保护,不能让那个女的挂了,打一会,那个女人会来帮你的忙,干掉BOSS后过关 第20关 保护拿钥匙的人,一路上都是史密斯的复制人,照顾好MR KEY,走到终点,进入下半部分,在一个教堂里,大批复制人前来攻击,要支撑到MR KEY叫你才能离开,离开后来到一个会议大厅,和干才一样跋扈他到离开为止,离开后本关结束。 第21关 接着就是电影里的最终战,NEO和史密斯单挑,他不厉害,很轻松就能搞定,之后他会变身成"变形金刚"- -! 不要看他是最终BOSS,其实就是一垃圾,一直向左飞,看到屏幕上有按X键的提示就按下X,反复几次他就挂了,然后就是结局。
怎么样才能写出安全的Java代码?不被黑客攻击?
在本文中,我们讨论了对付 13 种不同静态暴露的技巧。对于每种暴露,我们解释了不处理这些安全性问题所造成的影响。我们还为您推荐了一些准则,要开发不受这些静态安全性暴露威胁的、健壮且安全的 Java 应用程序,您应该遵循这些准则。一有合适的时机,我们就提供代码样本(既有暴露的代码也有无暴露的代码)。
对付高严重性暴露的技巧
请遵循下列建议以避免高严重性静态安全性暴露:
限制对变量的访问
让每个类和方法都成为 final,除非有足够的理由不这样做
不要依赖包作用域
使类不可克隆
使类不可序列化
使类不可逆序列化
避免硬编码敏感数据
查找恶意代码
限制对变量的访问
如果将变量声明为 public,那么外部代码就可以操作该变量。这可能会导致安全性暴露。
影响
如果实例变量为 public,那么就可以在类实例上直接访问和操作该实例变量。将实例变量声明为 protected 并不一定能解决这一问题:虽然不可能直接在类实例基础上访问这样的变量,但仍然可以从派生类访问这个变量。
清单 1 演示了带有 public 变量的代码,因为变量为 public 的,所以它暴露了。
清单 1. 带有 public 变量的代码
class Test {
public int id;
protected String name;
Test(){
id = 1;
name = "hello world";
}
//code
}
public class MyClass extends Test{
public void methodIllegalSet(String name){
this.name = name; // this should not be allowed
}
public static void main(String[] args){
Test obj = new Test();
obj.id = 123; // this should not be allowed
MyClass mc = new MyClass();
mc.methodIllegalSet("Illegal Set Value");
}
}
建议
一般来说,应该使用取值方法而不是 public 变量。按照具体问题具体对待的原则,在确定哪些变量特别重要因而应该声明为 private 时,请将编码的方便程度及成本同安全性需要加以比较。清单 2 演示了以下列方式来使之安全的代码:
清单 2. 不带有 public 变量的代码
class Test {
private int id;
private String name;
Test(){
id = 1;
name = "hello world";
}
public void setId(int id){
this.id = id;
}
public void setName(String name){
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
}
让每个类和方法都为 final
不允许扩展的类和方法应该声明为 final。这样做防止了系统外的代码扩展类并修改类的行为。
影响
仅仅将类声明为非 public 并不能防止攻击者扩展类,因为仍然可以从它自己的包内访问该类。
建议
让每个类和方法都成为 final,除非有足够的理由不这样做。按此建议,我们要求您放弃可扩展性,虽然它是使用诸如 Java 语言之类的面向对象语言的主要优点之一。在试图提供安全性时,可扩展性却成了您的敌人;可扩展性只会为攻击者提供更多给您带来麻烦的方法。
不要依赖包作用域
没有显式地标注为 public、private 或 protected 的类、方法和变量在它们自己的包内是可访问的。
影响
如果 Java 包不是封闭的,那么攻击者就可以向包内引入新类并使用该新类来访问您想保护的内容。诸如 java.lang 之类的一些包缺省是封闭的,一些 JVM 也让您封闭自己的包。然而,您最好假定包是不封闭的。
建议
从软件工程观点来看,包作用域具有重要意义,因为它可以阻止对您想隐藏的内容进行偶然的、无意中的访问。但不要依靠它来获取安全性。应该将类、方法和变量显式标注为 public、private 或 protected 中适合您特定需求的那种。
使类不可克隆
克隆允许绕过构造器而轻易地复制类实例。
影响
即使您没有有意使类可克隆,外部源仍然可以定义您的类的子类,并使该子类实现 java.lang.Cloneable。这就让攻击者创建了您的类的新实例。拷贝现有对象的内存映象生成了新的实例;虽然这样做有时候是生成新对象的可接受方法,但是大多数时候是不可接受的。清单 3 说明了因为可克隆而暴露的代码:
清单 3. 可克隆代码
class MyClass{
private int id;
private String name;
public MyClass(){
id=1;
name="HaryPorter";
}
public MyClass(int id,String name){
this.id=id;
this.name=name;
}
public void display(){
System.out.println("Id ="+id+"
"+"Name="+name);
}
}
// hackers code to clone the user class
public class Hacker extends MyClass implements Cloneable {
public static void main(String[] args){
Hacker hack=new Hacker();
try{
MyClass o=(MyClass)hack.clone();
o.display();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
}
}
建议
要防止类被克隆,可以将清单 4 中所示的方法添加到您的类中:
清单 4. 使您的代码不可克隆
public final Object clone()
throws java.lang.CloneNotSupportedException{
throw new java.lang.CloneNotSupportedException();
}
如果想让您的类可克隆并且您已经考虑了这一选择的后果,那么您仍然可以保护您的类。要做到这一点,请在您的类中定义一个为 final 的克隆方法,并让它依赖于您的一个超类中的一个非 final 克隆方法,如清单 5 中所示:
清单 5. 以安全的方式使您的代码可克隆
public final Object clone()
throws java.lang.CloneNotSupportedException {
super.clone();
}
类中出现 clone() 方法防止攻击者重新定义您的 clone 方法。
使类不可序列化
序列化允许将类实例中的数据保存在外部文件中。闯入代码可以克隆或复制实例,然后对它进行序列化。
影响
序列化是令人担忧的,因为它允许外部源获取对您的对象的内部状态的控制。这一外部源可以将您的对象之一序列化成攻击者随后可以读取的字节数组,这使得攻击者可以完全审查您的对象的内部状态,包括您标记为 private 的任何字段。它也允许攻击者访问您引用的任何对象的内部状态。
建议
要防止类中的对象被序列化,请在类中定义清单 6 中的 writeObject() 方法:
清单 6. 防止对象序列化
private final void writeObject(ObjectOutputStream out)
throws java.io.NotSerializableException {
throw new java.io.NotSerializableException("This object cannot
be serialized");
}
通过将 writeObject() 方法声明为 final,防止了攻击者覆盖该方法。
使类不可逆序列化
通过使用逆序列化,攻击者可以用外部数据或字节流来实例化类。
影响
不管类是否可以序列化,都可以对它进行逆序列化。外部源可以创建逆序列化成类实例的字节序列。这种可能为您带来了大量风险,因为您不能控制逆序列化对象的状态。请将逆序列化作为您的对象的另一种公共构造器 — 一种您无法控制的构造器。
建议
要防止对对象的逆序列化,应该在您的类中定义清单 7 中的 readObject() 方法:
清单 7. 防止对象逆序列化
private final void readObject(ObjectInputStream in)
throws java.io.NotSerializableException {
throw new java.io.NotSerializableException("This object cannot
be deserialized");
}
通过将该方法声明为 final,防止了攻击者覆盖该方法。
避免硬编码敏感数据
您可能会尝试将诸如加密密钥之类的秘密存放在您的应用程序或库的代码。对于你们开发人员来说,这样做通常会把事情变得更简单。
影响
任何运行您的代码的人都可以完全访问以这种方法存储的秘密。没有什么东西可以防止心怀叵测的程序员或虚拟机窥探您的代码并了解其秘密。
建议
可以以一种只可被您解密的方式将秘密存储在您代码中。在这种情形下,秘密只在于您的代码所使用的算法。这样做没有多大坏处,但不要洋洋得意,认为这样做提供了牢固的保护。您可以遮掩您的源代码或字节码 — 也就是,以一种为了解密必须知道加密格式的方法对源代码或字节码进行加密 — 但攻击者极有可能能够推断出加密格式,对遮掩的代码进行逆向工程从而揭露其秘密。
这一问题的一种可能解决方案是:将敏感数据保存在属性文件中,无论什么时候需要这些数据,都可以从该文件读取。如果数据极其敏感,那么在访问属性文件时,您的应用程序应该使用一些加密/解密技术。
查找恶意代码
从事某个项目的某个心怀叵测的开发人员可能故意引入易受攻击的代码,打算日后利用它。这样的代码在初始化时可能会启动一个后台进程,该进程可以为闯入者开后门。它也可以更改一些敏感数据。
这样的恶意代码有三类:
类中的 main 方法
定义过且未使用的方法
注释中的死代码
影响
入口点程序可能很危险而且有恶意。通常,Java 开发人员往往在其类中编写 main() 方法,这有助于测试单个类的功能。当类从测试转移到生产环境时,带有 main() 方法的类就成为了对应用程序的潜在威胁,因为闯入者将它们用作入口点。
请检查代码中是否有未使用的方法出现。这些方法在测试期间将会通过所有的安全检查,因为在代码中不调用它们 — 但它们可能含有硬编码在它们内部的敏感数据(虽然是测试数据)。引入一小段代码的攻击者随后可能调用这样的方法。
避免最终应用程序中的死代码(注释内的代码)。如果闯入者去掉了对这样的代码的注释,那么代码可能会影响系统的功能性。
可以在清单 8 中看到所有三种类型的恶意代码的示例:
清单 8. 潜在恶意的 Java 代码
public void unusedMethod(){
// code written to harm the system
}
public void usedMethod(){
//unusedMethod(); //code in comment put with bad intentions,
//might affect the system if uncommented
// int x = 100;
// x=x+10; //Code in comment, might affect the
//functionality of the system if uncommented
}
建议
应该将(除启动应用程序的 main() 方法之外的)main() 方法、未使用的方法以及死代码从应用程序代码中除去。在软件交付使用之前,主要开发人员应该对敏感应用程序进行一次全面的代码评审。应该使用“Stub”或“dummy”类代替 main() 方法以测试应用程序的功能。
对付中等严重性暴露的技巧
请遵循下列建议以避免中等严重性静态安全性暴露:
不要依赖初始化
不要通过名称来比较类
不要使用内部类
不要依赖初始化
您可以不运行构造器而分配对象。这些对象使用起来不安全,因为它们不是通过构造器初始化的。
影响
在初始化时验证对象确保了数据的完整性。
例如,请想象为客户创建新帐户的 Account 对象。只有在 Account 期初余额大于 0 时,才可以开设新帐户。可以在构造器里执行这样的验证。有些人未执行构造器而创建 Account 对象,他可能创建了一个具有一些负值的新帐户,这样会使系统不一致,容易受到进一步的干预。
建议
在使用对象之前,请检查对象的初始化过程。要做到这一点,每个类都应该有一个在构造器中设置的私有布尔标志,如清单 9 中的类所示。在每个非 static 方法中,代码在任何进一步执行之前都应该检查该标志的值。如果该标志的值为 true,那么控制应该进一步继续;否则,控制应该抛出一个例外并停止执行。那些从构造器调用的方法将不会检查初始化的变量,因为在调用方法时没有设置标志。因为这些方法并不检查标志,所以应该将它们声明为 private 以防止用户直接访问它们。
清单 9. 使用布尔标志以检查初始化过程
public class MyClass{
private boolean initialized = false;
//Other variables
public MyClass (){
//variable initialization
method1();
initialized = true;
}
private void method1(){ //no need to check for initialization variable
//code
}
public void method2(){
try{
if(initialized==true){
//proceed with the business logic
}
else{
throw new Exception("Illegal State Of the object");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
如果对象由逆序列化进行初始化,那么上面讨论的验证机制将难以奏效,因为在该过程中并不调用构造器。在这种情况下,类应该实现 ObjectInputValidation 接口:
清单 10. 实现 ObjectInputValidation
interface java.io.ObjectInputValidation {
public void validateObject() throws InvalidObjectException;
}
所有验证都应该在 validateObject() 方法中执行。对象还必须调用 ObjectInputStream.RegisterValidation() 方法以为逆序列化对象之后的验证进行注册。 RegisterValidation() 的第一个参数是实现 validateObject() 的对象,通常是对对象自身的引用。注:任何实现 validateObject() 的对象都可能充当对象验证器,但对象通常验证它自己对其它对象的引用。RegisterValidation() 的第二个参数是一个确定回调顺序的整数优先级,优先级数字大的比优先级数字小的先回调。同一优先级内的回调顺序则不确定。
当对象已逆序列化时,ObjectInputStream 按照从高到低的优先级顺序调用每个已注册对象上的 validateObject()。
不要通过名称来比较类
有时候,您可能需要比较两个对象的类,以确定它们是否相同;或者,您可能想看看某个对象是否是某个特定类的实例。因为 JVM 可能包括多个具有相同名称的类(具有相同名称但却在不同包内的类),所以您不应该根据名称来比较类。
影响
如果根据名称来比较类,您可能无意中将您不希望授予别人的权利授予了闯入者的类,因为闯入者可以定义与您的类同名的类。
例如,请假设您想确定某个对象是否是类 com.bar.Foo 的实例。清单 11 演示了完成这一任务的错误方法:
清单 11. 比较类的错误方法
if(obj.getClass().getName().equals("Foo")) // Wrong!
// objects class is named Foo
}else{
// object's class has some other name
}
建议
在那些非得根据名称来比较类的情况下,您必须格外小心,必须确保使用了当前类的 ClassLoader 的当前名称空间,如清单 12 中所示:
清单 12. 比较类的更好方法
if(obj.getClass() == this.getClassLoader().loadClass("com.bar.Foo")){
// object's class is equal to
//the class that this class calls "com.bar.Foo"
}else{
// object's class is not equal to the class that
// this class calls "com.bar.Foo"
}
然而,比较类的更好方法是直接比较类对象看它们是否相等。例如,如果您想确定两个对象 a 和 b 是否属同一个类,那么您就应该使用清单 13 中的代码:
清单 13. 直接比较对象来看它们是否相等
if(a.getClass() == b.getClass()){
// objects have the same class
}else{
// objects have different classes
}
尽可能少用直接名称比较。
不要使用内部类
Java 字节码没有内部类的概念,因为编译器将内部类转换成了普通类,而如果没有将内部类声明为 private,则同一个包内的任何代码恰好能访问该普通类。
影响
因为有这一特性,所以包内的恶意代码可以访问这些内部类。如果内部类能够访问括起外部类的字段,那么情况会变得更糟。可能已经将这些字段声明为 private,这样内部类就被转换成了独立类,但当内部类访问外部类的字段时,编译器就将这些字段从专用(private)的变为在包(package)的作用域内有效的。内部类暴露了已经够糟糕的了,但更糟糕的是编译器使您将某些字段成为 private 的举动成为徒劳。
建议 如果能够不使用内部类就不要使用内部类。
对付低严重性暴露的技巧
请遵循下列建议以避免低严重性静态安全性暴露:
避免返回可变对象
检查本机方法
避免返回可变对象
Java 方法返回对象引用的副本。如果实际对象是可改变的,那么使用这样一个引用调用程序可能会改变它的内容,通常这是我们所不希望见到的。
影响
请考虑这个示例:某个方法返回一个对敏感对象的内部数组的引用,假定该方法的调用程序不改变这些对象。即使数组对象本身是不可改变的,也可以在数组对象以外操作数组的内容,这种操作将反映在返回该数组的对象中。如果该方法返回可改变的对象,那么事情会变得更糟;外部实体可以改变在那个类中声明的 public 变量,这种改变将反映在实际对象中。
清单 14 演示了脆弱性。getExposedObj() 方法返回了 Exposed 对象的引用副本,该对象是可变的:
清单 14. 返回可变对象的引用副本
class Exposed{
private int id;
private String name;
public Exposed(){
}
public Exposed(int id, String name){
this.id = id;
this.name = name;
}
public int getId(){
return id;
}
public String getName(){
return name;
}
public void setId(int id){
this.id=id;
}
public void setName(String name){
this.name = name;
}
public void display(){
System.out.println("Id = "+ id + " Name = "+ name);
}
}
public class Exp12{
private Exposed exposedObj = new Exposed(1,"Harry Porter");
public Exposed getExposedObj(){
return exposedObj; //returns a reference to the object.
}
public static void main(String[] args){
Exp12 exp12 = new Exp12();
exp12.getExposedObj().display();
Exposed exposed = exp12.getExposedObj();
exposed.setId(10);
exposed.setName("Hacker");
exp12.getExposedObj().display();
}
}
建议
如果方法返回可改变的对象,但又不希望调用程序改变该对象,请修改该方法使之不返回实际对象而是返回它的副本或克隆。要改正清单 14 中的代码,请让它返回 Exposed 对象的副本,如清单 15 中所示:
清单 15. 返回可变对象的副本
public Exposed getExposedObj(){
return new Exposed(exposedObj.getId(),exposedObj.getName());
}
或者,您的代码也可以返回 Exposed 对象的克隆。
检查本机方法
本机方法是一种 Java 方法,其实现是用另一种编程语言编写的,如 C 或 C++。有些开发人员实现本机方法,这是因为 Java 语言即使使用即时(just-in-time)编译器也比许多编译过的语言要慢。其它人需要使用本机代码是为了在 JVM 以外实现特定于平台的功能。
影响
使用本机代码时,请小心,因为对这些代码进行验证是不可能的,而且本机代码可能潜在地允许 applet 绕过通常的安全性管理器(Security Manager)和 Java 对设备访问的控制。
建议
如果非得使用本机方法,那么请检查这些方法以确定:
它们返回什么
它们获取什么作为参数
它们是否绕过安全性检查
它们是否是 public、private 等等
它们是否含有绕过包边界从而绕过包保护的方法调用
结束语
编写安全 Java 代码是十分困难的,但本文描述了一些可行的实践来帮您编写安全 Java 代码。这些建议并不能解决您的所有安全性问题,但它们将减少暴露数目。最佳软件安全性实践可以帮助确保软件正常运行。安全至关重要和高可靠系统设计者总是花费大量精力来分析和跟踪软件行为。只有通过将安全性作为至关紧要的系统特性来对待 — 并且从一开始就将它构建到应用程序中,我们才可以避免亡羊补牢似的、修修补补的安全性方法。
参考资料
请通过单击文章顶部或底部的讨论来参加本文的论坛。
了解关于 Java 安全性 API 的更多知识。
developerWorks 安全专题上通常含有有关计算机安全性的优秀资源。
Larry Koved、 Anthony J. Nadalin、Don Neal 和 Tim Lawson 合作编写的 “The evolution of Java security”(developerWorks,1998 年)对 Java 语言的安全性模型早期开发进行了深入探讨。
Sing Li 在他的 Java 安全性系列文章(由两部分组成的)(developerWorks, 2001 年 2 月)中向开发人员显示:尽管社区可能不得不重新考虑 Java 2 中的安全性设计,还是出现了只对开发人员有帮助,可以满足他们的需求的一致的进展:
第一部分
第二部分
John Viega、Tom Mutdosch、 Gary McGraw 和 Ed Felten 合著的 “Statically scanning Java code for security vulnerabilities” (IEEE Software,2000 年 9 月)介绍了一种 Java 工具,可以使用该工具来检查您的 Java 代码中的安全性漏洞。
G. McGraw 和 E. Felten 合作编写的 Securing Java: Getting Down to Business with Mobile Code(John Wiley 和 Sons,1998 年)深入涵盖了 Java 安全性。(文档是 PDF 格式的。)
定期检查 IBM 研究 Java 安全页面以便 IBM 在安全性领域的创新有重要发展时能够跟踪这一创新。
如果您的 Java 代码运行在 S/390 系统上,那么您将需要查阅 S/390 Java 安全页面以获取额外的信息。
关于作者
Bijaya Nanda Sahu 是就职于印度 IBM Global Services 的软件工程师。他从事过各种因特网技术和框架(J2EE、WSBCC、JADE)、 WebSphere 相关技术、UML 和 OOAD 方面的工作。目前,他从事因特网银行安全性问题方面的工作,重点在 WebSphere Application Server 和 Portal Server 上。可以通过 bijaya.sahu@in.ibm.com 和他联系
什么是信用盘改单? 有谁知道的?
信用盘改单指的就是把本来的单子改变了。这是违规操作的,一般黑客才知道如何操作。信用盘指的是一种端口,用户在使用信用盘的时候不需要充值现金,平台就会给用户发放信用额度,然后用户就可以先行使用信用额度然后再使用现金进行结付。信用盘是属于灰色产业的,一般是与博彩行业接轨的,国家还没有出台相关的政策对此进行监督和管控,这也就意味着信用盘具有高风险以及违法犯罪的可能,用户在使用信用盘的时候需要谨慎,不要因为贪图一时的快乐而葬送了原本平稳的生活。
我国关于贷款的限制
贷款炒股是不符合银行贷款用途管理的规定的,银行发放的贷款都是需要有专门用途的,但是没有一种贷款的用途是用来炒股,因此用户是不可以将任何贷款用于炒股的,不然就是违背了银行的规定了。银行对于房屋抵押贷款的用途限制是:个人贷款是不能用于基金、股票、高利贷以及投资房产等用途;不可以用于赌博等违反国家法律法规的非法用途以及国家监管部门禁止进入的领域。在我们去办理贷款的时候通常都会要求填写贷款的用途的,我们需要知道,其实贷款的用途填写合适的话,会增加我们的贷款通过率的,而不合理的贷款的用途很可能会导致你的房产抵押贷款被拒绝。贷款的用途是被允许用于个人消费以及企业经营两种的,个人贷款可以用于大额消费品、家居家装、结婚、旅游或者留学等消费,同时也包括医疗等特殊合理的消费用途。在申请贷款的时候,借款人需要留意贷款用途,用途不合规的是不能贷款的。而在贷款发放以后,如果被查实资金并未用于指定的用途的话,贷款机构会认定借款人违约的,是可以要求借款人提前还款的。
信用盘改单不需要密码
不需要。信用盘改单指的就是把本来的单子改变了,这是违规操作的,一般黑客才知道如何操作,信用盘指的是一种端口,用户在使用信用盘的时候不需要充值现金,平台就会给用户发放信用额度,然后用户就可以先行使用信用额度然后再使用现金进行结付,信用盘是属于灰色产业的。
微信链接改单技术、谁会改?
数字的改动其实没有任何的难度
就是一个程序代码的事情,说一次,你马上能明白了,不复杂。
黑客修改足球注单真的可以改吗JS
这个不一定,要看对方的安全做的怎么样,还要看你投入的资金大小。