导航:首页 > 程序命令 > web程序员防黑

web程序员防黑

发布时间:2022-05-15 19:28:21

⑴ 怎么防止黑客入侵,不让他轻易的破坏电脑

如何成为一名黑客 什么是黑客? Jargon File中对“黑客”一词给出了很多个定义,大部分定义都涉及高超的编程技术,强烈的解决问题和克服限制的欲望。如果你想知道如何成为一名黑客,那么好,只有两方面是重要的。(态度和技术) 长久以来,存在一个专家级程序员和网络高手的共享文化社群,其历史可以追溯到几十年前第一台分时共享的小型机和最早的ARPAnet实验时期。 这个文化的参与者们创造了“黑客”这个词。 黑客们建起了Internet。黑客们使Unix操作系统成为今天这个样子。黑客们搭起了Usenet。黑客们让WWW正常运转。如果你是这个文化的一部分,如果你已经为它作了些贡献,而且圈内的其他人也知道你是谁并称你为一个黑客,那么你就是一名黑客。 黑客精神并不仅仅局限于软件黑客文化圈中。有些人同样以黑客态度对待其它事情如电子和音乐---事实上,你可以在任何较高级别的科学和艺术中发现它。软件黑客们识别出这些在其他领域同类并把他们也称作黑客---有人宣称黑客实际上是独立于他们工作领域的。 但在本文中,我们将注意力集中在软件黑客的技术和态度,以及发明了“黑客”一词的哪个共享文化传统之上。 另外还有一群人,他们大声嚷嚷着自己是黑客,实际上他们却不是。他们是一些蓄意破坏计算机和电话系统的人(多数是青春期的少年)。真正的黑客把这些人叫做“骇客”(cracker),并不屑与之为伍。多数真正的黑客认为骇客们是些不负责任的懒家伙,还没什么大本事。专门以破坏别人安全为目的的行为并不能使你成为一名黑客, 正如拿根铁丝能打开汽车并不能使你成为一个汽车工程师。不幸的是,很多记者和作家往往错把“骇客”当成黑客;这种做法激怒真正的黑客。 根本的区别是:黑客们建设,而骇客们破坏。 如果你想成为一名黑客,继续读下去。如果你想做一个骇客,去读 alt.2600 新闻组,并在发现你并不像自己想象的那么聪明的时候去坐5到10次监狱。 关于骇客,我只想说这么多。 ---黑客的态度 黑客们解决问题,建设事物,信仰自由和双向的帮助,人人为我, 我为人人。 要想被认为是一名黑客,你的行为必须显示出你已经具备了这种态度。要想做的好象你具备这种态度,你就不得不真的具备这种态度。但是如果你想靠培养黑客态度在黑客文化中得到承认,那就大错特错了。因为成为具备这些特质的这种人对你自己非常重要,有助于你学习,并给你提供源源不断的活力。同所有有创造性的艺术一样,成为大师的最有效方法就是模仿大师的精神---不是仅从理智上,更要从感情上进行模仿。 So,如果你想做一名黑客,请重复以下事情直到你相信它们: 1 这世界充满待解决的迷人问题 做一名黑客有很多乐趣,但却是些要费很多气力方能得到的乐趣。 这些努力需要动力。成功的运动员从健壮体魄,挑战自我极限中汲取动力。同样,做黑客,你必须 要有从解决问题,磨练技术,锻炼智力中得到基本的热望。如果你还不是这类人又想做黑客,你就要设法成为这样的人。否则你会发现,你的黑客热情会被其他诱惑无情地吞噬掉---如金钱、性和社会上的虚名。 (同样你必须对你自己的学习能力建立信心---相信尽管你对某问题所知不多,但如果你一点一点地学习、试探,你最终会掌握并解决它。) 2. 一个问题不应该被解决两次 聪明的脑瓜是宝贵的,有限的资源。当这个世界还充满其他有待解决的有趣问题之时,他们不应该被浪费在重新发明轮子这些事情上。 作为一名黑客,你必须相信其他黑客的思考时间是宝贵的---因此共享信息,解决问题并发布结果给其他黑客几乎是一种道义,这样其他人就可以去解决新问题而不是重复地对付旧问题。 (你不必认为你一定要把你的发明创造公布出去,但这样做的黑客是赢得大家尊敬最多的人。卖些钱来给自己养家糊口,买房买车买计算机甚至发大财和黑客价值也是相容的,只要你别忘记你还是个黑客。) 3. 无聊和乏味的工作是罪恶 黑客们应该从来不会被愚蠢的重复性劳动所困扰,因为当这种事情发生时就意味着他们没有在做只有他们才能做的事情---解决新问题。这样的浪费伤害每一个人。因此,无聊和乏味的工作不仅仅是令人不舒服而已,它们是极大的犯罪。 要想做的象个黑客,你必须完全相信这点并尽可能多地将乏味的工作自动化,不仅为你自己,也为了其他人(尤其是其他黑客们)。 (对此有一个明显的例外。黑客们有时也做一些重复性的枯燥工作以进行“脑力休息”,或是为练熟了某个技巧,或是获得一些除此无法获得的经验。但这是他自己的选择---有脑子的人不应该被迫做无聊的活儿。) 4 自由就是好 黑客们是天生的反权威主义者。任何能向你发命令的人会迫使你停止解决令你着迷的问题,同时,按照权威的一般思路,他通常会给出一些极其愚昧的理由。因此,不论何时何地,任何权威,只要他压迫你或其他黑客,就要和他斗到底。 (这并非说任何权力都不必要。儿童需要监护,罪犯也要被看管起来。 如果服从命令得到某种东西比起用其他方式得到它更节约时间,黑客会同意接受某种形式的权威。但这是一个有限的、特意的交易;权力想要的那种个人服从不是你的给予,而是无条件的服从。) 权力喜爱审查和保密。他们不信任自愿的合作和信息共享---他们只喜欢由他们控制的合作。因此,要想做的象个黑客,你得对审查、保密,以及使用武力或欺骗去压迫人们的做法有一种本能的反感和敌意。 5. 态度不能替代能力 要做一名黑客,你必须培养起这些态度。但只具备这些态度并不能使你成为一名黑客,就象这并不能使你成为一个运动健将和摇滚明星一样。成为一名黑客需要花费智力,实践,奉献和辛苦。 因此,你必须学会不相信态度,并尊重各种各样的能力。黑客们不会为那些故意装模做样的人浪费时间,但他们却非常尊重能力---尤其是做黑客的能力,不过任何能力总归是好的。具备很少人才能掌握的技术方面的能力尤其为好,而具备那些涉及脑力、技巧和聚精会神的能力为最好。 如果你尊敬能力,你会享受提高自己能力的乐趣---辛苦的工作和奉献会变成一种高度娱乐而非贱役。 要想成为一名黑客,这一点非常重要。 基本黑客技术 黑客态度是重要的,但技术更加重要。态度无法替代技术,在你被别的黑客称为黑客之前,有一套基本的技术你必须掌握。 这套基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。例如,过去包括使用机器码编程,而知道最近才包括了HTML语言。但现在明显包括以下技术: 1 学习如何编程 这当然是最基本的黑客技术。如果你还不会任何计算机语言,我建议你从python开始。它设计清晰,文档齐全,对初学者很合适。尽管是一门很好的初级语言,它不仅仅只是个玩具。它非常强大,灵活,也适合做大型项目。 但是记住,如果你只会一门语言,你将不会达到黑客所要求的技术水平,甚至也不能达到一个普通程序员的水平---你需要学会如何以一个通用的方法思考编程问题,独立于任何语言。要做一名真正的黑客,你需要学会如何在几天内通过一些手册,结合你现在所知,迅速掌握一门新语言。这意味着你应该学会几种不同的语言。 如果要做一些重要的编程,你将不得不学习C语言,Unix的核心语言。其他对黑客而言比较重要的语言包括Perl和LISP。 Perl很实用,值得一学;它被广泛用于活动网页和系统管理,因此即便你从不用Perl写程序,至少也应该能读懂它。 LISP 值得学习是因为当你最终掌握了它你会得到丰富的经验;这些经验使你在以后的日子里成为一个更好的程序员,即使你实际上可能很少使用LISP本身。 当然,实际上你最好四种都会。 (Python, C, Perl, and LISP). 除了是最重要的四种基本语言,它们还代表了四种非常不同的编程方法,每种都会让你受益非浅。 这里我无法完整地教会你如何编程---这是个复杂的活儿。但我可以告诉你,书本和课程也不能作到。几乎所有最好的黑客都是自学成材的。真正能起作用的就是去亲自读代码和写代码。 学习如何编程就象学习用自然语言写作一样。最好的做法是读一些大师的名着,试着自己写点东西,再读些,再写点,又读些,又写点....如此往复,直到你达到自己在范文中看到的简洁和力量。 过去找到好的代码去读是困难的,因为很少有大型程序的可用源代码能让新手练手。这种状况已经得到了很大的改善;现在有很多可用的开放源码软件,编程工具和操作系统(全都有黑客写成)。这使我们自然地来到第二个话题... 2 得到一个开放源码的Unix并学会使用、运行它 我假设你已经拥有了一台个人计算机或者有一个可用的( 今天的孩子们真幸福 :-) )。新手们最基本的一步就是得到一份Linux或BSD-Unix,安装在个人计算机上,并运行它。 当然,这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发送的---你无法读到它的源码,更不可能修改它。尝试在DOS或Windows的机器上学习黑客技术,就象是在腿上绑了铁块去学跳舞。 除此之外,Unix还是Internet的操作系统。你可以不知道Unix而学会用Internet,但不懂它你就无法成为一名Internet黑客。因为这个原因,今天的黑客文化在很大程度上是以Unix为中心的。(这点并不总是真的,一些很早的黑客对此很不高兴,但Unix和Internet之间的共生关系已是如此之强,甚至连微软也无可奈何) So,装一个Unix---我个人喜欢Linux,不过也有其他选择。(你也可以在同一台机器上同时运行DOS,Windows和Linux)学会它。运行它。用它跟Internet对话。读它的代码。试着去修改他。你会得到比微软操作系统上好的多的编程工具(包括C,Lisp, Python, and Perl),你会得到乐趣,并将学到比你想象的更多知识。 关于学习Unix的更多信息,请看 The Loginataka. 要得到Linux,请看: 哪里能得到 Linux. 3 学会如何使用WWW和写HTML 大多黑客文化建造的东西都在你看不见的地方发挥着作用,帮助工厂、办公室和大学正常运转,表面上很难看到它对他人的生活的影响。Web是一个大大的例外。即便政客也同意,这个巨大而耀眼的黑客玩具正在改变整个世界。单是这个原因(还有许多其它的), 你就需要学习如何掌握Web。 这并不是仅仅意味着如何使用浏览器(谁都会),而是要学会如何写HTML,Web的标记语言。如果你不会编程,写HTML会教你一些有助于学习的思考习惯。因此,先建起自己的主页。 但仅仅建一个主页也不能使你成为一名黑客。 Web里充满了各种网页。多数是无意义的,零信息量垃圾。 要想有价值,你的网页必须有内容---必须有趣或对其它黑客有用。这样,我们来到下一个话题.... 黑客文化中的地位大教堂与集市”,解释了许多Linux和开放源码文化的运做原理。我还在它的续集“大教堂与集市”,解释了许多Linux和开放源码文化的运做原理。我还在它的续集“开拓智域”一文中有更直接的论述。 FAQ(常问问题解答) 问:你会教我如何做黑客吗? 自从第一次发布此页,我每周都会得到一些请求,要我“教会他如何做黑客”;遗憾的是,我没有足够的时间和精力来做这个;我自己的编程项目已经占用了我110%的时间。 甚至即便我想教你也不可能,黑客基本上是一项需要你自行修炼的的态度和技术。你会发现即使真正的黑客想帮助你,如果你乞求他们填鸭一样教你的话,你不会赢得他们的尊敬。 首先去学习。显示你在尝试,你能靠自己去学习。然后再去向黑客们请教问题。 问:你会帮我“黑”掉一个站点吗?或者教我怎么黑它? No. 任何在读完FAQ后还问此问题人,都是愚不可及的家伙,即使有时间我也不会理睬。 任何发给我的此类mail都会被忽略或被痛斥。 问:哪里能找到真正的可以与之交流的黑客? 最佳办法是就近参加一个Unix或Linux的用户组,参加他们的会议。 问:我该先学哪种语言? HTML, 如果你还不会的话. 但它不是一个真正的编程语言。当你准备编程时,我建议你从 Python开始. 会有很多人向你推荐Perl,它比Python还受欢迎,但却难学一些。 C 是非常重要的,但它却是最难学的。不要一开始就尝试学C。 问:开放源码的自由软件不会使程序员饿肚子吗? 这似乎不大可能---到目前,开放源码软件产业创造了而不是消灭了大量工作机会。 如果写一个程序比不写一个程序只是个纯粹经济上的收益的话,无论它是否免费,只要它被完成,程序员都会从中得到回报。而且,无论软件是由多么的free的方法开发的,对更新的软件应用的需求总是会有的。 问:我从何学起?哪里有免费的Unix? 本页的其他地方指向最常用的免费Unix。要做一名黑客,你需要自立自强,以及自我教育的能力。 现在开始吧...... 黑客技术交流超级群,仅提供技术交流,群①28671133已满 群②81709181 很荣幸能够为你解答. 本人QQ:2201117

⑵ 怎么样才能写出安全的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”或“mmy”类代替 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 和他联系

⑶ 网站被人攻击了有什么防御

其实毕竟攻防都是消耗资源的,云盾,帝域DNS可以进一步考虑下来,尤其是DNS的类型决议,用SEO优化的特殊保护功能,可以进行 将搜索引擎的方向性解析出来,将游客和智能蜘蛛区分开,你会说分辨代码也可以实现蜘蛛,只要达到效果,意思就不重要了,DNS可以保护帝域到你的 现场即使不开放,排名也不受影响,分开了两个空间操作,dns缓解攻击带来的网站seo影响。

⑷ 网站建设与管理

1.建立网站的目的

这是网站规划中的核心问题,需要非常明确和具体。建立网站的目的也就是一个网站的目标定位问题,网站的功能和内容,以及各种网站推广策略都是为了实现网站的预期目的。建立网站可以有多种目的,例如,从事直接网上销售、作为产品信息发布工具、信息中介服务、教育和培训等等,不同类型的网站其表达方式和实现手段是不一样的。

2.域名和网站名称
一个好的域名对网络营销的成功具有重要意义,网站名称同域名一样具有重要意义,域名和网站名称应该在网站规划阶段就作为重要内容来考虑。有些网站发布一段时间之后才发现域名或者网站名称不太合适,需要重新更改,不仅非常麻烦,而且前期的推广工作几乎没有任何价值,同时对自己网站形象也造成一定的伤害
这种现象在早期的一些网站中很普遍,例如搜狐(http://sohu.com ) 曾用http://sohoo.com.cn 作为域名,网易(http://netease.com )的前身是http://nease.net ,而新浪网(http://sina.com.cn)早期的域名是http://srsnet.com 。虽然这些网站现在都已发展成为国内着名的门户网站,且在那斯达克成功上市,但是,从它们域名的演变也可以看出当初曾经走过的弯路,值得我们认真思考和借鉴。

3. 网站的主要功能
在确定了网站目标和名称之后,要设计网站的功能了,网站功能是战术性的,是为了实现网站的目标。网站的功能是为用户提供服务的基本表现形式。一般来说,一个网站有几个主要的功能模块,这些模块体现了一个网站的核心价值。

4. 网站技术解决方案
根据网站的功能确定网站技术解决方案,应重点考虑下列几个方面:
(1)是采用自建网站服务器,还是租用虚拟主机。
(2)选择操作系统,用unix,Linux还是Window2000/NT。分析投入成本、功能、开发、稳定性和安全性等。
(3)采用系统性的解决方案,如IBM,HP等公司提供的企业上网方案、电子商务解决方案,还是自行开发。
(4)网站安全性措施,防黑、防病毒方案。
(5)相关程序开发。如网页程序ASP、JSP、CGI、数据库程序等。
5. 网站内容规划
一般信息发布型企业网站内容应包括:公司简介、产品介绍、服务内容、价格信息、联系方式、网上定单等基本内容;
电子商务类网站要提供会员注册、详细的商品服务信息、信息搜索查询、定单确认、付款、个人信息保密措施、相关帮助等;
综合门户类网站则将不同的内容划分为许多独立的或有关联的频道,有时,一个频道的内容就相当于一个独立网站的功能。
6. 网站测试和发布
在网站设计完成之后,应该进行一系列的测试,当一切测试正常之后,才能正式发布。主要测试内容包括:
(1)网站服务器稳定性、安全性;
(2)各种插件、数据库、图像、链接等是否工作正常;
(3)在不同接入速率情况下的网页下载速度;
(4)网页对不同浏览器的兼容性;
(5)网页在不同显示器和不同显示模式下的表现等。

7. 网站推广
网站推广活动一般发生在网站正式发布之后,当然也不排除一些网站在筹备期间就开始宣传的可能。网站推广是网络营销的主要内容,可以说,大部分的网络营销活动都是为了网站推广的需要,例如,发布新闻、搜索引擎登记、交换链接、网络广告等等。
因此,在网站规划阶段就应该对将来的推广活动有明确的认识和计划,而不是等网站建成之后才考虑采取什么样的推广手段。由此也可以看出,网站规划并不仅仅是为了网站建设的需要,而是整个网络营销活动的需要。
8. 网站维护
网站发布之后,还要定期进行维护,主要包括下列几个方面:
(1)服务器及相关软硬件的维护,对可能出现的问题进行评估,制定响应时间;
(2)网站内容的更新、调整等,将网站维护制度化、规范化。

3. 网站的主要功能

在确定了网站目标和名称之后,要设计网站的功能了,网站功能是战术性的,是为了实现网站的目标。网站的功能是为用户提供服务的基本表现形式。一般来说,一个网站有几个主要的功能模块,这些模块体现了一个网站的核心价值。

4. 网站技术解决方案

根据网站的功能确定网站技术解决方案,应重点考虑下列几个方面:

(1)是采用自建网站服务器,还是租用虚拟主机。

(2)选择操作系统,用unix,Linux还是Window2000/NT。分析投入成本、功能、开发、稳定性和安全性等。

(3)采用系统性的解决方案,如IBM,HP等公司提供的企业上网方案、电子商务解决方案,还是自行开发。

(4)网站安全性措施,防黑、防病毒方案。

(5)相关程序开发。如网页程序ASP、JSP、CGI、数据库程序等。

5. 网站内容规划

一般信息发布型企业网站内容应包括:公司简介、产品介绍、服务内容、价格信息、联系方式、网上定单等基本内容;

电子商务类网站要提供会员注册、详细的商品服务信息、信息搜索查询、定单确认、付款、个人信息保密措施、相关帮助等;

综合门户类网站则将不同的内容划分为许多独立的或有关联的频道,有时,一个频道的内容就相当于一个独立网站的功能。

6. 网站测试和发布

在网站设计完成之后,应该进行一系列的测试,当一切测试正常之后,才能正式发布。主要测试内容包括:

(1)网站服务器稳定性、安全性;

(2)各种插件、数据库、图像、链接等是否工作正常;

(3)在不同接入速率情况下的网页下载速度;

(4)网页对不同浏览器的兼容性;

(5)网页在不同显示器和不同显示模式下的表现等。

7. 网站推广

网站推广活动一般发生在网站正式发布之后,当然也不排除一些网站在筹备期间就开始宣传的可能。网站推广是网络营销的主要内容,可以说,大部分的网络营销活动都是为了网站推广的需要,例如,发布新闻、搜索引擎登记、交换链接、网络广告等等。

因此,在网站规划阶段就应该对将来的推广活动有明确的认识和计划,而不是等网站建成之后才考虑采取什么样的推广手段。由此也可以看出,网站规划并不仅仅是为了网站建设的需要,而是整个网络营销活动的需要。

8. 网站维护

网站发布之后,还要定期进行维护,主要包括下列几个方面:

(1)服务器及相关软硬件的维护,对可能出现的问题进行评估,制定响应时间;

(2)网站内容的更新、调整等,将网站维护制度化、规范化。

⑸ 网站安全之如何防止网站被黑

1、隐藏好IP,做好防护。
2、网站使用CDN。就近接入,就是利用DNS服务找到离用户最近的机器,从而达到 最短路径提供服务,DNS服务理论上可以找到所有这个公司的机房和IP,从而还能 够进行流量的调度。
3、服务器的补丁一定及时打好,不定时更新很有必要。
4、网站后台的路径要隐藏好,很多网站都不注意这一点,很容易被攻击。
5、网站的账号密码要设置复杂点,平常注册的时候提示什么数字字母特殊符号的 。
6、服务器备份。而且要及时更新备份,不要等到失去是后悔莫及。
7、服务器的防火墙。不要乱传来路不明以及不好的内容到网站的目录。
8、常用的端口都要关闭。
9、一定要开启防火墙。
10、最后注意不要存在弱命令。
11、服务器端设置防火墙等,通常需要与空间服务商沟通,让其代为设置。建议找专业的安全公司来解决,国内也就Sinesafe和绿盟等安全公司 比较专业.我们需要做的就是让网站自身的安全性更高,防止黑客获取我们网站相关的权限.

⑹ 防黑加固Linux服务器安全加固

使用一些安全测试的办法与工具对服务器进行风险检测,找出服务器的脆弱点以及存在的安全缺陷。
针对服务器操作系统自身的安全测试,包括一些系统配置、主机漏洞扫描等等
查看服务器操作系统当前用户是否为root用户,尽量避免使用root用户登录,启动其他服务程序,除非是一些需要root权限的安全工具,前提需要保证工具来源可信。终端需要 who 既可以查看当前登录用户。
登录到Linux系统,此时切换到root用户,下载lynis安全审计工具,切换到lynis运行脚本目录,执行 ./lynis --check-all –Q 脚本语句,开始对本地主机扫描审计,等待扫描结束,查看扫描结果。
登录到Linux系统,切换到root用户,使用命令行方式安装Clamav 杀毒软件,安装完毕需要更新病毒库,执行扫描任务,等待扫描结束获取扫描结果,根据扫描结果删除恶意代码病毒;
登录到Linux系统,切换到root用户,下载Maldetect Linux恶意软件检测工具,解压缩后完成安装。运行扫描命令检测病毒,等待扫描结束获取扫描报告,根据扫描报告删除恶意病毒软件;
登录到Linux系统,切换到root用户,下载Chkrootkit后门检测工具包,解压缩后进入 Chkrootkit目录,使用gcc安装Chkrootkit,安装成功即开始Chkrootkit扫描工作,等待扫描结束,根据扫描结果恢复系统;
登录到Linux系统,切换到root用户,下载RKHunter 后门检测工具包,解压缩后进入 RKHunter 目录,执行命令安装RKHunter ,安装成功即开始启用后门检测工作,等待检测结束,根据检测报告更新操作系统,打上漏洞对应补丁;
使用下面工具扫描Web站点:nikto、wa3f、sqlmap、safe3 … …
扫描Web站点的信息:操作系统类型、操作系统版本、端口、服务器类型、服务器版本、Web站点错误详细信息、Web目录索引、Web站点结构、Web后台管理页面 …
测试sql注入,出现几个sql注入点
测试xss攻击,出现几个xss注入点
手动测试某些网页的输入表单,存在没有进行逻辑判断的表单,例如:输入邮箱的表单,对于非邮箱地址的输入结果,任然会继续处理,而不是提示输入错误,返回继续输入。
针对风险测试后得到的安全测试报告,修复系统存在的脆弱点与缺陷,并且进一步加强服务器的安全能力,可以借助一些安全工具与监控工具的帮助来实现。
对服务器本身存在的脆弱性与缺陷性进行的安全加固措施。
使用非root用户登录操作系统,使用非root用户运行其他服务程序,如:web程序等;
web权限,只有web用户组用户才能操作web应用,web用户组添加当前系统用户;
数据库权限,只有数据库用户组用户才能操作数据库,数据库用户组添加当前系统用户;
根据安全审计、恶意代码检查、后门检测等工具扫描出来的结果,及时更新操作系统,针对暴露的漏洞打上补丁。
对于发现的恶意代码病毒与后门程序等及时删除,恢复系统的完整性、可信行与可用性。
部署在服务器上的Web站点因为程序员编写代码时没有注意大多的安全问题,造成Web服务站点上面有一些容易被利用安全漏洞,修复这些漏洞以避免遭受入侵被破坏。
配置当前服务器隐藏服务器信息,例如配置服务器,隐藏服务器类型、服务器的版本、隐藏服务器管理页面或者限制IP访问服务器管理页面、Web站点错误返回信息提供友好界面、隐藏Web索引页面、隐藏Web站点后台管理或者限制IP访问Web站点后台。
使用Web代码过滤sql注入或者使用代理服务器过滤sql注入,这里更加应该使用Web代码过滤sql注入,因为在页面即将提交给服务器之前过滤sql注入,比sql注入到达代理服务器时过滤,更加高效、节省资源,用户体验更好,处理逻辑更加简单。

⑺ web程序员的日常工作是怎样的

Web前端工程师的职业生涯,我觉得可以分为三步,初级前端开发工程师- > 资深前端工程师- > 前端架构师。每种职责都有其不同的角色和分工。

前端开发工程师(或者说“网页制作”、“网页制作工程师”、“前端制作工程师”、“网站重构工程师”),这样的一个职位的主要职责是与交互设计师、视觉设计师协作,根据设计图用HTML和CSS完成页面制作。同时,在此基础之上,对完成的页面进行维护和对网站前端性能做相应的优化。
资深前端开发工程师,相比较“前端开发工程师”而言,更加资深一些,当然其工作的职责也会相应的更加大一些。一般而言,资深前端开发工程师需要使用JavaScript或者ActionScript来编写和封装具有良好性能的前端交互组件,同时还要对Web项目的前端实现方案提供专业指导和监督并在日常工作之中对新人及相关开发人员进行前端技能的培训和指导。另外,还要跟踪研究前端技术,设计并实施全网前端优化。
对于前端架构师,更多意义上说像是一个管理的岗位,但是其职责要求却不仅只是管理。前端架构师需要带领组员实现全网的前端框架和优化,还要创建前端的相应标准和规范,并通过孜孜不倦的布道来完善并推广和应用自己的标准和框架。同时,还要站在全局的角色为整个网站的信息架构和技术选型提供专业意见和方案。

学无止境,重要的是通过工作实现自我价值。:)

⑻ asp/asp.net/php三种技术做网站的对比,比如浏览速度,cpu使用率,防黑方面,最好一表格的方式表现出来

ASP首先微软已经宣布停止更新了。。。老网站用的都是他。现在新开发的基本不考虑这个语言
ASP.NET相对于新手来说。安全性也相对较高。不过属于预编译速度较慢。。。
PHP速度最快。以前不是面向对象。。PHP5以后性能得到了极大提升。。安全性没问题。不过想要绝对安全要靠经验。防止注入和XSS跨站攻击。。
总结来说。..速度方面PHP无懈可击。安全性靠程序员的经验来弥补。另外PHP+MYSQL+LINUX是一套完美的组合。完全免费,服务器最强组合。。。除了银行等安全机构采用
JSP+Oracle意外。现在所有的网站基本都使用PHP

⑼ WEB程序员是干什么的上班时的工作具体是做什么的要会哪些东西有前途吗谁能帮我说得详细点!!

web 简单来说就是网站什么的了,web程序员就是做网站开发的.
具体学什么就要看分工不同的,开发语言有很多种类,目前比较主流的 php,asp,jsp,.net,ruby,cgi(python,c....) 以上说的是后台语言, 前台相关的还有一些东西 ,比如(x)html,xml,css,javascript这些.

根据分工不同,还会有 程序开发人员,网页设计人员,项目设计人员,平面设计人员等等...

当你的后台设计语言学到一定水平的时候,就会接触到一些高级技术,比如ajax,框架,web2.0,w3c等等.

你如果想学的话,上面任何一种东西学精通了都很厉害,不在于学的多,在于精....

⑽ 作为一个WEB应用开发程序员,在WEB应用开发过程中要注意哪些安全问题

SQL注入攻击,XSS脚本攻击,URL页面传参<例如:window.location.href='index.aspx?id=1'>,缓存的应用<防止读脏数据,未更新的数据>
解决方法:
SQL注入攻击:通过对输入内容的检测,例如:检测关键字,即查看输入的内容里面是不是有Update insert select Delete 等关键字!
XSS脚本攻击:检测输入内容输入内容是否含有< > <script> <p> <a> 等HTML标记!
参数攻击:直接在URL中更换参数,查看一些自己没有权限查看的内容!即所谓的跨权限查看。
缓存的应用:使用缓存,就应该及时更新缓存,以防止读旧数据,脏数据等,也可以使用缓存替换技术!等等等吧!好多呢!ca

阅读全文

与web程序员防黑相关的资料

热点内容
程序员被裁找不到工作怎么办 浏览:712
ai导出的pdf 浏览:327
微信怎么加密小米手机 浏览:813
编译原理第几版 浏览:415
编译工作的五个阶段 浏览:742
8051单片机io口 浏览:825
知乎android源码 浏览:967
python卡曼滤波器 浏览:259
现在学c语言用什么c编译器比较 浏览:102
防白块命令 浏览:384
男科咨询哪个app好用 浏览:522
明月庄主的服务器为什么进不去 浏览:633
c语言指向函数编译 浏览:741
中国程序员行业的现状 浏览:707
java后端程序员的日常 浏览:156
编译器代表什么意思 浏览:758
半封闭螺杆制冷压缩机 浏览:851
快手成年版从哪个app下 浏览:539
大妈学程序员 浏览:794
linux的gzz文件怎么解压 浏览:137