当前位置导航:炫浪网>>网络学院>>网页制作>>ASP教程

ASP漏洞及安全建议(4)

       六 ASP安全建议
   如何设置才能使ASP更加安全呢?以下我们重点来谈谈ASP安全方面要注意的问题。我们在第五部分“ASP漏洞和解决方法”中针对某些漏洞,也提出了相应的安全建议,这部分就不再重复。
    在这部分的后面还要介绍些可扫描ASP漏洞的工具。
  
  1 安装NT最新的补丁
   目前最新的补丁是NT Option Pack 6.0.,微软的主页有最新的补丁。一般来说微软都会及时的公布最新的漏洞和补丁。目前IIS最新是5.0。windows2000自带IIS5.0.
   IIS 5.0新功能如下:
  安全性上:包括摘要式验证、整合的Windows验证、SGC (Server-Gated Cryptography ) 、Microsoft Certificate Services 2.0、集区处理程序之程序保护等。
  管理上:包括IIS重新激活、站台CPU使用时间的限制、CPU资源使用记录、使用终端机服务远程管理IIS、自订错误讯息等。
  Internet标准上:包括WebDAV(Web Distributed Authoring and Versioning)、FTP重新激活、HTTP压缩等。
  
   Active Server Pages:包括新的转向方法(Server.Transfer与Server.Execute方法)、新的错误处理功能(Server.GetLastError方法)、无指令.asp的执行速度增快、可安装组件的效能调升、Scriptlet支持、使用cookie取得浏览器信息、自动增减执行绪(executing threads)、SRC服务器端包含功能、Script Encoder编码保护等。
   更具体的功能介绍请参见其它资料。
  
  2 关闭没有用的服务和协议
  “尽量少开没用到的服务”,这永远是网络安全的准则。如果开启了某个
  服务,你就要面对不少的漏洞困扰,更重要的是你还要时时提防未来的由这个服务所引起的漏洞。
   比如,你不使用ftp,那就把FTP关了,不然你就要发费大量的精力
  和金钱去应付那些什么DOS,缓冲区溢出之类的漏洞。NETBIOS也是windows的一大安全隐患,我想目前服务器很少需要Netbios。再如你的IIS安装了index server 服务,那你至少要面对三个以上的有关这个服务的漏洞,因此如果你没用到INDEX SERVER服务,也大可删除他.
   同样的道理,我们要安装最少的协议。千万不要安装点对点通道
  通讯协议。此外,还必须小心地配置TCP/IP协议。在TCP/IP的属性页中选择“IP地址”项目,然后选择“高级”。在弹出来的对话框中选择“安全机制”,这样你可以禁止UDP,然后开启IP端口6和TCP端口80。当然开不开这些端口主要是看你的情况了。
  IIS中的应用程序映射也是个很大的安全漏洞,请在IIS中设置好扩展名和可执行路径,删除没用的扩展名。
  
  3 设置好你的NT
   NT缺省安装时,系统账号Administrator和Guest被自动设置,很多攻击者就是利用这些账号来猜密码,从而进入你的系统。虽然没有足够的耐心,很难猜中这些密码,但是为了安全起见,建议把这些账号重新命名或者删除。
   NT SERVER的系统策略编辑器非常有用。按“管理工具”->“系统策略编辑器”就可以进入,然后选择“文件”->“打开注册表”,并选择“本地计算机”图标,就可以认真配置了。主要设置以下几项:
  1. 取消:网络->系统规则更新->远程更新
  2. 取消:WINDOWS NT网络->共享->创建隐藏的驱动器共享
  3. 设置:Windows NT远程访问下面的各项
  4. 设置:Windows NT系统->登录中各个项目。包括设置登录标记;不允许从“身份验证对话框”关机;不显示上次登录的用户名.
  5. 设置:WINDOWS NT系统->文件系统中的“不为长文件名创建8.3文件名”
   不要使用远程管理软件,除非不得已。由于NT不太支持远程管理,所以你可能会安装Reachout或者PC anywhere来管理。可是,当你安装了这些软件,你就不得不开启TCP/IP的所有端口。
   在你离开服务器的时候,请按”Ctrl+del+alt”,并选择“锁定工作站”。
  
  4 磁盘文件格式使用比较安全的NTFS格式。
   NTFS 权限是 Web 服务器安全性的基础,它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT 有效帐号的用户试图访问一个有权限限制的文件时,计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组 所被赋予的权限。例如,Web 服务器上的 Web 应用程序的所有者需要有“更改”权限来查看、更改和删除应用程序的 .asp 文件。但是,访问该应用程序的公共用户应仅被授予“只读”权限,以便将其限制为只能查看而不能更改应用程序的 Web 页。
  
  5 对目录设置不同的属性,如:Read、Excute、Script。
   您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的ASP 页的方式。不同于 NTFS 权限提供的控制特定用户对应用程序文件和目录的访问方式, Web 服务器权限应用于所有用户,并且不区分用户帐号的类型。 对于要运行您的 ASP 应用程序的用户,在设置 Web 服务器权限时,必须遵循下列原则:
   对包含 .asp 文件的虚拟目录允许“读”或“脚本”权限。
   对 .asp 文件和其他包含脚本的文件(如 .htm 文件等)所在的虚目录允许“读”和“脚本”权限。
   对包含 .asp 文件和其他需要“执行”权限才能运行的文件(如 .exe 和 .dll 文件等)的虚目录允许“读”和“执行”权限。
  
  6 维护 Global.asa 的安全
   为了充分保护 ASP 应用程序,一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果 Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa 文件,则信息将被返回给浏览器,即便应用程序的其他文件被保护。
  
  7不要把密码,物理路径直接写在程序中。
  很难保证您的ASP程序是否会给人拿到,即使你安装了最新的补丁。为
  了安全起见,应该把密码和用户名保存在数据库中,使用虚拟路径。
  
  8 在程序中记录用户的详细信息.
   这些信息包括用户的浏览器、用户停留的时间,用户IP等。其中
  记录IP是最有用的。
   可用下面的语句了解客户端和服务端的信息:
  
   <Table><%for each name in request.servervariables%>
   <tr><td><%=name%>:</td>
   <td><%=request.servervariables(name)%></td>
   </tr>
   <%next%></table>
  
   如果我们可以记录了用户的IP,就能通过追捕来查用户的具体地点。
  当然如果用户通过代理来浏览网页,上面的方法只能看到用户代理的IP,而不能记录用户真实的IP。ASP没有提供查看客户端网卡物理地址(即MAC)的功能。
  
  9 Cookie 安全性
  ASP 使用 SessionID cookie 跟踪应用程序访问或会话期间特定的 Web 浏览器的信息。这就是说,带有相应的 cookie 的 HTTP 请求被认为是来自同一 Web 浏览器。Web 服务器可以使用 SessionID cookies 配置带有用户特定会话信息的 ASP 应用程序。例如,如果您的应用程序是一个允许用户选择和购买 CD 唱盘的联机音乐商店,就可以用 SessionID 跟踪用户漫游整个应用程序时的选择。
   SessionID 能否被黑客猜中?
   为了防止计算机黑客猜中 SessionID cookie 并获得对合法用户的会话变量的访问,Web 服务器为每个 SessionID 指派一个随机生成号码。每当用户的 Web 浏览器返回一个 SessionID cookie 时,服务器取出 SessionID 和被赋予的数字,接着检查是否与存储在服务器上的生成号码一致。若两个号码一致,将允许用户访问会话变量。这一技术的有效性在于被赋予的数字的长度(64 位),此长度使计算机黑客猜中 SessionID 从而窃取用户的活动会话的可能性几乎为 0。
   加密重要的 SessionID Cookie.
   截获了用户 sessionID cookie 的计算机黑客可以使用此 cookie 假冒该用户。如果 ASP 应用程序包含私人信息,信用卡或银行帐户号码,拥有窃取的 cookie 的计算机黑客就可以在应用程序中开始一个活动会话并获取这些信息。您可以通过对您的 Web 服务器和用户的浏览器间的通讯链路加密来防止 SessionID cook ie 被截获。
  
  10使用身份验证机制保护被限制的 ASP 内容
   可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT帐号的用户名和密码。每当用户试图访问被限制的内容时,Web 服务器将进行身份验证,即确认用户身份,以检查用户是否拥有有效的 Windows NT 帐号。
   Web 服务器支持以下几种身份验证方式:
   基本身份验证 提示用户输入用户名和密码。
   Windows NT 请求/响应式身份验证,从用户的 Web 浏览器通过加密方式获取用户身份信息。
   然而,Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户身份。
  
  11 保护元数据库
   访问元数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时,须经已通过身份验证的连接,如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前,仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求响应式身份验证。
  
  12 使用 SSL 维护应用程序的安全
  SSL (Secure Sockets Layer)协议是由Netscape首先发表的网络资料安全传输协定,其首要目的是在两个通信间提供秘密而可靠的连接。该协议由两层组成,底层是建立在可靠的传输协议(例如:TCP)上的是SSL的记录层,用来封装高层的协议。SSL握手协议准许服务器端与客户端在开始传输数据前,能够通过特定的加密算法相互鉴别。SSL的先进之处在于它是一个独立的应用协议,其它更高层协议能够建立在SSL协议上。
  SSL3.0 协议作为 Web 服务器安全特性,提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证,并能可靠地确认访问被限制的 Web 站点的用户的身份。
     通过 SSL,您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接;以防用户与应用程序间交换的重要信息被截取。
  比如好多基于WEB的ASP论坛都会提供注册用户互相发送信息的服务,这种信息是明文传送的,如果在网吧就很容易给人监听到。如果加了一层SSL认证,就会防止发送信息被监听的可能。
  
  13 客户资格认证
   控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用 客户资格登录。客户资格是包含用户身份信息的数字身份证,它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格,第三方组织在发放资格证之前确认用户的身份信息。(通常,这类组织要求姓名、地址、电话号码及所在组织名称;此类信息的详细程度随给予的身份等级而异。)
   每当用户试图登录到需要资格验证的应用程序时,用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确,那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。
   作为 ASP 应用程序开发人员,您可以编写脚本来检查资格是否存在并读取资格字段。例如,您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。
   必须将 Web 服务器配置为接受或需要客户资格,然后才能通过 ASP 处理客户资格;否则,ClientCertificate 集合将为空。
  
  14 ASP的加密
   由于ASP脚本是采用明文(plain text)方式来编写的,所以应用开发商辛苦开发出来的ASP应用程序,一旦发布到运行环境中去后,就很难确保这些“源代码”不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。
   官方加密程序:从微软免费下载到sce10chs.exe 直接运行即可完成安装过程。安装完毕后,将生成screnc.exe文件,这是一个运行在DOS PROMAPT的命令工具。
  运行screnc – l vbscript source.asp destination.asp生成包含密文ASP脚本的新文件destination.asp用记事本打开看凡是“<%和%>"之内的,不管是否注解,都变成不可阅读的密文了,但无法加密中文。
  几种ASP源代码保护方法:
  1,“脚本最小化”即ASP文件中只编写尽可能少的源代码,实现
  商业逻辑的脚本部分被封装到一个COM/DCOM组件,并在ASP脚
  本中创建该组件,进而调用相应的方法(methed)即可。应用开发者
  动手开发ASP脚本应用之前就可按此思路来开发,或者直接用ASP
  脚本快速开发出原型系统后,针对需要保护、加密的重要脚本用
  COM/DCOM组件来重新开发、实现并替换。
  2,“脚本加密”即ASP脚本仍直接按源代码方式进行开发,但在发布到运行环境之前将脚本进行加密处理,只要把加密后的密文脚本发布出去。即在ASP.DLL读取脚本这个环节加入密文还原的处理。实现这种思路的方法有两种:一是自行开发一个ISAPI的IIS过滤(filter)块,在ASP.DLL之前勾连(hook)对ASP脚本文件的读取,以便把文件系统读出的密文还原成ASP.DLL可以解释的明文;
  方法二是直接由ASP.DLL提供对ASP脚本加密处理的支持。微软在新版本的Vbscript.dll jscript.dll中提供这种成为MS script encode技术的支持。这样,无论是客户端的Vbscript jscript(包括WSH脚本等),还是服务器端的Vbscript jscript (即ASP脚本)都可以支持加密处理。
  MS script encode 技术具体的实现思路包括以下两个方面:一是
  加密过程,通过提供一个实用程序对包含ASP脚本源代码的文本文件
  进行扫描,找出其标记为<script language = "vbscript.encode">或<script
  language = "Jscript.encode">;二是还原过程,IE或ASP.DLL等执行
  脚本时是统一通过Vbscript.dll jscript.dll来解释执行的,所以它们都
  能同时地、透明地支持明文和密文的脚本。
    总之,如果采用第一种思路,要么就自行在开发过程中遵照进行,
  要么可以考虑选择自动转换成visual basic 编译代码的通用的、实用工具;采取第二种思路的化,要么就自行开发IIS ISAPI过滤模块,要么可以考虑直接采用MS script encode软件。
  
   下面来看看一种ASP可以使用的简单字符加密算法,而不是那些受限制的加密算法。其实,这里介绍的加密算法对于一般的运用来说已经足够解密人麻烦一阵子的了。它的加密基础是最简单的Vernum密码方法,
   它的基本原理是,需要有一个需要加密的明文和一个随机生成的解密钥匙文件。然后
  使用这两个文件组合起来生成密文。
   (明文) 组合 (密钥) = 加密后的密文
   所以这里介绍的是生成密钥的代码。我们假设我们生成的密钥为512位长的密钥,
  它已经足够来加密一个文本字符了。代码如下:
  
  KeyGeN.asp文件
  <%
  '******************************
  ' KeyGeN.asp
  '******************************
  Const g_KeyLocation = "C:\key.txt"
  Const g_KeyLen = 512
  
  On Error Resume Next
  
  Call WriteKeyToFile(KeyGeN(g_KeyLen),g_KeyLocation)
  
  if Err <> 0 Then
   Response.Write "ERROR GENERATING KEY." & "<P>"
   Response.Write Err.Number & "<BR>"
   Response.Write Err.Description & "<BR>"
  Else
   Response.Write "KEY SUCCESSFULLY GENERATED."
  End If
  
  Sub WriteKeyToFile(MyKeyString,strFileName)
   Dim keyFile, fso
   set fso = Server.CreateObject("scripting.FileSystemObject")
   set keyFile = fso.CreateTextFile(strFileName, true)
   keyFile.WriteLine(MyKeyString)
   keyFile.Close
  End Sub
  
  Function KeyGeN(iKeyLength)
  Dim k, iCount, strMyKey
   lowerbound = 35
   upperbound = 96
   Randomize ' Initialize random-number generator.
   for i = 1 to iKeyLength
   s = 255
   k = Int(((upperbound - lowerbound) + 1) * Rnd + lowerbound)
   strMyKey = strMyKey & Chr(k) & ""
   next
   KeyGeN = strMyKey
  End Function
  
  %>
  
   在IIS下运行上面的KeyGeN.asp页面。你只需要如此做一次,他将把密钥写入文件
  c:\key.txt中 (如果你愿意的话,你也可以把这个文件放到另外一个更加安全的地方).
  然后你可以打开这个key.txt文件,它将包含512个ASCII码在35到96之间的字符.
  并且由于是随机生成的,所以每个人的私人密钥文件key.txt将是不一样的,下面是
  一个例子密钥文件:
  
  IY/;$>=3)?^-+7M32#Q]VOII.Q=OFMC`:P7_B;<R/8U)XFHC<SR_E$.DLG'=I+@5%*+OP:F_=';'NSY`-^S.`AA=BJ3M0.WF#T5LGK(=/<:+C2K/^7AI$;PU'OME2+T8ND?W$C(J\,;631'M-LD5F%%1TF_&K2A-D-54[2P,#'*JU%6`0RF3CMF0(#T07U'FZ=>#,+.AW_/+')DIB;2DTIA57TT&-]O'/*F'M>H.XH5W^0Y*=71+5*^`^PKJ(=E/X#7A:?,S>R&T;+B#<:-*\@)X9F`_`%QA3Z95.?_T#1,$2#FWW5PBH^*<))A(S0@AVD8C^Q0R^T1D?(1+,YE71X+.*+U$:3XO^Q).KG&0N0);[LJ<OZ6IN?7N4<GTL?(M'4S8+3JMK5)HC%^1^+K;\$WBXPA?F&5^E\D$7%*O/U[1/?8(5:1OVWV*1Z-%`:K&V?X1,1KURD@3W0^D)<OG40?(VJ4EWL5A5M<$A);CQ36R9I]*U#Q%1<Y\&SA%#1<V
  
   下面再仔细分析一下上面的程序,我们发现其中的lowerbound和upperbound的数值
  其实就是你想使用来加密的ASCII字符范围。
  
  下面的代码将介绍如何使用这个密钥来加密和解密一个字符串
  
  Crypt.asp文件
  <%
  Dim g_Key
  
  Const g_CryptThis = "Now is the time for all good men to come to the aid of their country."
  Const g_KeyLocation = "c:\key.txt"
  
  g_Key = mid(ReadKeyFromFile(g_KeyLocation),1,Len(g_CryptThis))
  
  Response.Write "<p>ORIGINAL STRING: " & g_CryptThis & "<p>"
  Response.Write "<p>KEY VALUE: " & g_Key & "<p>"
  Response.Write "<p>ENCRYPTED CYPHERTEXT: " & EnCrypt(g_CryptThis) & "<p>"
  Response.Write "<p>DECRYPTED CYPHERTEXT: " & DeCrypt(EnCrypt(g_CryptThis)) & "<p>"
  
  Function EnCrypt(strCryptThis)
   Dim strChar, iKeyChar, iStringChar, i
   for i = 1 to Len(strCryptThis)
   iKeyChar = Asc(mid(g_Key,i,1))
   iStringChar = Asc(mid(strCryptThis,i,1))
   ' *** uncomment below to encrypt with addition,
   ' iCryptChar = iStringChar + iKeyChar
   iCryptChar = iKeyChar Xor iStringChar
   strEncrypted = strEncrypted & Chr(iCryptChar)
   next
   EnCrypt = strEncrypted
  End Function
  
  Function DeCrypt(strEncrypted)
  Dim strChar, iKeyChar, iStringChar, i
   for i = 1 to Len(strEncrypted)
   iKeyChar = (Asc(mid(g_Key,i,1)))
   iStringChar = Asc(mid(strEncrypted,i,1))
   ' *** uncomment below to decrypt with subtraction
   ' iDeCryptChar = iStringChar - iKeyChar
   iDeCryptChar = iKeyChar Xor iStringChar
   strDecrypted = strDecrypted & Chr(iDeCryptChar)
   next
   DeCrypt = strDecrypted
  End Function
  
  Function ReadKeyFromFile(strFileName)
   Dim keyFile, fso, f
   set fso = Server.CreateObject("Scripting.FileSystemObject")
   set f = fso.GetFile(strFileName)
   set ts = f.OpenAsTextStream(1, -2)
  
   Do While not ts.AtEndOfStream
   keyFile = keyFile & ts.ReadLine
   Loop
  
   ReadKeyFromFile = keyFile
  End Function
  
  %>
   在Crypt.asp中我们首先从密钥文件中得到密钥值,然后从这段密钥中
  截取和我们需要加密的明文同样长度的密钥。然后使用一个简单的异或操作
  将明文和密钥进行运算,那么得到的结果就是加密后的密文了。过程很简单的。
   由于是使用了异或操作,所以解密将非常简单,只要使用同样的密钥对密文
  再次进行异或操作就能够解密了。
   在上面介绍的基础上,你可以少加改动,就可以使用同样的方法加密一个文件。
  唯一需要注意的是,对于一个二进制文件,你需要做一些完整性检查以保证转换回来
  的字符不要越界。
   现在你需要做的就是把密钥保存在服务器上的一个安全的地方(不能够被外部访问)
  
  15 SQL SERVER的安全性
  目前用ASP编写的WEB应用中,后台数据库大部分SQL SERVER。SQL SERVER相对来说比较安全。但是也要小心地配置SQL Server.
  1安装远程数据库管理有风险
   SQL Server支持从远程进行数据库的维护。在安装时你可以选择不安装,安装完成以后,你还可以通过“SQL Server Network Utility”来删除远程管理。如果你要使用远程管理,请使用TCP/IP,并将缺省的端口1433改变为其他的数值。使用远程对你可能比较方便,便是请注意一个hacker只要知道你的SQL server密码,就可以进入你的数据库。
  2 改变sa的密码。
   缺省安装时,SQL SERVER的sa账号的密码为空,建议你在Enterprise SERVER中,改变sa的密码。
  3 数据库登录账号不要写入ASP页面中。
  16 使用最新的扫描器扫描ASP漏洞
  目前可以扫描IIS漏洞的扫描器有很多,比较有名的有ISS,CIS和gnit等。下面我们以GNIT为例子。
  GNIT是个功能很强的漏洞扫描器,能扫描NT的用户名和相关信息列表,扫描IIS的漏洞。
  在WINNT的DOS模式下打下:
  gnit <对方IP>
  比如:gnit 172.1.1.1
  
  GNIT开始扫描端口,从上图可知目标主机提供了HTTP,FTP,SMTP等服务,扫描完后。会在GNIT目录下生成一个HTML文件,其文件名是目标主机的IP。打开这个HTML文件,会看到对方主机的一些信息和漏洞。这些信息和漏洞包括:用户名和组的相关详细信息,开放的服务和WEB扫描的漏洞等。我们比较关心的是WEB扫描的漏洞信息:
  下图是GNIT的WEB扫描一些信息,其中加粗部分是漏洞,当然有些漏洞并不准确,但不妨试试。(有必要说明下,以下我是在一台NT4。01,IIS4。0,Option PACK6.0,并且缺省安装)
  
   要测试这些漏洞很简单。比如:可在URL输入:
   http://someurl/iisadmpwd/aexp3.htr
  ―――可远程管理IIS。
  
  http://someurl/scripts/iisadmin/bdir.htr
   ――――目标主机的硬盘全部目录都一览无余,并且有创建新目录的功能(不过我在测试中,并不能创建远程目录,但是能使目标主机的WEB当机)
  http://someurl/scripts/tools/getdrvrs.exe
   ----可在远程主机上创建ODBC数据库,不管数据库路径和数据库是否存在。
  
   
   此外还有其它的漏洞,请网友自己测试。其解决方法请看上面的漏洞分析。
   如果用CIS扫描器,还有比较详细的漏洞分析和解决方法。请读者自己分析。
  七、总结
    目前WEB数据库访问的多种技术中,比如CGI(通用网关接口)、JDBC、PHP、ASP,ASP以其开发周期短,存取方式数据库简单,运行速度快而成为众多网站程序员的首选开发技术。
  但是其网络安全性也是不容忽视的。做为一个ASP开发者,你必须关注NT和IIS的安全漏洞,从上面的讨论我们可以看到ASP的很多漏洞都是由IIS所引起的。同时ASP程序员在开发自己的网站时,要注意来自ASP程序设计不当所引发的安全问题。
  八、声明
   本文中某些例子是从其它网站上整理的,因时间紧迫,未来得及通知作者,请见谅!
  
   小鸟 ([email protected])
   傲气雄鹰网络安全新干线(http://www.safefan.com)
  

 
相关内容
赞助商链接