狼爱上狸

我胡汉三又回来了

#

用JSP实现一个日历程序

出处:http://www.chinabs.net/webj2ee/default.asp?infoid=257

<!-- 显示任意年、月的日历,可选择不同的年、月。author:wildfield -->
<%@ page language="java" import="java.util.*" %>
<%! String year;
  String month;
%>
<% month=request.getParameter("month");
  year =request.getParameter("year");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>日</title>
<script Language="JavaScript">
<!--
function changeMonth()
{
var mm="calendar.jsp?month="+document.sm.elements[0].selectedIndex+"&year="
+<%=year%>;
window.open(mm,"_self");
}
//--></script>
</head>
<%! String days[]; %>
<%
days=new String[42];
for(int i=0;i<42;i++)
 {
  days[i]="";
 }
%>
<%
Calendar thisMonth=Calendar.getInstance();
 if(month!=null&&(!month.equals("null")))
  thisMonth.set(Calendar.MONTH, Integer.parseInt(month) );
 if(year!=null&&(!year.equals("null")))
  thisMonth.set(Calendar.YEAR, Integer.parseInt(year) );
 year=String.valueOf(thisMonth.get(Calendar.YEAR));
month=String.valueOf(thisMonth.get(Calendar.MONTH));
thisMonth.setFirstDayOfWeek(Calendar.SUNDAY);
thisMonth.set(Calendar.DAY_OF_MONTH,1);
int firstIndex=thisMonth.get(Calendar.DAY_OF_WEEK)-1;
int maxIndex=thisMonth.getActualMaximum(Calendar.DAY_OF_MONTH);
for(int i=0;i<maxIndex;i++)
 {
  days[firstIndex+i]=String.valueOf(i+1);
 }
%>
<body>
<FORM name="sm" method="post" action="calendar.jsp">
  <%=year%>年  <%=Integer.parseInt(month)+1%>月
<table border="0" width="168" height="81">
<div align=center>
 <tr>
   <th width="25" height="16" bgcolor="#FFFF00"><font color="red">日</font>
</th>
   <th width="25" height="16" bgcolor="#FFFF00">一</th>
   <th width="25" height="16" bgcolor="#FFFF00">二</th>
   <th width="25" height="16" bgcolor="#FFFF00">三</th>
   <th width="25" height="16" bgcolor="#FFFF00">四</th>
   <th width="25" height="16" bgcolor="#FFFF00">五</th>
   <th width="25" height="16" bgcolor="#FFFF00"><font color="green">六</fon
t></th>
 </tr>
<% for(int j=0;j<6;j++) { %>
<tr>
     <% for(int i=j*7;i<(j+1)*7;i++) { %>
    <td width="15%" height="16" bgcolor="#C0C0C0" valign="middle" align="ce
nter">
    <a href="jump.jsp?year=<%=year%>&month=<%=Integer.parseInt(month)+1%>&d
ate=<%=days[i]%>" target="main"><%=days[i]%></a></td>
   <% }  %>
 </tr>
<% }  %>
</div>
</table>
<table border="0" width="168" height="20">
<tr>
 <td width=30%><select name="month" size="1" onchange="changeMonth()" >
   <option value="0">一月</option>
   <option value="1">二月</option>
   <option value="2">三月</option>
   <option value="3">四月</option>
   <option value="4">五月</option>
   <option value="5">六月</option>
   <option value="6">七月</option>
   <option value="7">八月</option>
   <option value="8">九月</option>
   <option value="9">十月</option>
   <option value="10">十一月</option>
   <option value="11">十二月</option>
 </select></td>
<td width=28%><input type=text name="year" value=<%=year%> size=4 maxlength
=4></td>
<td>年</td>
<td width=28%><input type=submit value="提交"></td>
</tr>
</table>
</FORM>
<script Language="JavaScript">
<!--
 document.sm.month.options.selectedIndex=<%=month%>;
//-->
</script>
</body>
</html>  

posted @ 2006-11-06 06:28 狼爱上狸 阅读(277) | 评论 (0)编辑 收藏

solaris配置文件

出 处:http://cyberli.blog.com/1064961/


/etc/cron.d/cron.allow
/etc/cron.d/cron.deny        用于对crontab进行访问控制.       
/etc/defaultdomain                NIS域名设置文件
/etc/default/cron                对cron的log进行控制.
/etc/default/login                对root用户远程登陆许可进行设置。
/etc./default/su                SULOG及SYSLOG值可以控制su的日志,还有可以对其su后
                        环境变量进行设置。
/etc/dfs/dfstab                NFS共享的配置文件
/etc/dfs/sharetab               
/etc/group                用户组配置文件。
/etc/hostname.interface        网络接口名称文件,其IP在/etc/inet/hosts文件中设置。
/etc/hosts.allow
/etc/hosts.deny                主机远程访问控制文件。

/etc/hosts.equiv                r系列命令访问控制文件。
/etc/inittab                init启动进程所需要的脚本文件,用于控制不同的启动级别。
/etc/logindevperm                ttymon的配置文件主要用来控制设备的访问权限。
/etc/magic                file命令所显示的文件类型数据库
/etc/mail/aliases
/etc/aliases                sendmail的邮件别名文件

/etc/mail/sendmail.cf
/etc/sendmail.cf                sendmail的控制文件
/etc/minor_perm                使用drvconfig命令所许可的设备。
/etc/mnttab                当前系统中已mount的所有资源
/etc/name_to_major        当前配置的主设备号,被用于drvconfig命令
/etc/netconfig                网络配置数据库,用于网络初始化。
/etc/netgroup                定义主机和用户组。
/etc/netmasks                定义默认子网掩码。
/etc/nsswitch.conf                域名查找顺序配置文件。
/etc/path_to_inst                用于配置物理设备树、物理设备名和实例名文件。
/etc/protocols                协议配置文件
/etc/remote                tip命令的属性文件。
/etc/rmtab                当前已mount的远程文件系统文件列表。
/etc/services                网络端口号列表文件。
/etc/syslog.conf                syslogd 配置文件。
/etc/system                内核配置文件。
/etc/vfstab                关于本地及远程文件系统自动mount列表。
/var/adm/messages                主日志记录文件。
/var/adm/sulog                默认的su命令记录文件。
/var/adm/utmpx                用户和账号信息文件。
/var/adm/wtmpx                用户登陆的账号信息文件。

/var/local/etc/ftpaccess
/var/local/etc/ftpconversions
/var/local/etc/ftpusers        wu-ftpd 的配置文件。
/var/lp/log                打印服务日志文件。
/var/sadm/install/contents        软件包安装数据库文件
/var/saf/_log                SAF的日志文件。

posted @ 2006-11-05 17:15 狼爱上狸 阅读(373) | 评论 (0)编辑 收藏

配置安全的solaris

出处:http://www.xxlinux.com/linux/article/unix/rumen/2006-06-25/2116.html

一、帐号和口令安全策略
 
1.1更改口令文件、影像文件、组文件的权限 
    /etc/passwd 必须所有用户都可读,root用户可写 –rw-r—r— 
    /etc/shadow 只有root可读 –r-------- 
    /etc/group 必须所有用户都可读,root用户可写 –rw-r—r— 

1.2修改不必要的系统帐号 
     移去或者锁定那些系统帐号,比如sys、uucp、nuucp、listen、lp、adm等等,简单的办法是在 /etc/shadow的password域中放上NP字符。还可以考虑将/etc/passwd文件中的shell域设置成 /bin/false 

1.3修改口令策略 
    修改/etc/default/passwd文件 
    MAXWEEKS=4 口令至少每隔4星期更改一次 
    MINWEEKS=1 口令至多每隔1星期更改一次 
    WARNWEEKS=3 修改口令后第三个星期会收到快要修改口令的信息 PASSLENGTH=6 用户口令长度不少于6个字符

二、用户授权安全策略 
2.1移去组及其它用户对/etc的写权限。 
    执行命令#chmod -R go-w /etc 

2.2禁止root远程登录 
    在/etc/default/login中设置 
    CONSOLE=/dev/concle 

2.3setuid和setgid特殊权限。 
    Setuid 是指设置程序的有效执行用户身份(uid)为该文件的属主,而不是调用该程序进程的用户身份。Setgid与之类似。Setuid和setgid用1s  -1显示出来为s权限,存在于主人和属组的执行权限的位置上。系统设置特殊权限,使用户执行某些命令时,具有root的执行权限, 命令执行完成,  root身份也随之消失。因此特殊权限关系系统的安全,可执行命令#find / -perm -4000 -print 寻找系统中具有setuid 权限的文件,存为列表文件,定时检查有没有这之外的文件被设置了setuid权限。 

2.4审计并日志所有以root身份的登陆情况 
    添加或编辑/etc/default/login文件如下: 
    SYSLOG= YES 
    syslog记录root的登陆失败,成功的情况。 

2.5设置远程登陆会话超时时间 
    添加或编辑/etc/default/login文件如下: 
    TIMEOUT= 300 

2.6确定登陆需要密码验证 
    添加或编辑/etc/default/login文件如下: 
    PASSREQ= YES 

2.7 UMASK设置 
     umask命令设置用户文件和目录的文件创建缺省屏蔽值,若将此命令放入.profile文件,就可控制该用户后续所建文件的存取许可.umask命令与chmod命令的作用正好相反,它告诉系统在创建文件时不给予什么存取许可. 
    安装配置完操作系统之后确认root的umask设置是077或者027,执行 
    /usr/bin/umask [-S] 确认。 


2.7.1增加或修改/etc/default/login文件中如下行 
    UMASK=027 

2.7.2并增加上行到如下的文件中: 
    /etc/.login /etc/.profile /etc/skel/local.cshre 
    /etc/skel/local.login /etc/skel/local.profile 

2.8用户环境配置文件的PATH或者LD_LIBRARY_PATH中移去“.” 。 
     从如下的文件中移走”.”,确认root的PATH环境变量设置是安全的,应该只包含/usr/bin: /sbin:/usr/sbin,避免当前工作目录.出现在PATH环境变量中,这有助于对抗特洛伊木马。 
    #echo $PATH | grep ":." 确认 

    /.login /etc/.login     /etc/default/login   
    /.cshrc /etc/skel/local.profile /etc/skel/local.cshrc 
    /.profile /etc/skel/local.login /etc/profile

三、网络与服务安全策略 
3.1关闭不用的服务 
3.1.1在inetd.conf中关闭不用的服务 
     首先复制/etc/inet/inetd.conf。  #cp /etc/inet/inetd.conf /etc/inet/inetd.conf.backup然后用vi编辑器编辑 inetd.conf文件,对于需要注释掉的服务在相应行开头标记“#”字符即可。 

3.1.2在Services中关闭不用的服务 
    首先复制/etc/inet/services。 #cp /etc/inet/services /etc/inet/services.backup 
然后用vi编辑器编辑Services文件,对于需要注释掉的服务在相应行开头标记“#”字符即可。 
在inetd.conf、services中进行修改后,找到inetd进程的ID号,用kill向其发送HUP信号进行刷新。举例如下。 
    #ps -ef | grep inetd 
    #kill -HUP 进程号 或/usr/sbin/inetd –s –t 
    增加-t选项以加强网络访问控制 

3.1.3根据需要关闭不用的服务 
     可关闭如下服务:tftp、ypupdate(NIS程序)、 dtspcd(邮件收发程序)  、rquotad、name、uucp(网络实用系统)、snmp(简单网络管理协议)等。 

3.2关闭系统的自启动服务 
    在系统/etc/rc*.d的目录下,根据需要停用以下服务: 
    sendmail 把/etc/rc2.d/S88sendmai更名为tc/rc2.d/X88sendmail 
    DNS 将/etc/rc2.d/S72inetsv注释掉in.named一项 
    lp 把/etc/rc2.d/S80lp更名为 /etc/rc2.d/X80lp 
    uucp 把/etc/rc2.d/S70uucp更名为/etc/rc2.d/x70uucp 
     snmp把/etc/rc3.d/S76snmpdx和  /etc/rc3.d/S77dmi 更名 为/etc/rc3.d/s76snmpdx和 /etc/rc3.d/s77dmi 
    autoinstall 把/etc/rc2.d/S72autoinstallg更名为/etc/rc2.d/s72autoinstall 

3.3加强FTP服务安全 
3.3.1禁止系统用户的FTP服务 
    把所有的系统账户加入到/etc/ftpusers(solaris 9的该文件现更改为/etc/ftpd/ftpusers)文件: 
    root 、daemon、sys、bin、adm、lp、uucp、nuucp、listen、nobody 

3.3.2禁止FTP&服务暴露系统敏感信息 
     编辑/etc/default/ftpd文件,假如文件不存在就新建一个,在文件中的加进入下一项:     BANNER=XXXX(XXXX可以任意改变为任何一个版本信息),将该系统版本信息屏蔽. 

3.3.3ftp服务会话日志记录 
    /etc/inet/inetd.conf中的ftpd为(记录) 
    ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd –dl 

3.4加强Telnet服务安全 
3.4.1禁止Telnet服务暴露系统敏感信息 
     防止telnetd banner泄露信息 ,修改/etc/default/telnetd 文件 ,加入以下一项:BANNER=XXXX(XXXX可以任意改变为任何一个版本信息),将该系统版本信息屏蔽. 

3.4.2更改Telnet服务端口号 
    修改文件/etc/services的Telnet一项,将端口号改为非23,使用Telnet服务时需注明端口号。 

3.5加强NFS服务安全 
    检查/etc/dfs/dfstab文件share语句,缺省时共享目录为可读可写,加入“-o”选项增加安全,“-o rw”可读可写,“-o ro”只读,可授权某系统和某用户。 

3.6防止TCP序列号预测攻击(ip欺骗) 
    在/etc/default/inetinit中增加设置来防止TCP序列号预测攻击(ip欺骗)TCP_STRONG_ISS=2 

3.7系统路由安全 
     如果Solaris机器有超过一块的网卡的话,它将会在不同网卡间转发数据包,这一行为可以在/etc/init.d/inetinit中得到控制。要在 Solaris 2.4或者更低版本机器下关闭它,可以将ndd -set /dev/ip ip_forwarding 0添加于在inetinit文件未尾。在Solaris 2.5以上,只要touch /etc/notrouter.网络系统用静态路由比较安全。 

3.8调整网络参数,加强网络安全 
    使IP forwarding和sourec routing(源路)由无效 
     在Inetinit中使IP forwarding和sourec routing(源路)由无效(假如有超过一个网络接口的话)。在/etc/init.d/inetinit中增加下面所示设置: 
    禁止系统转发定向广播包 
    #ndd -set /dev/ip ip_forward_directed_broadcasts 0 
    关闭原路由寻址 :#ndd -set /dev/ip ip_forward_src_routed 0 
    禁止系统转发IP包:#ndd -set /dev/ip ip_forwarding 0 
    缩短ARP的cache保存时间: (default is 5 min) 
    #ndd -set /dev/arp arp_cleanup_interval 2 min 
    关闭echo广播来防止ping攻击( # default is 1 ) 
    #ndd -set /dev/ip ip_respond_to_echo_broadcast 0

四、防止堆栈缓冲益出安全策略 
     入侵者常常使用的一种利用系统漏洞的方式是堆栈溢出,他们在堆栈里巧妙地插入一段代码,利用它们的溢出来执行,以获得对系统的某种权限。要让你的系统在堆栈缓冲溢出攻击中更不易受侵害,你可以在/etc/system里加上如下语句:set noexec_user_stack=1 
set noexec_user_stack_log =1 
    第一句可以防止在堆栈中执行插入的代码,第二句则是在入侵者想运行exploit的时候会做记录。

五、日志系统安全策略 
5.1定时检查系统日志文件 
    Solaris 系统通过syslogd进程运行日志系统,配置文件/etc/syslog.conf,可编辑此文件让日志系统记录更多信息,需重启 /usr/sbin/syslogd进程,重读取配置文件。通常日志系统的文件分别存放在两个位置,/var/adm保存本地系统日志,/var/log 保存登录其它系统时日志。
5.2设置utmpx和wtmpx文件权限,确保日志系统安全。 
    文件/var/adm/utmpx记录了所有当前登录到系统中的用户,文件/var/adm/wtmpx记录了系统所有的登录和注销。这两个文件是以数据库的格式存在的。
设置权限#chmod 544 /var/adm/utmpx 
            #chmod 544 /var/adm/wtmpx

六、其它系统安全设置 
6.1 crontab命令 
6.1.1不要使用crontab –e命令,因为它会在/tmp下建立所有用户都可读的crontab副本访问cron系统。用如下的方法: 
编辑文件:mycronfile 
crontab<mycronfile 

6.1.2在/etc/default/cron文件中增加如下行: CRONLOG=YES 记录所有的crontab行为 

6.2对su的纪录 
    创建/etc/default/su文件 
    SULOG=/var/adm/sulog 
    SYSLOG=YES 
    CONSOLE=/dev/console 
    PATH=/usr/bin: 
    SUPATH=/usr/sbin:/usr/bin 

6.3为OpenBoot设置密码 
    在Solaris中设置密码 
    #eeprom security-password 
    在OpenBoot中设置密码 
    ok password 
    在Solaris中设置安全级别(command) 
    #eeprom security-mode=command 
    在OpenBoot中设置安全级别(command) 
    ok setenv security-mode command 
    在OpenBoot中设置安全级别(full) 
    ok setenv security-mode full 

6.4限制.rhosts和/etc/hosts.equiv文件的使用 
     配置文件具有两种功能:r系列命令使用这些文件来访问系统;在某用户的目录下存在.rhosts文件或/etc/hosts.equiv文件配有某系统,任何用户都可以通过rlogin不需要口令以该用户的身份登录到系统。因此要为这些文件加锁,先创建它们,然后修改其属性为零即可。这样除了root用户就没有其它用户能创建或修改它们了。 
    /usr/bin/touch   /.rhosts /etc/hosts.equiv 
    /usr/bin/chmod 0 /.rhosts /etc/hosts.equiv 
    .rhosts文件可以作为一个典型的后门文件使用,运行下面的命令全局查找.rhosts文件 
#find -name“.rhosts”-print 

6.5给系统打补丁 
     象其它的系统一样,Solaris系统也有它的漏洞,其中的一些从性质上来说是相当严重的。SUN公司长期向客户提供各种版本的最新补丁,放在http: //sunsolve.sun.com网站。可用#showrev –p命令检查系统已打的补丁或到/var/sadm/patch目录下查已打过的补丁号,用patchadd命令给系统打补丁。 
七、Setuid设置和Solaris操作系统安全 
http://bbs.chinaunix.net/forum/viewtopic.php?t=302945&highlight=Setuid 
    在Solaris中,文件除了读、写、执行权限外,还有一些特殊权限。 Setuid和setgid是其中的一类。它与Solaris系统的安全关系紧密。 
     Setuid是指设置程序的有效的执行用户身份(uid)为该文件的主人,而不是调用该程序的进程的uid。 Setgid与之类似。Setuid和setgid用ls –l显示出来为s权限,存在于主人和属组的执行权限的位置上。 
    这种权限的设置方法如下: 
    只设setuid: chmod 4xxx filename (xxx为一般读、写、执行权限) 
    只设setgid: chmod 2xxx filename 
    同时设setuid和setgid: chmod 6xxx filename 
    取消两种权限: chmod 0xxx filename 
    这种权限怎么用? 
     举个例子来说,假如某一命令(程序)的主人是root用户,并且该文件有setuid属性,但是该文件的读、写、执行权限的属性表明普通用户user1可以执行该命令,那么就表示:当该用户执行该命令时,他具有root的执行身份,并获得相应的权限。一旦该命令执行完成,该身份也随之消失。 
    为什么系统中需要有这样的权限呢?请执行以下操作: 
    7.1. $ ls –l /etc/shadow /bin/passwd 
         -r-sr-sr-x 3 root  sys 99792 1999 2月 12 /bin/passwd 
         -r-------- 1 root  sys 261 1月 3 13:12 /etc/shadow 
    /etc/shadow 文件由于存有用户的加密口令信息,对系统的安全至关重要,因此权限很严,只有root凭其对系统的至高无上的权限才得以对/etc/shadow可读可写。但是系统必须允许普通用户也能修改自己的口令。要让他们对/etc/shadow可写,又不能可读,而且可写又不能允许他们改别人的口令,怎么办?系统就采取这样一个办法:做一个程序, 也就是/bin/passwd,通过它可以在不显示文件内容的情况下直接修改/etc/shadow文件。可是这个程序怎么能有这样的权限?因为系统赋予它setuid权限,而且它属于root.这样,用户在使用/bin/passwd改口令时就有root权限.由于 /bin/passwd命令本身功能的局限性,用户并不能用它做更多的不利于系统安全的事。 
    7.2. 用普通用户身份修改口令 
    $ passwd 
      Enter login password: **** 
      New password:****** 
      Re-enter new password:****** 
      Passwd(SYSTEM): passwd successfully changed for xxx . 
      可以成功。 
    7.3. 用超级用户修改/bin/passwd的权限 
    # chmod 0555 /bin/passwd 
    7.4. 再重复2,是否还成功?当然不。 
    7.5.把/bin/passwd的权限恢复原状。 
     # chmod 6555 /bin/passwd 

     对此可以打一个生动的比喻:有一个绝密机关,不得已必须有一些不能见这些秘密的人进来做一些事情。于是授权一些特殊的“车辆”(没有窗户,门紧闭,所以看不到外面。只有一个小洞允许乘坐的人伸出一只手臂),带着所乘坐的人开到要去的地方,允许它办完事情马上带他出来。这样是不是很安全?不一定。如果“车辆”没有经过精挑细选是有很多“门窗”,那系统可就危险了。 
    这种安全威胁在Solaris中也有可能出现。比如做一下下面这个实验: 
    7.6. $ vi /etc/shadow 
     /etc/shadow: Permission denied. 
    7.7. 用超级用户身份 
    # chmod 6555 /bin/vi 
    # chown root /bin/vi 
     7.8. 这次再用普通用户身份试一试第6步,有什么结果?这次你能以普通用户身份修改          /etc/shadow了!!但是 
$ more /etc/shadow仍然不成功,说明在执行/bin/passwd时有超级用户权限,平时仍是普通用户身份。 
    再来看一个令人不安的情况: 
    7.9.用超级用户身份 
    # chmod 6555 /bin/ksh 
    # chown root /bin/ksh 
    7.10. 用普通用户身份 
    $ ksh 
    # 
    发生了什么情况??普通用户不需要root口令就变成了root!!! 
    好可怕。如果有一个用户曾有一次获得超级用户权限,并通过类似的方式给自己设置了后门(也可能放了一个类似的文件在他自己的家目录中),以后他就可以随时变成超级用户了。 
怎么能避免setuid的不安全影响,又利用其方便的地方?这里有几点建议: 
关键目录应严格控制写权限。比如/,/usr等。 
    对不管是root帐号还是普通用户帐号的保密都有足够的重视。最好不要设置类似于guest、public、test之类公用的容易猜出口令的帐号。 
    对系统中应该具有setuid权限的文件作一列表,定时检查有没有这之外的文件被设置了setuid权限。 
    下面有一个自己编的小程序与大家分享。 
    程序功能描述:检查有没有/usr/secu/masterlist文件记录之外的其它文件被设置了setuid权限 
    事先要求:在系统调试完成,所有需要安装的软件安装好以后,执行下面命令生成检查对照文件 
    # mkdir –p /usr/secu 
    # find / -perm –4000 –print >; /usr/secu/masterlist 
    程序: 
    cd /tmp 
    [ -f secrcheck ] && rm secrcheck find / -perm -4000 -print >;secrcheck for f in `cat secrcheck` do grep -w $f /usr/secu/masterlist >;/dev/null if [ "$?" != "0" ]; then echo $f is not in list 
    fi done 
    rm secrcheck 在需要对系统做检查时,执行本shell程序。也可以放在定时进程中定时检查。程序由于需要在整个文件系统中做查找操作,需要比较长的时间。 
     请您作完本文中的实验后,别忘把文件的权限改回原状。
八、Solaris系统安全之审计
作为C2安全等级操作系统(公安部二级),Solaris最主要的安全功能之一就是审计功能,本文将简单介绍Solaris审计功能的使用和启动。
目的:纪录系统和用户事件,并对审计过程自身进行保护。这里值得注意的就是纪录事件的细度。Solaris提供了很强大的审计功能,甚至可以纪录每一条调试信息,但是这样做是不明智的,因为很多信息对用户没用,而且会使系统性能下降。审计细度需要管理员根据用途和需要自行订制。 
实现: 
    8.1. 查看日志 
    1) history文件 
    通常在根目录下,隐藏文件,记录了root执行的命令 
    2) /var/adm 
    messages:记载来自系统核心的各种运行日志,可以记载的内容是由/etc/syslog.conf决定的 
    sulog:记载着普通用户尝试su成为其它用户的纪录。它的格式为: 发生时间 +/-(成功/失败) pts号 
    utmpx:这两个文件是不具可读性的,它们记录着当前登录在主机上的用户,管理员可以用w,who等命令来看 
    wtmpx:相当于历史纪录,记录着所有登录过主机的用户,时间,来源等内容,可用last命令来看 
    3) /var/log 
    syslog文件,这个文件的内容一般是纪录mail事件的 

    8.2. syslog 
    1) 实时错误检查: 
    tail –f /var/adm/messages 
    -f在监视器上允许看见每条记录 /var/adm/messages记录事件路径 
    2) /etc/syslog.conf语法: 
    *.err;kern.debug;deamon.notice;mail.crit /var/adm/messages 

    工具认可的值 
    值 描述 
    user 用户进程产生的消息。这是来自没有在文件列表中的设备的消息的默认优先级 
    kern 由内核产生的消息 
    mail 邮件系统 
    daemon 系统守护进程 
    auth 授权系统,如login、su 
    lpr 行式打印机假脱机系统 
    news 网络新闻系统USENET保留值 
    uucp 为UUCP系统保留值,目前UUCP不使用syslog机制 
    cron Cron/at工具;crontab、at、cron 
    local0-7 为本地使用保留 
    mark 内部用于由syslog产生的时间戳消息 
    * 除标记工具之外的所有工具 
    级别认可的值(按重要性降序排列) 
    emerg 用于通常必须广播给所有用户的恐慌情况 
    alert 必须立即被修正的情况,例如被损坏的系统数据库 
    crit 用户对关键情况的告警,例如设备错误 
    err 用于其他错误 
    warning 用于所有的警告信息 
    notice 用于没有错误但是可能需要特别处理的情况。 
    info 通知消息 
    debug 用于通常只在调试时才使用的消息 
    none 不发送从指出的设备发来的消息到选定文件中 
    3) 例如如果要纪录登录信息(telnet),可以这样做: 
    /etc/default/login中:SYSLOG=YES 
    /etc/syslog.conf中添加:auth.notice /export/home/wangyu/log 
    (把日志记录在/export/home/wangyu/log文件中,中间不是空格,是Tab) 
    重新启动syslog守护进程 
    当telnet上去的时候,我们看到/export/home/wangyu/log中有: 
    Sep 11 10:07:25 hlstar login: [ID 254462 auth.notice] ROOT LOGIN /dev/pts/1     FROM 192.168.0.9 

    8.3. Loghost 
    编辑/etc/syslog.conf,语法: 
    *.err;kern.debug;deamon.notice;mail.crit @loghost 
    (记录登录信息) 
    重新启动syslog守护进程 
    假设这次我们使用linux做日志主机: 
     [root@wangyu root]#/sbin/setup 
    打开配置界面-->;firewall configuration-->;custom-->;other ports: 
    写入 syslog:udp 
    重新启动防火墙 
    /etc/init.d/iptables restart或者/etc/init.d/ipchains restart 
    设置loghost接收网络日志数据,修改/etc/sysconfig/syslog配置文件: 
    修改 SYSLOGD_OPTIONS="-m 0" 为 SYSLOGD_OPTIONS="-r -m 0" 
    重新启动syslog守护进程 
    此时/var/log/messages最下端附近会看到类似下面的信息 
    Aug 11 21:20:30 logserver syslogd 1.3-3: restart. (remote reception) 
    当telnet上去的时候,我们看到/var/log/messages中有类似下面的信息: 
    Sep 5 11:08:31 mastadon login: [ID 507249 auth.notice] Login failure on /dev/pts/3 from 192.168.0.9, root 

    8.4. 记帐 
    Solaris操作系统可以通过设置日志文件可以对每个用户的每一条命令进行纪录,这一功能默认是不开放的 
    运行/usr/lib/acct/accton [路径][文件名] 
    (如/usr/lib/acct/accton /export/home/wangyu/test,将日志记录到test中) 
    查看的时候将文件移动到/var/adm目录下,改名为pacct 
    执行查看命令lastcomm(比如查看用户root,用命令lastcomm root) 

     8.5. BSM(以下部分节减自freedemon的“SecU  Solaris p2.3 BSM审计系统”,详见    http: //bbs.nsfocus.net/index.php?act=ST&f=10&t=147174) 
    1) 开启BSM: 
    # init 1 (重新引导或改变运行级别到单用户状态) 
    #/etc/security/bsmconv (运行BSM初始化脚本,开启审计功能) 
    # reboot (重新启动系统,或者Ctrl+D改变到多用户状态) 
    2) 关闭BSM审计功能: 
    # init 1 
    # /etc/security/bsmunconv 
    # reboot 
    3) 配置文件的功能: 
    BSM所有的配置文件都存放在/etc/security目录下( (4)代表详细信息察看man (4) : 
    audit_class(4) 
    审计类别定义 
    audit_control(4) 
    审计进程控制信息 
    audit_data(4) 
    审计进程当前信息 
    audit.log(4)审计日志格式 
    audit_event(4) 
    时间定义到类别的映射文件 
    audit_user(4) 
    按用户审计时的用户定义文件 
    除了上面的配置文件之外,系统中还有一些用于BSM管理的脚本。 
    audit_startup(1M) 
    启动BSM进程运行。 
    auditconfig(1M) 
    读取配置文件,重新配置audit进程。 
    auditd(1M) 
    审计监控服务。 
    auditreduce(1M) 
    审计事件日志管理,可以调整日志格式,生成时间周期等信息。 
    auditstat(1M) 
    先是内核审计进程状态。 
    bsmconv(1M) 
    开启BSM功能。 
    bsmunconv(1M) 
    关闭BSM功能。 
    praudit(1M) 
    打印BSM审计日志内容。 
    4) BSM应用 
     在默认配置情况下,BSM每天(24小时)会生成一个以当天日期为名字的审计日志,存放在     /var/audit目录下,这个文件具有自己的数据结构,所以直接查看时是乱码,必须使用系统命令 praudit 来查看。 
    # praudit /var/audit/xxxxxx.xxxxxx.log 
     另一个可能用到的命令是auditreduce ,这个命令允许管理员对审计日志做一些设置,例如调整审计事件集或调整审计日志生成周期等等。auditreduce和praudit是系统中BSM管理最基本的两个命令,组合起来可以完成相当多的功能:  
    用管道联合两个命令,会显示系统中所有的历史审计事件。 
    # auditreduce | praudit 
    再加上lp,将把所有审计事件直接打印出来。
   # auditreduce | praudit | lp 
     如果系统中有相当多的审计信息的话,查找将是非常困难的事情,这条命令可以按照yymmdd的时间格式显示目标时间段内的审计事件,范例为显示April 13, 1990, 用户fred的登录类别审计事件集。 
    # auditreduce -d 900413 -u fred -c lo | praudit 
    过滤目标时间所有的登录日志信息(Class:lo),并且输出到一个单独的日志文件中: 
    # auditreduce -c lo -d 870413 -O /usr/audit_summary/logins 
     auditreduce的 -b 和 -a 选项允许用户按照  yyyymmdd00:00:00 的时间格式制定一个时间段(Before & After)。  
    # auditreduce -a 91071500:00:00 | praudit 
    # auditreduce -b 91071500:00:00 | praudit 
    5) 管理工具: 
    eXpert-BSMTM 
    一个很强大的商业BSM分析工具,不过目前也可以免费使用,支持Solaris 7/8 (Sparc|Intel)平台,可以在下面地址下载。 
http://www.sdl.sri.com/projects/emerald/releases/eXpert-BSM/download.html 
    Sun WBEM 
    Solaris内置的图形界面管理工具,也就是AdminConsole,在WBEM 2.3之后的版本支持对BSM信息的管理。可以用下面命令开启: 
    # /usr/sadm/bin/wbemadmin (第一次运行时会安装一系列的管理脚本) 
    # /usr/sadm/bin/smc (开启管理终端) 

    以上,对Solaris审计系统进行了配置,相信大部分用户行为和入侵行为都被记录下来了,并且对日志自身也进行了一定保护。如果管理员能及时分析日志,相信可以捕获大部分入侵企图和行为。

posted @ 2006-11-05 17:14 狼爱上狸 阅读(542) | 评论 (0)编辑 收藏

给solaris打补丁

出处:http://www.xxlinux.com/linux/article/unix/rumen/2006-06-25/2117.html

一、solaris补丁介绍 

1.1补丁的种类及文件名 
    solaris的补丁分为两类,一类是Point补丁,另一类是Cluster补丁。 

a)Point补丁程序: 
       这类补丁仅仅是针对某一问题或缺陷而发布的单个补丁程序,solaris7、 solaris8、solairs9的Patch一般为*.zip文件solaris2.6一般为.tar.Z或.tar.gz文件,它有如下编号方式:
patch base code-revision num  (如110668-04)
前面部分是这个补丁的主版本号(base code),后面部分是此补丁的修订号。两者合起来构成此补丁的Patch-ID。如上例编号为110668- 04的补丁,110668为主版本号,04是修订号。此补丁是在110668-03的基础上做了新的修复。有一点需要指出,补丁版本号为110668的一系列补丁都是针对 /usr/sbin/in.telnetd 这一文件的不同问题的修复,110668-04发布以后,sun将不再提供110668- 04以前的补丁,如110668-03等。 

b) Cluster补丁程序:  
    cluster补丁仅仅是一系列point补丁的重新包装,并带有自动安装程序。Cluster补丁的命名方式如下:
version_Recommended 
如:9_x86_Recommended.zip是针对Solaris 9 for X86的补丁集。 
    8_Recommended.zip是针对Solaris 8 for Sparc 的补丁集。 
    每个Cluster补丁都对应一个CLUSTER_README文件,详细描述了该Cluster包含的补丁,以及安装的方法或注意事项。 

1.2 关于补丁的其他信息 
     sun公司对每一版本的solaris都维护了一份Patch Reports,该 Patch Reports包含了对应版本solaris所有补丁的描述。Patch Reports每月更新两次,可以从如下地址得到: 
http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage 

     另外sun还维护了一份Sun Alert Patch Report,该文档按产品分类,并且随时更新。从这里可以找到所有sun产品的更新文档及相应补丁,当然也包括的solaris的Sun Alert 文档、Patch ID、简要说明等。Sun Alert Patch Report从这里可以得到: 
http://sunsolve.sun.com/pub-cgi/show.pl?target=sunalert_patches 
相应的solaris部分可从如下链接得到: 
http://sunsolve.sun.com/pub-cgi/show.pl?target=sunalert_patches#Solaris 
表格按时间排序,从Category表格中可以知道此问题属于安全缺陷修复还是应用优化。 

二、补丁的下载 
    Cluster补丁可以从如下网址下载:
http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage 
同样可以使用FTP协议下载,在sunsolve.sun.com的/pacthroot/clusters可以找到所有的Cluster补丁。下载后为一个*_Recommended.zip文件。该压缩文件包含一份CLUSTER_README文件,建议安装前阅读此文件。 
    Point 补丁由于其分散性不易下载与管理,可以使用Sun Alert Patch Report或Patch Reports来查看补丁情况,这两份文档相应的 Patch ID及对应下载地址。另外sun网站提供的Patch Finder 功能也可以使我们在知道Patch ID的情况下很方便的找到该补丁,连接如下: 
http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage 
同样,利用ftp协议从sunsolve.sun.com的/patchroot/all_unsigned目录下也可以下载指定Patch。 
    Sun公司建议所有下载的补丁都放到/var/tmp目录下(这也是通常的做法),如此将不会导致补丁安装时出现的任何permission/ownership的问题。

三、solaris补丁的安装和删除 

3.1 /var/sadm/patch目录 
    在/var/sadm/patch目录下,记录了已安装的补丁。 
    如: # ls /var/sadm/patch  
    107558-05 107594-04 107630-01 107663-01 107683-01  
    107696-01 107817-01 107582-01 107612-06 107640-03 
    建议不要对此目录做任何修改,此目录被破坏后将不能安装或删除任何补丁。 

3.2 管理solaris补丁 
    Solaris 提供了两个命令来管理补丁,patchadd和patchrm。这两个命令是在Solaris 2.6版本开始提供的,在2.6以前的版本中,每个补丁包中都提供了一个installpatch 程序和一个backoutpatch 程序来完成补丁的安装和卸载。
    patchadd用来安装解压缩后的补丁程序。patchadd通过调用pkgadd 命令来安装补丁。安装补丁前,我们需要将补丁解压到/var/tmp下安装。安装补丁如下命令: 
    # cd /var/tmp 
    # patchadd 110668-04 
    Checking installed patches... 
    Verifying sufficient filesystem capacity (dry run method) 
    Installing patch packages... 
     
     如果当前目录下有110668-04目录,patchadd将安装此补丁。补丁安装后,系统会备份原文件,以便在以后删除此补丁。如果使用 patchadd -d 选项安装补丁,系统将不备份源文件,这意味着你将不能在以后删除此补丁。使用patchadd -p 选项可以检验已安装的 patch,例如: 
    # patchadd -p 
    Patch: 106793-01 Obsoletes: Requires: Incompatibles: 
    Packages: SUNWhea 
    . . . 
    同样,solaris提供了另一命令来查看已安装的patch: 
    # showrev -p 
    Patch: 106793-01 Obsoletes: Requires: Incompatibles: 
    Packages: SUNWhea 
    . . . 
     patchrm 如果因为某种情况你想卸载某一补丁,你可以使用patchrm命令来完成。此命令通过调用 pkgadd来恢复安装补丁前的文件备份来卸载补丁。使用Patch-ID作为patchrm的参数就可以卸载补丁: 
    # patchrm 106793-01 
    Checking installed packages and patches... 
    Backing out patch 106793-01... 
    Patch 106793-01 has been backed out. 
    这里需要说明一下,在如下三种情况下,补丁将不能卸载: 
    1).在安装patch时,用patchadd -d命令指定patchadd不备份被更新的文件。这样安装的patch无法删除。 
    2).另一patch需要此patch,即存在dependence(关联性), 如一定要删掉该patch,先删掉另一patch。 
     3).要删的patch已被另一更新的patch废弃了。如安装110668-04补丁后,如果以前安装过 110668-03,则110668-03将被110668-04废弃,110668-03将无法删除。 

3.3 Cluster补丁的安装 
    Cluster 补丁为单个补丁的集合,下载解压后,可以通过执行./install_Cluster脚本来完成补丁集的安装。执行./install_Cluster 后,脚本将检查当前目录下的patch_order文件,此文件标明了Patch的安装顺序,./install_Cluster将按照 patch_order文件给出的顺序来安装patch。如果没有patch_order文件,则假定当前目录下所有以1开始的目录名均为需要安装的补丁目录,并且假定这些目录的名称次序作为安装Patch的次序。因此你可以通过修改patch_order文件来决定安装或不安装某Patch。 

3.4 安装Patch时的注意事项 
     由于在安装Patch时需要更新文件,故此Solaris官方推荐在安装补丁时进入单用户模式安装。在某些重要服务器上可能带来不便,因此你完全可以在多用户模式下通过停止相关服务进程来完成Patch的安装。 
    Sun 推出的Patch并不是每个都一定要安装的,因此需要在安装patch前仔细阅读README来确定是否需要安装此补丁。另外,某些补丁具有依赖性,需要先安装另一补丁才能完成此补丁的安装,这些都会在README中标明。总之,安装补丁之前强烈建议你阅读相应的README(每个Patch都提供单独的 README文件)。 

3.5 安装PATCH过程中出现的问题 
    在安装补丁的过程中,经常出现一些错误提示。例如: 
    Installation of 123456-11 failed. Return code 2 
     通过Return code我们可以知道错误类型。需要注意的是,Return code 2说明此补丁已被安装,Return code 8说明此补丁要修复的软件没有被系统安装。因此,2和8是完全可以被忽略的错误提示。下表说明了各个Return code对应的错误类型。 
Exit code Meaning  
0 No error  
1 Usage error  
2 Attempt to apply a patch that's already been applied  
3 Effective UID is not root  
4 Attempt to save original files failed  
5 pkgadd failed  
6 Patch is obsoleted  
7 Invalid package directory  
8 Attempting to patch a package that is not installed  
9 Cannot access /usr/sbin/pkgadd (client problem)  
10 Package validation errors  
11 Error adding patch to root template  
12 Patch script terminated due to signal  
13 Symbolic link included in patch  
14 NOT USED  
15 The prepatch script had a return code other than 0.  
16 The postpatch script had a return code other than 0.

posted @ 2006-11-05 17:13 狼爱上狸 阅读(392) | 评论 (0)编辑 收藏

myslq日期与时间函数

对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。 

这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: 

mysql> SELECT something FROM table 
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; 

DAYOFWEEK(date) 
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。 
mysql> select DAYOFWEEK('1998-02-03'); 
-> 3 

WEEKDAY(date) 
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。 
mysql> select WEEKDAY('1997-10-04 22:23:00'); 
-> 5 
mysql> select WEEKDAY('1997-11-05'); 
-> 2 

DAYOFMONTH(date) 
返回date的月份中日期,在1到31范围内。 
mysql> select DAYOFMONTH('1998-02-03'); 
-> 3 

DAYOFYEAR(date) 
返回date在一年中的日数, 在1到366范围内。 
mysql> select DAYOFYEAR('1998-02-03'); 
-> 34 

MONTH(date) 
返回date的月份,范围1到12。 
mysql> select MONTH('1998-02-03'); 
-> 2 

DAYNAME(date) 
返回date的星期名字。 
mysql> select DAYNAME("1998-02-05"); 
-> 'Thursday' 

MONTHNAME(date) 
返回date的月份名字。 
mysql> select MONTHNAME("1998-02-05"); 
-> 'February' 

QUARTER(date) 
返回date一年中的季度,范围1到4。 
mysql> select QUARTER('98-04-01'); 
-> 2 

WEEK(date) 
  
WEEK(date,first) 
对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许
你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,
从星期一开始。 
mysql> select WEEK('1998-02-20'); 
-> 7 
mysql> select WEEK('1998-02-20',0); 
-> 7 
mysql> select WEEK('1998-02-20',1); 
-> 8 

YEAR(date) 
返回date的年份,范围在1000到9999。 
mysql> select YEAR('98-02-03'); 
-> 1998 

HOUR(time) 
返回time的小时,范围是0到23。 
mysql> select HOUR('10:05:03'); 
-> 10 

MINUTE(time) 
返回time的分钟,范围是0到59。 
mysql> select MINUTE('98-02-03 10:05:03'); 
-> 5 

SECOND(time) 
回来time的秒数,范围是0到59。 
mysql> select SECOND('10:05:03'); 
-> 3 

PERIOD_ADD(P,N) 
增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。 
mysql> select PERIOD_ADD(9801,2); 
-> 199803 

PERIOD_DIFF(P1,P2) 
返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。 
mysql> select PERIOD_DIFF(9802,199703); 
-> 11 

DATE_ADD(date,INTERVAL expr type) 
  
DATE_SUB(date,INTERVAL expr type) 
  
ADDDATE(date,INTERVAL expr type) 
  
SUBDATE(date,INTERVAL expr type) 
这些功能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。
在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的
DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;它可以以
一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期
中返回“type”间隔。下表显示了type和expr参数怎样被关联: type值 含义 期望的expr格式 
SECOND 秒 SECONDS 
MINUTE 分钟 MINUTES 
HOUR 时间 HOURS 
DAY 天 DAYS 
MONTH 月 MONTHS 
YEAR 年 YEARS 
MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS" 
HOUR_MINUTE 小时和分钟 "HOURS:MINUTES" 
DAY_HOUR 天和小时 "DAYS HOURS" 
YEAR_MONTH 年和月 "YEARS-MONTHS" 
HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS" 
DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES" 
DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS" 

MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅
包含YEAR、MONTH和DAY部分(即,没有时间部分),结果是一个DATE值。否则结果是一个DATETIME值。 

mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; 
-> 1998-01-01 00:00:00 
mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; 
-> 1998-01-01 
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; 
-> 1997-12-31 23:59:59 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59", 
INTERVAL 1 SECOND); 
-> 1998-01-01 00:00:00 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59", 
INTERVAL 1 DAY); 
-> 1998-01-01 23:59:59 
mysql> SELECT DATE_ADD("1997-12-31 23:59:59", 
INTERVAL "1:1" MINUTE_SECOND); 
-> 1998-01-01 00:01:00 
mysql> SELECT DATE_SUB("1998-01-01 00:00:00", 
INTERVAL "1 1:1:1" DAY_SECOND); 
-> 1997-12-30 22:58:59 
mysql> SELECT DATE_ADD("1998-01-01 00:00:00", 
INTERVAL "-1 10" DAY_HOUR); 
-> 1997-12-30 14:00:00 
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); 
-> 1997-12-02 
mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); 
-> 1999 
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); 
-> 199907 
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); 
-> 20102 

如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,
如果你指定一个type是DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值,
MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND
的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,
结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。 

mysql> select DATE_ADD('1998-01-30', Interval 1 month); 
-> 1998-02-28 

注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。 
TO_DAYS(date) 
给出一个日期date,返回一个天数(从0年的天数)。 
mysql> select TO_DAYS(950501); 
-> 728779 
mysql> select TO_DAYS('1997-10-07'); 
-> 729669 

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 

FROM_DAYS(N) 
给出一个天数N,返回一个DATE值。 
mysql> select FROM_DAYS(729669); 
-> '1997-10-07' 

TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 

DATE_FORMAT(date,format) 
根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December) 
%W 星期名字(Sunday……Saturday) 
%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 
%Y 年, 数字, 4 位 
%y 年, 数字, 2 位 
%a 缩写的星期名字(Sun……Sat) 
%d 月份中的天数, 数字(00……31) 
%e 月份中的天数, 数字(0……31) 
%m 月, 数字(01……12) 
%c 月, 数字(1……12) 
%b 缩写的月份名字(Jan……Dec) 
%j 一年中的天数(001……366) 
%H 小时(00……23) 
%k 小时(0……23) 
%h 小时(01……12) 
%I 小时(01……12) 
%l 小时(1……12) 
%i 分钟, 数字(00……59) 
%r 时间,12 小时(hh:mm:ss [AP]M) 
%T 时间,24 小时(hh:mm:ss) 
%S 秒(00……59) 
%s 秒(00……59) 
%p AM或PM 
%w 一个星期中的天数(0=Sunday ……6=Saturday ) 
%U 星期(0……52), 这里星期天是星期的第一天 
%u 星期(0……52), 这里星期一是星期的第一天 
%% 一个文字“%”。 

所有的其他字符不做解释被复制到结果中。 

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); 
-> 'Saturday October 1997' 
mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); 
-> '22:23:00' 
mysql> select DATE_FORMAT('1997-10-04 22:23:00', 
'%D %y %a %d %m %b %j'); 
-> '4th 97 Sat 04 10 Oct 277' 
mysql> select DATE_FORMAT('1997-10-04 22:23:00', 
'%H %k %I %r %T %S %w'); 
-> '22 22 10 10:23:00 PM 22:23:00 00 6' 
MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。 

TIME_FORMAT(time,format) 
这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。
其他修饰符产生一个NULL值或0。 
CURDATE() 
  
CURRENT_DATE 
以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。 
mysql> select CURDATE(); 
-> '1997-12-15' 
mysql> select CURDATE() + 0; 
-> 19971215 

CURTIME() 
  
CURRENT_TIME 
以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。 
mysql> select CURTIME(); 
-> '23:50:26' 
mysql> select CURTIME() + 0; 
-> 235026 

NOW() 
  
SYSDATE() 
  
CURRENT_TIMESTAMP 
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的
上下文被使用。 
mysql> select NOW(); 
-> '1997-12-15 23:50:26' 
mysql> select NOW() + 0; 
-> 19971215235026 

UNIX_TIMESTAMP() 
  
UNIX_TIMESTAMP(date) 
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一
个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME
字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。 
mysql> select UNIX_TIMESTAMP(); 
-> 882226357 
mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); 
-> 875996580 

当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。 

FROM_UNIXTIME(unix_timestamp) 
以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串
还是或数字上下文中被使用。 
mysql> select FROM_UNIXTIME(875996580); 
-> '1997-10-04 22:23:00' 
mysql> select FROM_UNIXTIME(875996580) + 0; 
-> 19971004222300 

FROM_UNIXTIME(unix_timestamp,format) 
返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条
目同样的修饰符。 
mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), 
'%Y %D %M %h:%i:%s %x'); 
-> '1997 23rd December 03:43:30 x' 

SEC_TO_TIME(seconds) 
返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字
上下文中被使用。 
mysql> select SEC_TO_TIME(2378); 
-> '00:39:38' 
mysql> select SEC_TO_TIME(2378) + 0; 
-> 3938 

TIME_TO_SEC(time) 
返回time参数,转换成秒。 
mysql> select TIME_TO_SEC('22:23:00'); 
-> 80580 
mysql> select TIME_TO_SEC('00:39:38'); 
-> 2378

posted @ 2006-11-05 17:10 狼爱上狸 阅读(412) | 评论 (0)编辑 收藏

Solaris 10操作系统的以太网卡设置(二)--网卡设置入门篇

出处:http://isv.sun.com.cn/message/common/msgview.jsp?msgid=10336

二. 网卡设置入门篇

上一篇我们介绍的是网卡驱动程序的安装过程,并成功安装了VIA rhine II网卡的驱动程序。本篇将以上一篇中安装的网卡rh0为例,对IP地址和子网掩码等一些基本的网络参数进行设置。
通常的设置方式有两种,一是使用ifconfig命令,二是通过创建和修改相关配置文件。使用ifconfig命令,可以使设置立即生效,但设置是临时的,每次系统重启后,需要重新进行设置。而创建和修改配置文件,可保存设置,系统每次启动时,会根据配置文件的内容自动对网卡进行设置。

1. 使用ifconfig命令对网卡进行设置

1) 激活网卡(# ifconfig plumb up)
激活网卡的意义在于将网卡驱动程序加载到Solaris系统的内核中,激活之后才可以进一步对网卡进行操作。

手动激活rh0,
# ifconfig rh0 plumb up

验证结果,
# ifconfig -a
lo0: flags=2001000849 mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
rh0: flags=1000843 mtu 1500 index 2
inet 0.0.0.0 netmask 0
ether 0:8:d:6e:8b:f1
可以看到rh0已被激活,但还没有分配地址。

2) 分配地址
网卡地址分配通常包括静态分配和dhcp动态分配两种方式。任选其一。

a) 静态分配地址(命令 # ifconfig <interface> <address> netmask <netmask>)

把IP: 129.158.215.204 , netmask: 255.255.255.0分配给rh0,
# ifconfig rh0 129.158.215.204 netmask 255.255.255.0

验证结果,
# ifconfig rh0
rh0: flags=1000843 mtu 1500 index 2
inet 129.158.215.204 netmask ffffff00 broadcast 129.158.215.255
ether 0:8:d:6e:8b:f1
IP和子网掩码已生效。

b) 通过dhcp方式分配地址(命令 # ifconfig dhcp )

重新激活rh0,
# ifconfig rh0 unplumb down
# ifconfig rh0 plumb up

通过dhcp方式获得IP和子网掩码,
# ifconfig rh0 dhcp

验证结果,
# ifconfig rh0
rh0: flags=1004843 mtu 1500 index 2
inet 129.158.215.247 netmask ffffff00 broadcast 129.158.215.255
ether 0:8:d:6e:8b:f1
已自动获取到IP和子网掩码。

2. 通过配置文件对网卡进行设置

和网卡基本设置相关的配置文件放在/etc/inet和/etc目录下,包括
/etc/hosts -> /etc/inet/hosts (文件中的每一行记录表示hostname和ip地址的对应关系)
/etc/hostname. (文件内容和文件的扩展名构成hostname和interface设备名的对应关系)
/etc/netmasks (文件中的每一行记录表示和netmask的对应关系)
/etc/dhcp. (dhcp)
创建和修改配置文件后,需要重启系统才能使设置生效。
1) 分配地址
同样包括静态分配和dhcp动态分配两种方式。任选其一。

a) 静态分配地址(文件 /etc/hosts , /etc/netmask , /etc/hostname.

1> 自定义一个hostname,并指定IP地址
# vi /etc/hosts
加入一行记录:129.158.215.204 myhostname loghost
:x!保存退出。

2> 定义子网掩码
# vi /etc/netmasks
加入一行记录:129.158.215.0 255.255.255.0
:wq保存退出。

3> 将自定义的hostname关联到rh0
# vi hostname.rh0
加入一行记录:myhostname
:wq保存退出。

b) 通过dhcp方式分配地址(文件 /etc/hostaname. , /etc/dhcp.

1> 创建空文件hostname.rh0
# touch /etc/hostname.rh0

2> 创建文件dhcp.rh0
# touch /etcdhcp.rh0
需要的话还可以在该文件中填入超时时间(秒),比如:30

2) 重启系统
# reboot

3) 常见问题:
在/etc/hosts文件中修改了IP地址,重启后,发现机器的IP地址还是原来的,是怎么回事?
问题可能出在/etc/inet/ipnodes文件。该文件的语法跟/etc/hosts相同,但优先级高于/etc/hosts。如果/etc/inet/ipnodes文件中保留了原来的IP地址,那么/etc/hosts中相同hostname的IP设置将被忽略。将ipnodes文件中的IP地址一行删掉,或改成新的IP地址,重启后,问题就消失了。

3. sys-unconfig
如果觉得使用ifconfig命令和手工修改配置文件太麻烦,可运行sys-unconfig命令,以交互方式对系统重新进行设置。执行
# sys-unconfig
重启后,系统会提示对网卡进行设置,并将设置结果自动保存到配置文件中。

posted @ 2006-11-05 17:05 狼爱上狸 阅读(3077) | 评论 (0)编辑 收藏

GBK->Unicode

把特定编码文件信息的文件转换为Unicode编码的文件:
c:\jdk1.5\bin\> native2ascii -encoding GBK a.txt > custMessages_zh.properties

posted @ 2006-11-05 17:03 狼爱上狸 阅读(300) | 评论 (0)编辑 收藏

JAVA混淆编译工具总汇

现在企业中用java作为开发语言的越来越多,但是代码的安全问题也很严重,对java的代码保护最常用的策略是对代码进行混淆编译,有很多工具可以供大家选择。

Author/Company Program Shrinking Obfuscation License
Eric Lafortune ProGuard x x Free (GPL)
Jochen Hoenicke Jode x x Free (GPL)
Hidetoshi Ohuchi Jarg x x Free (BSD)
NQ4 Joga x x Free (no source)
Alexander Shvets CafeBabe x x Free
Nate Nystrom Bloat x
Free
RiggsHill Software GenJar x
Free (Apache)
RetroLogic RetroGuard
x Free (LGPL)
Thorsten Heit JavaGuard
x Free (LGPL)
Patrick Mueller Mwobfu
x Free (GPL)
Bajie JCMP
x Free
yWorks yGuard
x Free
Dr. Java Marvin Obfuscator
x Free (no source)
IBM AlphaWorks JAX x x Commercial
PreEmptive DashOPro x x Commercial
Zelix KlassMaster x x Commercial
S5 Systems jPresto x x Commercial
CodingArt CodeShield x x Commercial
Plumb Design Condensity x x Commercial
Eastridge Technology Jshrink x x Commercial
Helseth JObfuscator x x Commercial
LeeSoftware Smokescreen Obfuscator x x Commercial
Vega Technologies JZipper x x Commercial
Sergey Sverdlov J.Class Optimizer x
Commercial
Force 5 JCloak
x Commercial
WingSoft WingGuard
x Commercial
JAMM Consulting ObfuscatePro
x Commercial
2LKit 2LKit Obfuscator
x Commercial
Duckware Jobfuscate
x Commercial

出处:http://www.zahui.com/html/6/11879.htm

posted @ 2006-11-05 12:19 狼爱上狸 阅读(417) | 评论 (0)编辑 收藏

Unicode是什么,UTF-8是什么

一直在编码方面要求不是很高,所以对Unicode和UTF-8也不甚了解。
  最近偶然翻到一篇UTF-8的文章,感觉解释的非常繁杂,因此才想到重新写一篇简单易懂一点的。


  首先说明一下现在常用的一些编码方案:
  1、在中国,大陆最常用的就是GBK18030编码,除此之外还有GBK,GB2312,这几个编码的关系是这样的。
最早制定的汉字编码是GB2312,包括6763个汉字和682个其它符号
95年重新修订了编码,命名GBK1.0,共收录了21886个符号。
之后又推出了GBK18030编码,共收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字,现在WINDOWS平台必需要支持GBK18030编码。

按照GBK18030、GBK、GB2312的顺序,3种编码是向下兼容,同一个汉字在三个编码方案中是相同的编码。

  2、台湾,香港等地使用的是BIG5编码
  3、日本:SJIS编码

  如果把各种文字编码形容为各地的方言,那么Unicode就是世界各国合作开发的一种语言。
  在这种语言环境下,不会再有语言的编码冲突,在同屏下,可以显示任何语言的内容,这就是Unicode的最大好处。

  那么Unicode是如何编码的呢?其实非常简单。
  就是将世界上所有的文字用2个字节统一进行编码。可能你会问,2个字节最多能够表示65536个编码,够用吗?
  韩国和日本的大部分汉字都是从中国传播过去的,字型是完全一样的。
  比如:“文”字,GBK和SJIS中都是同一个汉字,只是编码不同而已。
  那样,像这样统一编码,2个字节就已经足够容纳世界上所有的语言的大部分文字了。

  Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。
  现在用的是UCS-2,即2个字节编码,而UCS-4是为了防止将来2个字节不够用才开发的。UCS-2也称为基本多文种平面。
  UCS-2转换到UCS-4只是简单的在前面加2个字节0。
  UCS-4则主要用于保存辅助平面,例如Unicode 4.0中的第二辅助平面
  20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
  总共增加了16个辅助平面,由原先的65536个编码扩展至将近100万编码。

  那么既然统一了编码,如何兼容原先各国的文字编码呢?
  这个时候就需要codepage了。
  什么是codepage?codepage就是各国的文字编码和Unicode之间的映射表。
  比如简体中文和Unicode的映射表就是CP936,点这里查看官方的映射表。

  以下是几个常用的codepage,相应的修改上面的地址的数字即可。
codepage=936 简体中文GBK
codepage=950 繁体中文BIG5
codepage=437 美国/加拿大英语
codepage=932 日文
codepage=949 韩文
codepage=866 俄文
codepage=65001 unicode UFT-8

最后一个65001,据个人理解,应该只是一个虚拟的映射表,实际只是一个算法而已。

从936中随意取一行,例如:
0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
前面的编码是GBK的编码,后面的是Unicode。
通过查这张表,就能简单的实现GBK和Unicode之间的转换。

  现在明白了Unicode,那么UTF-8又是什么呢?又为什么会出现UTF-8呢?

  ASCII转换成UCS-2,只是在编码前插入一个0x0。用这些编码,会包括一些控制符,比如 或 /,这在UNIX和一些C函数中,将会产生严重错误。因此可以肯定,UCS-2不适合作为Unicode的外部编码。

  因此,才诞生了UTF-8。那么UTF-8是如何编码的?又是如何解决UCS-2的问题呢?

例:
E4 BD A0        11100100 10111101 10100000
这是“你”字的UTF-8编码
4F 60          01001111 01100000
这是“你”的Unicode编码

按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。
注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。
经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。

以下是Unicode和UTF-8之间的转换关系表:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。


出处:http://www.ii8888.com/Article_View.asp?id=871

posted @ 2006-11-03 10:07 狼爱上狸 阅读(460) | 评论 (0)编辑 收藏

Java中如何正确使用字体编码


在Java编程中,中文字体编码难倒了不少程序员,如果抓住了影响Java中文显示的几个关键因素,问题将迎刃而解。
Java是目前最流行的面向对象的编程语言之一,Java支持UTF-8、ISO-8859-1、GBK等各种字体编码,可笔者发现Java中字体编码的问题仍难倒了不少程序员,网上虽然也有不少关于在Java中如何正确显示中文的文章,但都不够全面,笔者特意总结如下。
影响Java中字体编码正确显示的有几个因素: 1)数据库的连接方式; 2)网页中使用的字体编码; 3)数据库里存放数据的字体编码; 4)Java的缺省字体编码。如果在编程中遇到不能正确显示中文时,要先弄清楚以上几项所使用的字体编码,再分析找出原因,即可解决问题。
众所周知,JSP是Java的一种,和网页有关,而网页也有自己的中文编码系统,所以JSP处理中文要比纯Java的类文件更为麻烦。本文的测试数据库是MySQL3.2,数据库连接驱动是用org.gjt.mm.mysql.Driver,这里主要讨论UTF-8和GBK的显示( GB2312是GBK的一个子集,Java中可以使用GBK来代替GB系列)。我们先来研究JSP中字体编码问题, 下面第一到第六点是针对JSP的(因为从数据库里读出中文数据与写入中文数据有所区别,咱们分别说明,前三点是从读取数据库到显示在网页,后三点是从网页输入数据到存入数据库),第七到第九点针对纯Java的类文件。 以下rs表示ResultSet的一个实例,是执行Select语句之后产生的数据集。
一、数据库连接方式使用UTF-8
在连接数据库的驱动后面加上这句参数useUnicode=true&characterEncoding=
UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=
true&characterEncoding=UTF-8,从数据库里读出中文显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")来显示正确的中文。值得注意的是如果页面使用UTF-8,数据库里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正确显示中文。如果网页是UTF-8,而数据库里存放的是GBK,无法直接显示中文,需要2步转换, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正确显示中文。
二、数据库连接方式使用GBK
在连接数据库的驱动后面加上这句参数useUnicode=true&characterEncoding=
GBK,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&UseUnicode=true&
characterEncoding=GBK,从数据库里读出中文,显示在使用GBK的JSP的网页里,如果数据库里存放的字体编码是UTF-8,在JSP中一定要使用 str=new String(rs.getBytes(1),"UTF-8"),才正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1),即可显示正确的中文。 如果网页是UTF-8,而数据库里存放的是GBK,只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法来显示中文; 如果网页是UTF-8,而数据库里存放的是UTF-8,可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法来显示中文。
三、使用缺省数据库连接方式
连接数据库的驱动后面没有这句参数useUnicode=&characterEncoding=,例如jdbc:mysql://localhost/DBVF?autoReconnect=true,没有参数useUnicode=true&characterEncoding,表示使用默认的ISO-8895-1编码。
1. 从数据库里读出中文,显示在GBK的网页里。如果数据库里存放的字体编码是UTF-8,在JSP网页中一定要使用语句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"),才可正确显示中文。如果数据库里存放的是GBK数据,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")或str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK") 显示正确的中文。
2. 如果网页是UTF-8,不能直接正确显示GBK,需要2步转换,str=new String(rs.getBytes(1),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK") 才可以正确显示中文。如果数据库里存的是UTF-8,直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就可以显示中文了。
以上是读取数据库里中文正确显示在网页上,下面三点是如何正确存入数据库。
四、数据库连接方式使用UTF-8编码
JSP中要把网页输入的中文存入数据库,通常有一个提交(Submit)的过程,是用str=request.getParameter("username"),然后执行update或者insert语句来存入数据库。如何赋值给str很重要,而且这里中文输入与网页所使用的字体编码有关。
1、 网页使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),都可以使得存到数据库里的数据是UTF-8编码。
2. 网页使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那么存入数据库的是UTF-8编码。
3. 值得注意的是使用UTF-8的数据库连接方式不能存得GBK。
五、数据库连接方式使用GBK编码
1. 输入使用GBK网页,存到数据库里是GBK的方法: str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"GBK")。
2. 网页使用GBK,想存入UTF-8到数据库里,要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK")即可。
3. 网页使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),那么存到数据库里的数据是UTF-8编码。
4. 网页使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"),那么存到数据库里的数据是GBK编码。
六、数据库连接方式使用缺省,即不使用参数useUnicode和characterEncoding
1. 网页使用GBK,如果使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes()),那么在数据库里的数据是GBK码。网页使用UTF-8 和使用str= request.getParameter("username"),则存入数据库是UTF-8编码。
2. 如果使用str= new String(request.getParameter("username").getBytes("ISO-8859-1")),那么根据网页提供的字体编码而存到数据库里,比如是UTF-8的网页,那么存到数据库中就是UTF-8编码,如果使用GBK网页,那么存到数据库里的字就是GBK编码。
3. 如果使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")这一种组合能存到正确的数据外,其他存到数据库里的数据则都是乱码或者错误码。在这个UTF-8组合的特例中,网页使用的是GBK,则存放到数据库里就是GBK,网页使用UTF-8,那么存到数据库里的就是UTF-8。
4. 网页是GBK的要存得UTF-8,一定需要2步: company=new String(request.getParameter("company").getBytes(),"GBK")和company=new String(company.getBytes("UTF-8"))。
5. 网页是UTF-8的,不能存得GBK在数据库里,一句话,改变数据库连接方式不能存得GBK码。
以上所有的都是基于JSP网页和数据库交换数据,下面讨论一下纯JAVA编程下的字体编码转换。
七、数据库连接方式使用UTF-8编码
1. 数据库里的中文是UTF-8,可以转换为GBK,但不能把GBK存入数据库。
2. 数据库是GBK,如果转换为UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接将content存入数据库就可为UTF-8。
八、数据库连接方式使用GBK编码
1. 数据库里的中文是UTF-8,如果转换为GBK,使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert语句插入到数据库,即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes()),再存入数据库即存得还是UTF-8编码。
2. 数据库里的中文是GBK,如果转换为UTF-8,使用content= new String(rs.getString(2).getBytes("UTF-8"))或者content= new String(rs.getString(2).getBytes("UTF-8"),"GBK"),再直接使用update或者insert语句插入到数据库,即存得UTF-8。
3. 如果某个String是GBK,要转换为UTF-8,也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 如果某个String是UTF-8,要转换为GBK,应该使用new String(UTFstr.getBytes("GBK"),"UTF-8")。
九、数据库连接方式使用缺省,即不跟参数
1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"),可以将数据库里的GBK编码转换为UTF-8。
2. 读取UTF-8然后存入UTF-8,则用str1=new String(UTFstr.getBytes(),"ISO-8859-1")或者str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1")。
3. 不能实现数据库里的UTF-8转换为GBK。
如果采用UTF-8的数据库连接方式或者缺省数据连接方式,那么无法将UTF-8转为GBK;而GBK的数据库连接方式可以实现UTF-8和GBK的相互转换。建议大家采用GBK的数据连接方式。出处:http://www.ccw.com.cn/cio/research/info/htm2005/20051118_13GHU.asp

posted @ 2006-11-01 16:43 狼爱上狸 阅读(273) | 评论 (0)编辑 收藏

仅列出标题
共38页: First 上一页 30 31 32 33 34 35 36 37 38 下一页