千万个美丽的未来,抵不上一个温暖的现在,每一个真实的现在,都是我们曾经幻想的未来!
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]
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 3
一、什么叫虚拟主机

虚拟主机,是在网络服务器上划分出一定的磁盘空间供用户放置站点、应用组件等,提供必要的站点功能与数据存放、传输功能。

虚拟主机技术的出现,是对Internet技术的重大贡献,是广大Internet用户的福音。由于多台虚拟主机共享一台真实主机的资源,每个用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低,Internet真正成为人人用得起的网络!现在,几乎所有的美国公司(包括一些家庭)均在网络上设立了自己的WEB服务器,其中有相当的部分采用的是虚拟主机!

  所谓虚拟主机,也叫“网站空间”就是把一台运行在互联网上的服务器划分成多个“虚拟”的服务器,每一个虚拟主机都具有独立的域名和完整的Internet服务器(支持WWW、FTP、E-mail等)功能。一台服务器上的不同虚拟主机是各自独立的,并由用户自行管理。但一台服务器主机只能够支持一定数量的虚拟主机,当超过这个数量时,用户将会感到性能急剧下降。

  虚拟主机技术是互联网服务器采用的节省服务器硬体成本的技术,虚拟主机技术主要应用于HTTP服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬体资源。如果划分是系统级别的,则称为虚拟服务器。

二、为什么建立虚拟主机

Internet日益成为商家注目的焦点,在技术迅猛发展的今天,企业的信息化已成为市场竞争的重要段。走向市场、走向国际化或者保持国内市场不致萎缩的必要的条件之一就是必须拥有畅通的现代国际联系手段:自己的域名、自己的主页、自己的电子信箱、自己的宣传阵地。无论您的企业在哪里,现在条件如何,服务器硬盘空间出租、网络虚拟主机服务使这一切变成现实!

网络已经日益成为市场营销的一个重要方式,但任何企业开展网上电子商务都是一件十分慎重的事情,因为它在人力物力上的投入很大。企业在不具备充足的条件时,首先在网络上建立一个虚拟主机进行电子商务的尝试是十分必要的。让专业的公司来承担系统的维护和管理,使得企业能节约更多的人力和费用做其他的业务。建立了自己的虚拟主机(网站服务器)您就拥有了长期的网上电子广告。

三、虚拟主机的优势

费用低廉,尽管网上信息发布具备明显的宣传功能优势,但其费用的低廉仍是不可想象的。电台电视台的广告虽然以秒计算,但费用也动辄成千上万;报刊广告也价格不菲,超出多数单位个人的承受力。网上信息发布由于节省报刊的印刷和电台电视台昂贵的制作费用,成本大大降低,使绝大多数单位个人都可以承受。覆盖范围广,传统媒体无论电视、报刊、广播还是灯箱海报都不能跨越地域限制,只能对特定地区产生影响。成交概率高,对于传统媒介的广告,观众大多是被动接受,不易产生效果。形式生动活泼,运用计算机多媒体技术,网上信息以图、文、声、像等多种形式,将产品的形状、用途、使用方法、价格、购买方法等信息直接展示在用户面前。具有实时性,商家可以根据市场需要随时更改广告内容,灵活方便。更重要的是,对企业和机构用户而言,这是当前最为省钱、便利和实用的方式。

Internet上现在联有近亿台的计算机,这些计算机不管它们是什么机型、运行什么操作系统、使用什么软件,都可以归结为两大类:客户机和服务器。

客户机是访问别人信息的机器。当您通过邮电局或别的ISP拨号上网时,您的电脑就被临时分配了一个IP地址,利用这个临时身份证,您就可以在Internet的海洋里获取信息,当您断线后,您的电脑就脱离了Internet,IP地址也被收回。

服务器则是提供信息让别人访问的机器,通常又称为主机。由于人们任何时候都可能访问到它,因此作为主机必须每时每刻都连接在Internet上,拥有自己永久的IP地址。为此不仅得设置专用的电脑硬件,还得租用昂贵的数据专线,再加上各种维护费用如房租、人工、电费等等,决不是好承受的。   为此,人们开发了虚拟主机技术。

利用虚拟主机技术,可以把一台真正的主机分成许多的"虚拟"的主机,每一台虚拟主机都具有独立的域名和IP地址,具有完整的Internet服务器功能。虚拟主机之间完全独立,在外界看来,每一台虚拟主机和一台独立的主机完全一样。效果一样,但费用却大不一样了。由于多台虚拟主机共享一台真实主机的资源,每个虚拟主机用户承受的硬件费用、网络维护费用、通信线路的费用均大幅度降低,Internet真正成为人人用得起的网络!

目前,许多企业建立网站都采用这种方法,这样不仅大大节省了购买机器和租用专线的费用,同时也不必为使用和维护服务器的技术问题担心,更不必聘用专门的管理人员。

四、怎么选择虚拟主机?

1. IP地址能否访问到?
首先,如果你的虚拟主机网站用户将来面向的是国内的话,必须要考虑的问题就是这家虚拟主机上的IP地址在国内是否可以顺利访问到,这一点是由于众所周知的原因。如果你买的访问不到,还要退款等比较麻烦,比如PowWeb这家在国外是很不错的主机商,但他IP在国内访问不完全,就不能买了。下面将要介绍的十家都是经过测试或使用过在国内可以顺利访问的主机。

2. 主机的硬件设施情况
虚拟主机提供商的所拥有的虚拟主机机房,是什么规模的数据中心。是否有足够机房线路的频宽,虚拟主机网站联线的速度是否同时满足他所有虚拟主机客户的流量带宽。

因为国外虚拟主机商的客户很多,因此他们的机房 (data center) 整体对外专线的线路频宽也相对的必须特大以应付需求。如我们的虚拟主机商IPowerWeb的机房线路频宽就使用了OC48和OC192的最高技术规模。

3. 虚拟主机上架设的网站有多少?
通常一个虚拟主机能够架设上百至千个网站。如果一个虚拟主机的网站数量很多,他就应该拥有更多的CPU和内存和使用服务器阵列,如果您是从虚拟主机主机分销商reseller处购买虚拟主机的话,他们为了达到最高的盈利,在一个主机上架设了尽可能多的网站,而虚拟主机服务器确没有提示,造成你的网站的在虚拟主机速度受阻。所以,最好的办法就是找寻一家有信誉的大虚拟主机提供商,他们的每个虚拟主机服务器是有网站承载个数限制的。但这个一般都是不公开的。当然如果您对网站有很高的速度和控制要求,最终的解决方案就是购买独立的自己的服务器。

4.使用vps架设网站
虚拟主机上网站之间会相互抢占资源,如果预算允许的话,可以购买vps主机,它是虚拟主机的升级版,但它又不是一台完整的服务器,是一个适中的考虑。  另外现在国内比较流行的服务器合租。

虚拟主机技术是互联网服务器采用的节省服务器硬件成本的技术。虚拟主机技术主要应用于HTTP服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件。

如何正确选择虚拟主机服务器租用托管服务商?
一.    经营时间长短      
经营时间的长短是评价一个虚拟主机提供商的重要标准。
二.    是否拥有机房
是否拥有一个可靠稳定,安全高速的机房是衡量一个成功的虚拟主机提供商的又一重要标准。在互联网行业,往往出现这样的情况:一些公司本身没有机房,甚至根本没有机房,但是他们却往往以低于市场价格很多的价格向用户承诺各种服务。可想而知,缺乏足够的硬件支持,技术实力,这些承诺往往最终只能成为不切实际的空中楼阁。所以可以肯定的是:那些连机房的地点都不愿告诉客户的公司一定都是含有欺诈成分的虚拟主机提供商,广大的用户应对这样的情况保持高度的警惕。
三.    极高的性价比
低价导致性能下降 低价要防止服务商消失 卓越的信誉,优异的品质,真诚的服务,合适的价格,对于一个成功的虚拟主机提供商,这些一个都不能少。
四.    要求给在线人数多的客户演示地址
五.    不要贪便宜
要租有一定客户基础的空间商的主机 一般来讲,规模较大的服务商由于其在硬件设备、网络资源、安全保障、人力资源、商业信誉、市场推广等方面的投入都远远超过了普通的服务商,因此价格往往比较高,但服务品质则更有保障。
六.    服务商最好能提供邮箱,FTP等的在线管理功能。
七.    特别需要注意一点的是目前有不少骗子用家用PC做服务器,用ADSL作接入.这种空间的稳定性和速度都是相当差的,切记不可贪这种小便宜。
八.    空间大小 虚拟主机的空间容量是考核虚拟主机性能的一个重要指标。通常情况下,我们必须要同时考核以下几种空间的容量大小——
      1、 Web空间——也叫网页空间,是存储网页、程序、图片等文件的主要空间;
      2、 数据库空间——支持数据库的虚拟主机所提供的数据库存储空间;
      3、 LOG空间——网站日志(LOG)文件的的存储空间。
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]