分页: 77/196 第一页 上页 72 73 74 75 76 77 78 79 80 81 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Mar 6
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
Mar 6
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
点击在新窗口中浏览此图片
Tags: ,
Mar 5
经过半天的努力终于将JSP+PHP+apache+resin在LINUX平台下全部配置完毕并完全整和通过测试成功
http://www.dfmqp.cn
本人的全部安装过程提供给LINUX爱好者共同分享,需要软件如下

resin:http://www.caucho.com/
jdk:http://java.sun.com/
apache:http://www.apache.org
mysql:http://www.mysql.com
php:http://www.php.net
jdbc:http://mmmysql.sourceforge.net/
本人所用的软件版本如下:
resin-3.0.10.tar.gz
j2sdk-1_4_2_05-linux-i586.bin
httpd-2.0.52.tar.gz
mysql-4.1.9.tar.gz
php-4.3.10.tar.gz
mysql-connector-java-3.1.6.tar.gz

一.安装MYSQL
我把他全部下在到/root 目录下
# chmod 755 mysql-4.1.9.tar.gz
# tar xfz mysql-4.1.9.tar.gz
解压后生成mysql-4.1.9目录,我们进入该目录:  
cd mysql-4.1.9
进入后就开始配置mysql了,配置过程中我们要给mysql设置一个安装目录,我们设置在 /usr/local/mysql 下,以为把文件放到一个地方比较容易管理,如果你还想获得更多的配置信息,使用 ./configure --help:
在这里我要特别强调在 编译的时候要选择好MYSQL的默认编码,因为如果不选择按默认安装的时候在JSP中就不支持GBK编码了
所以我这样编译
# ./configure --prefix=/usr/local/mysql --with-charset=gbk
然后等几秒钟,配置完成后就编译源代码
# make  
这个编译的过程比较长,如果机器比较慢的话,可能要近二十分种 ( 我的是联想服务器都需要了15分钟 ) . 编译完成后就安装:  
# make install
等上几秒钟,安装完成.下面就到了最关键的部分了,为什么老安装不成功,(至少我是安装了N次,N > 10 ,呵呵),问题关键就在这里,访问mysql要一个专门的用户,而且必须给相应的访问权限,这里我们就设置root和mysql有权限访问.  
我们先建立一个mysql和mysql用户来访问mysql:  
#  groupadd mysql #建立mysql组  
#  useradd mysql -g mysql #建立mysql用户并且加入到mysql组中  

建立用户后我们就初始化表 (注意:必须先执行本步骤后才能进行以下步骤)  

# ./scripts/mysql_install_db --user=mysql #初试化表并且规定用mysql用户来访问初始化表以后就开始给mysql和root用户设定访问权限, 我们先到安装mysql的目录:  

# cd /usr/local/mysql  

然后设置权限  

# chown -R root . #设定root能访问/usr/local/mysql  
# chown -R mysql var #设定mysql用户能访问/usr/local/mysql/var ,里面存的是mysql的数据库文件  
# chown -R mysql var/. #设定mysql用户能访问/usr/local/mysql/var下的所有文件  
# chown -R mysql var/mysql/. #设定mysql用户能访问/usr/local/mysql/var/mysql下的所有文件  
# chgrp -R mysql . #设定mysql组能够访问/usr/local/mysql  

设置完成后,基本上就装好了,好了,我们运行一下我们的mysql:  

# /usr/local/mysql/bin/mysqld_safe --user=mysql &  

如果没有问题的话,应该会出现类似这样的提示:  

[1] 42264  
# Starting mysqld daemon with databases from /usr/local/mysql/var  

这就证明你安装成功了
用如下命令修改MYSQL密码,默认安装密码为空,为了安全你必须马上修改
/usr/local/mysql/bin/mysqladmin -uroot password pengyong
现在修改的密码为:pengyong

二、安装jdk
# chmod 755 j2sdk-1_4_2_05-linux-i586.bin
# ./j2sdk-1_4_2_05-linux-i586.bin 释放j2sdk-1_4_2_05-linux-i586.bin
在/root目录下生成j2sdk1.4.2_05目录和文件我是将JDK装到/usr/java/目录下
将文件剪切到/usr/java/目录下
# mv j2sdk1.4.2_05/ /usr/java/
设置JDK变量环境

# vi /etc/profile
# /etc/profile
JAVA_HOME=/usr/java/j2sdk1.4.2_05
RESIN_HOME=/usr/resin
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/htmlco
nverter.jar:$RESIN_HOME/lib:/usr/java/jdbc/mysql-connector-java-3.1.6-bin.jar
退出当前登录的环境,重新登录,这样刚刚设定的环境变量就会生效,然后用如下命令测试:
[root@LINUX root]# echo $JAVA_HOME
/usr/java/j2sdk1.4.2_05
[root@LINUX root]# echo $CLASSPATH
.:/usr/java/j2sdk1.4.2_05/lib/dt.jar:/usr/java/j2sdk1.4.2_05/lib/tools.jar:/usr/
java/j2sdk1.4.2_05/lib/htmlconverter.jar:/usr/resin/lib:/usr/java/jdbc/mysql-con
nector-java-3.1.6-bin.jar
[root@LINUX root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bi
n:/usr/local/sbin:/usr/bin/X11:/usr/java/j2sdk1.4.2_05/bin:/usr/X11R6/bin:/root/
bin
[root@LINUX root]# java -version
java version "1.4.2_05"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)

看到类似信息就表示jdk环境已经好了。其实在上面的/etc/profile中,我们不仅仅设置了jdk的环境变量,还一并设置了resin和jdbc的环境变量,这些都是后面安装resin所必需的设定
三、安装mysql的jdbc
# tar xfz mysql-connector-java-3.1.6.tar.gz
# mv mysql-standard-4.0.23-pc-linux-i686/ /usr/java/ 将解压的文件剪切到/usr/java/目录下。
# cd /usr/java/
# ln -s mysql-standard-4.0.23-pc-linux-i686/ jdbc 创建JDBC的软连接与/usr/java/目录下
四、安装apache
# chmod 755 httpd-2.0.52.tar.gz
# tar xfz httpd-2.0.52.tar.gz
# cd httpd-2.0.52
开始配置APACHE

# ./configure --prefix=/usr/java/httpd2 --enable-module=most --enable-shared=max
察看编译进apache的模块:
#/usr/java/httpd2/bin/httpd -l
[root@LINUX root]# /usr/java/httpd2/bin/httpd -l
compiled-in modules:
  http_core.c
  mod_so.c
看到以上的信息表明apache支持dso方式了。这样就可以用dso的方式把php和resin的模块加进来。

五、安装php
我们使用的PHP版本是4.3.10,先去下载: http://www.php.net/downloads.php, 下回来的包叫做 php-4.3.10.tar.gz, 放到/usr/local/src目录下.  
首先进入该目录后解压缩:  
# cd /usr/local/src  
# tar xfz php-4.3.10.tar.gz  
解压后进入目录:  
# cd php-4.3.10
进行配置,这一步比较关键,一定要设置好,特别是要考虑到你要支持什么,比如GD库,xml,mysql等等,如果想知道详细的配置,执行 ./configure --help来获得:

# ./configure --with-mysql=/usr/java/mysql --with-apxs=/usr/java/httpd2/bin/apxs

果上面的配置没有错误的话,那么应该最后会显示感谢使用PHP等字样,那么证明配置成功,如果上面的配置选项不支持的话,会提示错误.  
比如你没有安装mysql,那么--with-mysql就无法使用,所以一定要注意对应选项系统是否能够支持,如果出现错误,那么就先安装对应的程序,或者去掉相关选项,配置之后就进行编译:  

# make  

编译成功后出现"Build complete."字样,那么就可以进行安装了:  

# make install  

安装完成后把/usr/local/src/php-4.3.8/php.ini-dist复制到/usr/local/lib/,并重命名为php.ini  

# cp /usr/local/src/php-4.3.10/php.ini-dist /usr/local/lib/php.ini  

基本到这里PHP就安装成功了,如果中间出现错误,除了在配置的时候没有选对选项之后一般都不出现错误.
为了让Apache能够直接解析php,我们还要进行一些配置.
# vi /usr/java/httpd/conf/httpd.conf
在httpd.conf文件中,添加  

AddType application/x-httpd-php .php  
AddType application/x-httpd-php-source .phps  

应该将以上两句添加在其他AddType之后。  

确保文件中有以下一句话,没有就自己添加在所有LoadModule之后。  

LoadModule php4_module modules/libphp4.so  

好了,在vi中使用":wq"保存httpd.conf文件,退出vi。启动apache server:  

# /usr/java/httpd2/bin/apachectl restart  
现在apache就能够运行php了,写个文件测试一下,在/usr/java/httpd2/htdocs目录下,新建一个phpinfo.php文件,  
文件中只有一行代码:  

<? phpinfo(); ?>  

保存此文件, 在你的浏览器中输入http://localhost/phpinfo.php,你应该看到PHP的系统信息。  
如果出现错误,比如提示你下灾phpinfo.php,那么apache就是还无法解析php文件,那么请仔细检查以上的操作是否正确.  


六.安装resin
下载的resin的安装包解开后应该可以直接单独运行的。笔者将其解开后放到/usr/java/目录下
# tar xfz resin-3.0.10.tar.gz
# mv resin-3.0.10 /usr/java/
# cd /usr/java/
# ln -s resin-3.0.10/ resin
启动resin
# /usr/java/resin/bin/httpd.sh start
现在就能够从http://localhost:8080/上能看到resin的页面,这也就表示单独的resin运行成功了。然后,为了整合resin和apache,我们需要重新编译一下,以生成mod_caucho给apache调用。
# cd /usr/java/resin
  # ./configure --with-apache=/usr/java/httpd2  
  # make
  # make install
修改/usr/java/resin/conf/resin.conf,大约在最后(安装的resin版本不同,配置文件的内容可能有所不同),将<document-directory>修改成自己的apache的documentroot的值。

      
  <document-directory>/usr/java/httpd2/htdocs</document-directory> ##这里修改成/usr/java/httpd2/htdocs

最后vi /usr/java/httpd2/conf/httpd.conf
复制以下内容
<location /caucho-status>
   sethandler caucho-status
  </location>

保存后。从启APACHE和RESIN
# /usr/java/resin/bin/httpd.sh restart
# /usr/java/httpd2/bin/apachectl restart

通过浏览器去访问http://localhost/caucho-status/,如果出现以下页面刚表示resin和apache已经成功整合了。
http://www.dfmqp.cn/caucho-status/
七.建立resin和apache的虚拟主机 我们建立的是tes1.jsp.com test2.jsp.com 两个虚拟主机

vi /usr/java/httpd2/conf/httpd.conf
复制如下内容到httpd.conf里
NameVirtualHost 192.168.0.1  虚拟主机建立所在的IP
<VirtualHost 199.199.0.1>
    DocumentRoot /home/jsp1/  文件所在目录
    ServerName tes1.jsp.com  访问的域名
</VirtualHost>
VirtualHost 192.168.0.1>
    DocumentRoot /home/jsp2/
    ServerName test2.jsp.com
</VirtualHost>
vi /usr/java/resin/conf/resin.conf
查找如下代码并修改:

    <host id="" root-directory=".">
      <!--
         - configures an explicit root web-app matching the
         - webapp's ROOT
        -->
      <web-app id='/' document-directory="/usr/java/httpd2/htdocs"/>
    </host>
<host id='tes1.jsp.com'>
<web-app id='/' document-directory="/home/jsp1"/>
</host>
<host id='tes2.jsp.com'>
<web-app id='/' document-directory="/home/jsp2"/>
</host>
保存从启apache和resin
tes1.jsp.com  和tes2.jsp.com 虚拟主机可以运行了


可以做如下测试http://localhost/caucho-status/
可以看到测试面上有
Virtual Host: tes1.jsp.com:80
Virtual Host: tes2.jsp.com:80
证明JSP虚拟主机工作很正常
Tags: , , , , ,
Mar 5
说明:本文中所需环境为2003Server+iis6.0+ms sql2000
  曾经很早就在网上看到一篇关于<asp.net虚拟主机的重大隐患>的文章,当时并不在意,做过asp虚拟主机的朋友可能都知道,即对每一个用户都设置一个独立的服务器用户和单个目录的操作权限,能够基本上解决asp的fso问题。
  在网上无意中发现了一个叫做webadmin的asp.net-webshell,对自己的服务器进行测试的时候,让我大吃一惊,居然对我服务器的c盘有读取的权限。以及对整个硬盘的修改删除权限。这样的话,那么我的服务器的安全……
  为了进一步证实,本人曾在国内一些著名的虚拟主机提供商上作过测试,均有和我一样的问题。
  有必要先介绍一下漏洞的原因。
  ASP中常用的标准组件:FileSystemObject,这个组件为 ASP 提供了强大的文件系统访问能力,可以对服务器硬盘上的任何有权限的目录和文件进行读写、删除、改名等操作。FSO对象来自微软提供的脚本运行库scrrun.dll中。
  在ASP.NET中我们发现这一问题仍然存在,并且变得更加难以解决。这是因为.NET中关于系统IO操作的功能变得更加强大,而使这一问题更严重的是ASP.NET所具有的一项新功能,这就组件不需要象ASP那样必须要使用regsvr32来注册了,只需将Dll类库文件上传到bin目录下就可以直接使用了。这一功能确实给开发ASP.NET带来了很大的方便,但是却使我们在ASP中将此dll删除或者改名的解决方法失去效用了,防范此问题就变得更加复杂。需要进一步了解的朋友可以看<asp.net虚拟主机的重大隐患>一文,本文就不再重复。只针对此问题引出虚拟主机的安全设置。
  网上提出针对此问题用Microsoft .NET Framework Configration设置System.io的对目录读取的权限,经过我们长时间的测试没有成功,可能是.net framework1.1机制改革了?
  废话不说。先说说解决的思路:在 IIS 6 中,Web 应用程序的工作进程设置为以进程标识“Network Service”运行。在 IIS 5 中,进程外 Web 应用程序则设置为以 IWAM_<服务器名> 帐户运行,这个帐户是普通的本地用户帐户。
  Network Service 是 Windows Server 2003 中的内置帐户。了解 IIS 5 上的本地用户帐户(IUSR 和 IWAM)与这个内置帐户之间的区别是非常重要的。Windows 操作系统中的所有帐户都分配了一个 SID(安全标识,Security ID)。服务器是根据 SID,而不是与 SID 相关的名称来识别服务器上所有帐户的,而我们在与用户界面进行交互时,则是使用名称进行交互的。服务器上创建的绝大部分帐户都是本地帐户,都具有一个唯一的 SID,用于标识此帐户隶属于该服务器用户数据库的成员。由于 SID 只是相对于服务器是唯一的,因此它在任何其他系统上无效。所以,如果您为本地帐户分配了针对某文件或文件夹的 NTFS 权限,然后将该文件及其权限复制到另一台计算机上时,目标计算机上并没有针对这个迁移 SID 的用户帐户,即使其上有一个同名帐户也是如此。这使得包含 NTFS 权限的内容复制可能出现问题。
  内置帐户是由操作系统创建的、一类较为特别的帐户或组,例如 System 帐户、Network Service 和 Everyone 组。这些对象的重要特征之一就是,它们在所有系统上都拥有一个相同的、众所周知的 SID。当将分配了 NTFS 权限的文件复制到内置帐户时,权限在服务器之间是有效的,因为内置帐户的 SID 在所有服务器上都是相同的。Windows Server 2003 服务中的 Network Service 帐户是特别设计的,专用于为应用程序提供访问网络的足够权限,而且在 IIS 6 中,无需提升权限即可运行 Web 应用程序。这对于 IIS 安全性来说,是一个特大的消息,因为不存在缓冲溢出,怀有恶意的应用程序无法破译进程标识,或是对应用程序的攻击不能进入 System 用户环境。更为重要的一点是,再也不能形成针对 System 帐户的“后门”,例如,再也无法通过 InProcessIsapiApps 元数据库项利用加载到 Inetinfo 的应用程序。
  Network Service 帐户在创建时不仅仅考虑了在 IIS 6 中的应用。它还具有进程标识 W3WP.exe 的绝大部分(并不是全部)权限。如同 ASPNET 用户为了运行 ASP.net 应用程序,需要具有 IIS 5 服务器上某些位置的访问权限,进程标识 W3WP.exe 也需要具有类似位置的访问权限,而且还需要一些默认情况下没有指派给内置组的权限。
  为了管理的方便,在安装 IIS 6 时创建了 IIS_WPG 组(也称为 IIS 工作进程组,IIS Worker Process Group),而且它的成员包括 Local System(本地系统)、Local Service(本地服务)、Network Service(网络服务)和 IWAM 帐户。IIS_WPG 的成员具有适当的 NTFS 权限和必要的用户权限,可以充当 IIS 6 中工作进程的进程标识。
  因此,Network Service 帐户提供了访问上述位置的权限,具有充当 IIS 6 工作进程的进程标识的充足权限,以及具有访问网络的权限。
  Msdn上说:在 Windows Server 2003 中,用户上下文称为 NETWORK SERVICE。这些用户帐户是在 .NET Framework 安装过程中创建的,它具有唯一的不易破解的密码,并仅被授予有限的权限。ASPNET 或 NETWORK SERVICE 用户只能访问运行 Web 应用程序所需的特定文件夹,如 Web 应用程序存储已编译文件的 \bin 目录。
  要将进程标识设置为特定用户名,以取代 ASPNET 或 NETWORK SERVICE 用户标识,您提供的用户名和密码都必须存储在 machine.config 文件中。
  但是根据实际情况,asp.net的system.io可以无限制访问不设防的服务器路径。不知道这算不算一个ms的重大漏洞。而且根本不能使iis以machine.config的用户执行asp.net程序。J
  如何解决呢?答案就是—应用程序池。
  IIS 6.0 在被称为应用程序隔离模式(隔离模式)的两种不同操作模式下运行,它们是:工作进程隔离模式和 IIS 5.0 隔离模式。这两种模式都要依赖于 HTTP.sys 作为超文本传输协议 (HTTP) 侦听程序;然而,它们内部的工作原理是截然不同的。
  工作进程隔离模式利用 IIS 6.0 的重新设计的体系结构并且使用工作进程的核心组件。IIS 5.0 隔离模式用于依赖 IIS 5.0 的特定功能和行为的应用程序。该隔离模式由 IIs5IsolationModeEnabled 配置数据库属性指定。
  您所选择的 IIS 应用程序隔离模式对性能、可靠性、安全性和功能可用性都会产生影响。工作进程隔离模式是 IIS 6.0 操作的推荐模式,因为它为应用程序提供了更可靠的平台。工作进程隔离模式也提供了更高级别的安全性,因为运行在工作进程中的应用程序的默认标识为 NetworkService。
  以 IIS 5.0 隔离模式运行的应用程序的默认标识为 LocalSystem,该标识允许访问并具有更改计算机上几乎所有资源的能力

















































IIS 功能IIS 5.0隔离模式宿主/组件工作进程隔离模式宿主/组件
工作进程管理N/ASvchost.exe/WWW 服务
工作进程 N/A W3wp.exe/工作进程
运行进程内ISAPI 扩展Inetinfo.exeW3wp.exe
运行进程外ISAPI 扩展DLLHost.exeN/A(所有的 ISAPI 扩展都在进程内)
运行ISAPI筛选器Inetinfo.exeW3wp.exe
HTTP.sys 配置 Svchost.exe/WWW 服务Svchost.exe/WWW服务
HTTP 协议支持 Windows内核/HTTP.sysWindows 内核/HTTP.sys
IIS配置数据库Inetinfo.exeInetinfo.exe
FTPInetinfo.exe Inetinfo.exe
NNTP Inetinfo.exeInetinfo.exe
SMTPInetinfo.exeInetinfo.exe

  由此可见,我们只能使用工作进程隔离模式解决.net的安全问题。
默认情况下,IIS 6.0在工作进程隔离模式下运行,如图五所示。在这种模式中,对于每一个Web应用,IIS 6.0都用一个独立的w3wp.exe的实例来运行它。w3wp.exe也称为工作进程(Worker Process),或W3Core。

  可靠性和安全性。可靠性的提高是因为一个Web应用的故障不会影响到其他Web应用,也不会影响http.sys,每一个Web应用由W3SVC单独地监视其健康状况。安全性的提高是由于应用程序不再象IIS 5.0和IIS 4.0的进程内应用那样用System帐户运行,默认情况下,w3wp.exe的所有实例都在一个权限有限的“网络服务”帐户下运行,如图六所示,必要时,还可以将工作进程配置成用其他用户帐户运行。

  对,这里,这里就是我们解决的核心。
  我们把每一个网站都分配一个独立的应用程序池,并赋予不同的权限。不就能解决这个问题了吗?
  具体如何做呢,下面我就针对建立一个网站来做一个示范:
  首先,我们为网站创建两个用户(一个是app_test_user、密码为appuser,一个是iis_test_user、密码为iisuser)
  1. 打开 计算机管理器
  2. 单击控制台树中的用户→计算机管理→系统工具→本地用户和组→用户
  3. 单击“操作”菜单上的“新用户”输入用户名为。app_test_user、密码为appuser
  4. 在对话框中键入适当的信息。
  5. 选中复选框:
   用户不能更改密码
   密码永不过期
  6. 单击“创建”,然后单击“关闭”。

  按照此方法在创建iis_test_user账户
  然后分别把app_test_user添加到iis_wpg组,把iis_test_user添加到Guests组。删除其他组。

  然后,建立相应的应用程序池。
  依次打开Internet 信息服务→本地计算机→应用程序池→新建→应用程序池
  新建一个名字为test的应用程序池

  编辑test应用程序池的属性→标示→配置→用户名→浏览→把用户名改为我们刚才建立的app_test_user并输入相应的密码


  其次建立相应的网站。
  依次打开Internet 信息服务→本地计算机→网站→新建→test的网站,目录为d:\test →编辑test网站的属性→主目录→应用程序池→app_test_user →目录安全性→身份验证和访问控制→编辑,选择我们刚才建立的iis_test_user,并输入相应的密码iisuser→保存并退出。

  最后设定服务器的安全。
  C:只给administrators和system完全控制的权利,删除掉其他所有的权限,不替换子目录

    C:\Documents and Settings继承父项,并替换子目录。
  C:\Program Files继承父项,并替换子目录,并把C:\Program Files\Common Files\Microsoft Shared继承属性删除并复制现有属性,增加users的读取权限并替换子目录(这样做是为了能够让asp,asp.net使用access等数据库)。
  C:\windows删除继承,并复制现有属性,只给予administrators,system完全控制和users读取的权限并替换子目录。



  其余所有的盘都只给于administrators和system用户的完全控制权限,删除其他所有用户并替换子目录。

  D:\test(用户网站目录)继承现有属性并增加app_test_user和iis_test_user完全控制的权限并替换子目录。

  以后每增加一个网站都以此类推。

  但是,至此,system.io还是对c:\windows又读取权限的,(怀疑network servers用户属于users组,但是好多服务都要使用users组来执行的,所以不能把c:\windwos去掉users组的读取权限)但必须知道系统路径,有两种方案解决。

  1、 再安装系统的时候使用无人值守安装,更换c:\windows默认安装路径,如更改为c:\testtest(要符合dos的命名规则,不能超过8个字符)。这个是必需的

  2、 以下位置具有指派给 IIS_WPG 的权限:

  %windir%\help\iishelp\common – 读取
  %windir%\IIS Temporary Compressed Files – 列出、读取、写入
  %windir%\system32\inetsrv\ASP Compiled Template – 读取
  Inetpub\wwwroot(或内容目录)- 读取、执行

  此外,IIS_WPG 还具有以下用户权限:

  忽略遍历检查(SeChangeNotifyPrivilege)

  作为批处理作业登录(SeBatchLogonRight)

  从网络访问此计算机(SeNetworkLogonRight)

  当然两种方法结合起来算是最安全的方案,一般使用第一种方案已经算是很安全的,毕竟是用一个webshell来猜测8位字符的目录还是需要花费时间的。使用防火墙很容易就能察觉出来,并加以控制。

  第二种可能根据所安装软件不同还要相应增加目录的读取权限,详细情况要根据软件来确定。

  如果主机用户比较多,这将是一个相当大的劳动量,推荐使用程序来解决问题,下面给出网上不常见的针对iis应用程序池操作的代码和针对iis虚拟目录的操作代码。


操作iis应用程序池



using System;
using System.DirectoryServices;
using System.Reflection;

namespace ADSI1
{
 ///
 /// Small class containing methods to configure IIS.
 ///
 class ConfigIIS
 {
  ///
  /// The main entry point for the application.
  ///
  [STAThread]
  //主程序入口,可以选择用哪些,我为了方便,全部功能都写上去了。
  static void Main(string[] args)
  {
   string AppPoolName = "MyAppPool";
   string newvdir1 = "MyVDir";
   DirectoryEntry newvdir = CreateVDir(newvdir1);

   CreateAppPool(AppPoolName);
   AssignAppPool(newvdir, AppPoolName);

   ConfigAppPool("Stop",AppPoolName);
  }

  //创建虚拟目录
  static DirectoryEntry CreateVDir (string vdirname)
  {
   DirectoryEntry newvdir;
   DirectoryEntry root=new DirectoryEntry("IIS://localhost/W3SVC/1/Root");
   newvdir=root.Children.Add(vdirname, "IIsWebVirtualDir");
   newvdir.Properties["Path"][0]= "c:\\inetpub\\wwwroot";
   newvdir.Properties["AccessScript"][0] = true;
   newvdir.CommitChanges();
   return newvdir;
  }

  //创建新的应用程序池。
  static void CreateAppPool(string AppPoolName)
  {
   DirectoryEntry newpool;
   DirectoryEntry apppools=new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   newpool=apppools.Children.Add(AppPoolName, "IIsApplicationPool");
   newpool.CommitChanges();
  }

  static void AssignAppPool(DirectoryEntry newvdir, string AppPoolName)
  {
   object[] param={0, AppPoolName, true};
   newvdir.Invoke("AppCreate3", param);
  }

  //method是管理应用程序池的方法,有三种Start、Stop、Recycle,而AppPoolName是应用程序池名称
  static void ConfigAppPool(string method,string AppPoolName)
  {
   DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   DirectoryEntry findPool = appPool.Children.Find(AppPoolName,IIsApplicationPool");
   findPool.Invoke(method,null);
   appPool.CommitChanges();
   appPool.Close();
  }

  //应用程序池的列表
  static void AppPoolList()
  {
   DirectoryEntry appPool = new DirectoryEntry("IIS://localhost/W3SVC/AppPools");
   foreach(DirectoryEntry a in appPool.Children)
   {
    Console.WriteLine(a.Name);
   }
  }

  private void VDirToAppPool()
  {
   DirectroryEntry VD = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT/ccc");
   Console.WriteLine(VD.Properties["AppPoolId"].Value.ToString());
  }
 }
}



iis6操作的例子






using System;
using System.DirectoryServices;
using System.Collections;
using System.Text.RegularExpressions;
using System.Text;

namespace Wuhy.ToolBox
{
 /// </summary>

 public class IISAdminLib
 {
  #region UserName,Password,HostName的定义
  public static string HostName
  {
   get
   {
    return hostName;
   }
   set
   {
    hostName = value;
   }
  }

 public static string UserName
 {
  get
  {
   return userName;
  }
  set
  {
   userName = value;
  }
 }

 public static string Password
 {
  get
  {
   return password;
  }
  set
  {
   if(UserName.Length <= 1)
   {
    throw new ArgumentException("还没有指定好用户名。请先指定用户名");
   }
  password = value;
 }
}

public static void RemoteConfig(string hostName, string userName, string password)
{
 HostName = hostName;
 UserName = userName;
 Password = password;
}

private static string hostName = "localhost";
private static string userName;
private static string password;
#endregion

#region 根据路径构造Entry的方法

/// <summary>
/// 根据是否有用户名来判断是否是远程服务器。
/// 然后再构造出不同的DirectoryEntry出来
/// </summary>
/// <param name="entPath">DirectoryEntry的路径</param>
/// <returns>返回的是DirectoryEntry实例</returns>

public static DirectoryEntry GetDirectoryEntry(string entPath)
{
 DirectoryEntry ent;
 if(UserName == null)
 {
  ent = new DirectoryEntry(entPath);
 }
 else
 {
  // ent = new DirectoryEntry(entPath, HostName+"\\"+UserName, Password, AuthenticationTypes.Secure);
  ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);
 }
 return ent;
}

#endregion
#region 添加,删除网站的方法

/// <summary>
/// 创建一个新的网站。根据传过来的信息进行配置
/// </summary>
/// <param name="siteInfo">存储的是新网站的信息</param>

public static void CreateNewWebSite(NewWebSiteInfo siteInfo)
{
 if(! EnsureNewSiteEnavaible(siteInfo.BindString))
 {
  throw new DuplicatedWebSiteException("已经有了这样的网站了。" + Environment.NewLine + siteInfo.BindString);
 }
 string entPath = String.Format("IIS://{0}/w3svc", HostName);
 DirectoryEntry rootEntry = GetDirectoryEntry(entPath);
 string newSiteNum = GetNewWebSiteID();
 DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, "IIsWebServer");
 newSiteEntry.CommitChanges();
 newSiteEntry.Properties["ServerBindings"].Value = siteInfo.BindString;
 newSiteEntry.Properties["ServerComment"].Value = siteInfo.CommentOfWebSite;
 newSiteEntry.CommitChanges();
 DirectoryEntry vdEntry = newSiteEntry.Children.Add("root", "IIsWebVirtualDir");
 vdEntry.CommitChanges();
 vdEntry.Properties["Path"].Value = siteInfo.WebPath;
 vdEntry.CommitChanges();
}

/// <summary>
/// 删除一个网站。根据网站名称删除。
/// </summary>
/// <param name="siteName">网站名称</param>

public static void DeleteWebSiteByName(string siteName)
{
 string siteNum = GetWebSiteNum(siteName);
 string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
 string rootPath = String.Format("IIS://{0}/w3svc", HostName);
 DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);
 rootEntry.Children.Remove(siteEntry);
 rootEntry.CommitChanges();
}

#endregion
#region Start和Stop网站的方法

public static void StartWebSite(string siteName)
{
 string siteNum = GetWebSiteNum(siteName);
 string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
 siteEntry.Invoke("Start", new object[] {});
}

public static void StopWebSite(string siteName)
{
 string siteNum = GetWebSiteNum(siteName);
 string siteEntPath = String.Format("IIS://{0}/w3svc/{1}", HostName, siteNum);
 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);
 siteEntry.Invoke("Stop", new object[] {});
}

#endregion
#region 确认网站是否相同

/// <summary>
/// 确定一个新的网站与现有的网站没有相同的。
/// 这样防止将非法的数据存放到IIS里面去
/// </summary>
/// <param name="bindStr">网站邦定信息</param>
/// <returns>真为可以创建,假为不可以创建</returns>

public static bool EnsureNewSiteEnavaible(string bindStr)
{
 string entPath = String.Format("IIS://{0}/w3svc", HostName);
 DirectoryEntry ent = GetDirectoryEntry(entPath);
 foreach(DirectoryEntry child in ent.Children)
 {
  if(child.SchemaClassName == "IIsWebServer")
  {
   if(child.Properties["ServerBindings"].Value != null)
   {
    if(child.Properties["ServerBindings"].Value.ToString() == bindStr)
    {
     return false;
    }
   }
  }
 }
 return true;
}

#endregion
#region 获取一个网站编号的方法
/// <summary>
/// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号
/// </summary>
/// <param name="siteName"></param>
/// <returns>返回网站的编号</returns>
/// <exception cref="NotFoundWebSiteException">表示没有找到网站</exception>

public static string GetWebSiteNum(string siteName)
{
 Regex regex = new Regex(siteName);
 string tmpStr;
 string entPath = String.Format("IIS://{0}/w3svc", HostName);
 DirectoryEntry ent = GetDirectoryEntry(entPath);
 foreach(DirectoryEntry child in ent.Children)
 {
  if(child.SchemaClassName == "IIsWebServer")
  {
   if(child.Properties["ServerBindings"].Value != null)
   {
    tmpStr = child.Properties["ServerBindings"].Value.ToString();
    if(regex.Match(tmpStr).Success)
    {
     return child.Name;
    }
   }
   if(child.Properties["ServerComment"].Value != null)
   {
    tmpStr = child.Properties["ServerComment"].Value.ToString();
    if(regex.Match(tmpStr).Success)
    {
     return child.Name;
    }
   }
  }
 }

 throw new NotFoundWebSiteException("没有找到我们想要的站点" + siteName);
}

#endregion
#region 获取新网站id的方法
/// <summary>
/// 获取网站系统里面可以使用的最小的ID。
/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。
/// 这里面的算法经过了测试是没有问题的。
/// </summary>
/// <returns>最小的id</returns>

public static string GetNewWebSiteID()
{
 ArrayList list = new ArrayList();
 string tmpStr;
 string entPath = String.Format("IIS://{0}/w3svc", HostName);
 DirectoryEntry ent = GetDirectoryEntry(entPath);
 foreach(DirectoryEntry child in ent.Children)
 {
  if(child.SchemaClassName == "IIsWebServer")
  {
   tmpStr = child.Name.ToString();
   list.Add(Convert.ToInt32(tmpStr));
  }
 }
 list.Sort();
 int i = 1;
 foreach(int j in list)
 {
  if(i == j)
  {
   i++;
  }
 }
 return i.ToString();
}
#endregion
}

#region 新网站信息结构体

public struct NewWebSiteInfo
{
 private string hostIP; // The Hosts IP Address
 private string portNum; // The New Web Sites Port.generally is "80"
 private string descOfWebSite; // 网站表示。一般为网站的网站名。例如"www.dns.com.cn"
 private string commentOfWebSite;// 网站注释。一般也为网站的网站名。
 private string webPath; // 网站的主目录。例如"e:\tmp"
 public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)
 {
  this.hostIP = hostIP;
  this.portNum = portNum;
  this.descOfWebSite = descOfWebSite;
  this.commentOfWebSite = commentOfWebSite;
  this.webPath = webPath;
 }
 public string BindString
 {
  get
  {
   return String.Format("{0}:{1}:{2}", hostIP, portNum, descOfWebSite);
  }
 }
 public string CommentOfWebSite
 {
  get
  {
   return commentOfWebSite;
  }
 }
 public string WebPath
 {
  get
  {
   return webPath;
  }
 }
}
#endregion
}


  至此,一个相对安全的.net主机就建立起来了,随着.net2.0的发布越来越逼近,希望ms能针对此问题作一个妥善的防范。

  我们已经简单的介绍了一下ASP.NET中关于文件IO系统的漏洞的防治方法,这一方法有些繁琐,但是却可以从根本上杜绝一些漏洞,我们讨论的只是很少的一部分,更多的解决放法需要大家共同来探索、学习。
Mar 5
  FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操作系统下使用FTP,都会遇到大量的FTP内部命令。熟悉并灵活应用FTP的内部命令,可以大大方便使用者,并收到事半功倍之效。

  FTP的命令行格式为:ftp -v -d -i -n -g [主机名],其中

  -v显示远程服务器的所有响应信息;

  -n限制ftp的自动登录,即不使用;

  .n etrc文件;

  -d使用调试方式;

  -g取消全局文件名。

  ftp使用的内部命令如下(中括号表示可选项):

  1.![cmd[args]]:在本地机中执行交互shell,exit回到ftp环境,如:!ls*.zip.

  2.$ macro-ame[args]:执行宏定义macro-name.

  3.account[password]:提供登录远程系统成功后访问系统资源所需的补充口令。

  4.append local-file[remote-file]:将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名。

  5.ascii:使用ascii类型传输方式。

  6.bell:每个命令执行完毕后计算机响铃一次。

  7.bin:使用二进制文件传输方式。

  8.bye:退出ftp会话过程。

  9.case:在使用mget时,将远程主机文件名中的大写转为小写字母。

  10.cd remote-dir:进入远程主机目录。

  11.cdup:进入远程主机目录的父目录。

  12.chmod mode file-name:将远程主机文件file-name的存取方式设置为mode,如:chmod 777 a.out。

  13.close:中断与远程服务器的ftp会话(与open对应)。

  14.cr:使用asscii方式传输文件时,将回车换行转换为回行。

  15.delete remote-file:删除远程主机文件。

  16.debug[debug-value]:设置调试方式,显示发送至远程主机的每条命令,如:deb up 3,若设为0,表示取消debug。

  17.dir[remote-dir][local-file]:显示远程主机目录,并将结果存入本地文件local-file。

  18.disconnection:同close。

  19.form format:将文件传输方式设置为format,缺省为file方式。

  20.get remote-file[local-file]:将远程主机的文件remote-file传至本地硬盘的local-file。

  21.glob:设置mdelete,mget,mput的文件名扩展,缺省时不扩展文件名,同命令行的-g参数。

  22.hash:每传输1024字节,显示一个hash符号(#)。

  23.help[cmd]:显示ftp内部命令cmd的帮助信息,如:help get。

  24.idle[seconds]:将远程服务器的休眠计时器设为[seconds]秒。

  25.image:设置二进制传输方式(同binary)。

  26.lcd[dir]:将本地工作目录切换至dir。

  27.ls[remote-dir][local-file]:显示远程目录remote-dir,并存入本地文件local-file。

  28.macdef macro-name:定义一个宏,遇到macdef下的空行时,宏定义结束。

  29.mdelete[remote-file]:删除远程主机文件。

  30.mdir remote-files local-file:与dir类似,但可指定多个远程文件,如:mdir *.o.*.zipoutfile

  31.mget remote-files:传输多个远程文件。

  32.mkdir dir-name:在远程主机中建一目录。

  33.mls remote-file local-file:同nlist,但可指定多个文件名。

  34.mode[modename]:将文件传输方式设置为modename,缺省为stream方式。

  35.modtime file-name:显示远程主机文件的最后修改时间。

  36.mput local-file:将多个文件传输至远程主机。

  37.newer file-name:如果远程机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件。

  38.nlist[remote-dir][local-file]:显示远程主机目录的文件清单,并存入本地硬盘的local-file。

  39.nmap[inpattern outpattern]:设置文件名映射机制,使得文件传输时,文件中的某些字符相互转换,如:nmap $1.$2.$3[$1,$2].[$2,$3],则传输文件a1.a2.a3时,文件名变为a1,a2。该命令特别适用于远程主机为非UNIX机的情况。

  40.ntrans[inchars[outchars]]:设置文件名字符的翻译机制,如ntrans 1R,则文件名LLL将变为RRR。

  41.open host[port]:建立指定ftp服务器连接,可指定连接端口。

  42.passive:进入被动传输方式。

  43.prompt:设置多个文件传输时的交互提示。

  44.proxy ftp-cmd:在次要控制连接中,执行一条ftp命令,该命令允许连接两个ftp服务器,以在两个服务器间传输文件。第一条ftp命令必须为open,以首先建立两个服务器间的连接。

  45.put local-file[remote-file]:将本地文件local-file传送至远程主机。

  46.pwd:显示远程主机的当前工作目录。

  47.quit:同bye,退出ftp会话。

  48.quote arg1,arg2...:将参数逐字发至远程ftp服务器,如:quote syst.

  49.recv remote-file[local-file]:同get。

  50.reget remote-file[local-file]:类似于get,但若local-file存在,则从上次传输中断处续传。

  51.rhelp[cmd-name]:请求获得远程主机的帮助。

  52.rstatus[file-name]:若未指定文件名,则显示远程主机的状态,否则显示文件状态。

  53.rename[from][to]:更改远程主机文件名。

  54.reset:清除回答队列。

  55.restart marker:从指定的标志marker处,重新开始get或put,如:restart 130。

  56.rmdir dir-name:删除远程主机目录。

  57.runique:设置文件名唯一性存储,若文件存在,则在原文件后加后缀..1,.2等。

  58.send local-file[remote-file]:同put。

  59.sendport:设置PORT命令的使用。

  60.site arg1,arg2...:将参数作为SITE命令逐字发送至远程ftp主机。

  61.size file-name:显示远程主机文件大小,如:site idle 7200。

  62.status:显示当前ftp状态。

  63.struct[struct-name]:将文件传输结构设置为struct-name,缺省时使用stream结构。

  64.sunique:将远程主机文件名存储设置为唯一(与runique对应)。

  65.system:显示远程主机的操作系统类型。

  66.tenex:将文件传输类型设置为TENEX机的所需的类型。

  67.tick:设置传输时的字节计数器。

  68.trace:设置包跟踪。

  69.type[type-name]:设置文件传输类型为type-name,缺省为ascii,如:type binary,设置二进制传输方式。

  70.umask[newmask]:将远程服务器的缺省umask设置为newmask,如:umask 3。

  71.user user-name[password][account]:向远程主机表明自己的身份,需要口令时,必须输入口令,如:user anonymous my@email。

  72.verbose:同命令行的-v参数,即设置详尽报告方式,ftp服务器的所有响应都将显示给用户,缺省为on.

  73.?[cmd]:同help。
Tags:
分页: 77/196 第一页 上页 72 73 74 75 76 77 78 79 80 81 下页 最后页 [ 显示模式: 摘要 | 列表 ]