星空网 > 软件开发 > ASP

维护ASP应用程序的安全

1.3   ASP的安全性
不论是在Windows 98 还是Windows NT下编写调试A S P应用程序,最终A S P应用程序还是会应用在基于Microsoft Internet Information Server(IIS)的I n t e r n e t或I n t r a n e t上,那么,它是不是安全呢?IIS 是运行在Windows NT Server上的信息服务,它提供F T P、W W W等广泛使用的I n t e r n e t和I n t r a n e t服务。而A S P的运行环境由I I S提供,所以,I I S是否安全直接影响到A S P的安全。
1.3.1   Windows NT和I I S
I I S是Windows NT Server上的信息服务,它与Windows NT的用户账户和用户组有着密切的联系。Windows NT安全性的核心之一是用户账户和组。在安装 I I S的过程中,自动建立两个用户账户,它们被赋予一定的用户权力,并被放入特殊的组。这两个账户是 I U S R _计算机名和I WA M _计算机名。I U S R _计算机名用于匿名访问。 I WA M _计算机名由M i c r o s o f t事务处理服务(M T S)和其他I I S应用程序使用。由于I I S是Windows NT Server本地的一个服务,而账户I U S R又用于I I S,相当于用户以交互方式登录到服务器上,所以必须赋予I U S R _计算机名“在本机登录”的权力。任何匿名访问者都具备赋予I U S R _计算机名的权力。如果不使用这个缺省匿名账户,可以指定其他用户账户作为匿名账户,并为这个账户指定合适的用户权力。在提供其他验证方式时,I I S与N T用户账户也有着密切的联系,这些方式都需要有效的用户账户。虽然I I S建立了匿名用户I U S R _计算机名,但并没有建立用于其他验证方式的用户账户,应由管理员建立并管理与这些验证方式相关的用户账户。
Windows NT提供两种文件系统,FAT和N T F S。虽然I I S能在FAT分区上正常工作,但N T F S文件系统有更多的优越性,例如:
1) 对于FAT文件系统(如D O S),N T F S是不可见的,避免了使用D O S命令对资源的破坏。
2) NTFS文件系统能更有效地管理硬盘资源。
3) NTFS允许对用户和组设置资源的访问权限,即配置资源的访问控制列表( A C L)。A C L是指与某一资源,如文件或目录有关的用户、组及他们对资源的访问权限。 A C L是Windows NT安全模型的又一个核心内容,它提供了对硬盘资源灵活、精确的访问控制。每个目录或文件都有自己的A C L,每个A C L本身又有一个A C L,用于指定谁有权查看和更改A C L。N T F S和A C L是保护服务器资源的基础。I I S提供We b权限,如读和写, N T F S也有它的读写权限,两者容易引起混淆。 I I S权限与N T F S权限的关键区别在于: We b权限控制允许对H T T P资源执行的H T T P命令,N T F S权限控制用户对硬盘资源的访问权限。当浏览器发出资源请求时, H T T P命令随头信息一起发送,例如,一个用户请求读取( G E T )一个We b页,发送的头信息指定资源、资源的位置,另外还要发送动词
G E T,这个动词告诉I I S,本次请求要对资源进行“读”操作。选择 I I S的We b主目录标签、目录标签或虚拟目录标签的“读取”、“写入”复选框,可以设置上述 We b权限。如果We b权限是读,并不意味着也设置了N T F S的读权限。因为We b权限只控制在H T T P请求中能够使用的H T T P命令。反过来,如果设置N T F S权限是读,意味着We b权限也是读。如果N T F S权限是读,即使We b权限是读写, H T T P的写请求也会失败。如果We b权限和N T F S权限不一致,H T T P请求将使用两者权限中最严格的一个。
1.3.2   IIS安全漏洞
当A S P以其灵活、简单、实用、强大的特性迅速风靡全球网站的时候,其本身的一些缺陷、漏洞也正威胁着所有的网站开发者。所有的A S P应用程序开发者应密切关注,提高警惕。微软再次被指责对其出品的 We b服务器软件的安全问题不加重视。在微软的流行产品 I I SS e v e r 4 . 0中发现存在一种被称为“非法H T R请求”的缺陷。据微软称,此缺陷在特定情况下会导致任意代码都可以在服务器端运行。但用发现这一漏洞的 I n t e r n e t安全公司e E y e的CEO FirasB u s h n a q的话说:这只是冰山一角而已。 B u s h n a q说,微软隐瞒了些情况,比如黑客可以利用这一漏洞对I I S服务器进行完全的控制,而恰恰许多电子商务站点是基于这套系统的。尽管I I S存在一些漏洞,但它的强大功能正被许多程序开发者所认识,而微软也在不断地发行更高版本的A S P,以提高其安全性。我们不能因为一些缺陷而放弃功能如此强大而又易于学习使用的服务器应用程序开发环境。为了尽量使自己的网站安全,使自己的 A S P应用程序安全,应合理进行I I S的系统配置。以下是I I S系统配置的安全性建议,希望能给大家一些帮助:
1.使用最新版本的I I S 4 . 0,并安装N T最新版本的Service Pack5,服务器的文件系统不要使用
FAT,应该使用N T F S。
2.把I I S中的s a m p l e、s c r i p t s、i i s a d m i n和m s a d c等We b目录设置为禁止匿名访问并限制I P地址。
在微软还没有提供补丁之前,把i s m . d l l有关的应用程序映射删除。
3.有条件的话就采用防火墙机制,最简单的方法有, We b服务器开在前台,目录放在后台。如果能用一个服务器一台机当然最好。
4. We b目录、C G I目录、s c r i p t s目录和w i n n t目录等重要目录要用N T F S的特性设置详细的安全
权限,包含注册表信息的 Wi n n t目录只允许管理员完全控制,一般的用户只读的权限也不要给。凡是与系统有关的重要文件,除了A d m i n i s t r a t o r,其他账号都应该设置为只读权限,
而不是e v e r y o n e。
5.只开你需要的服务,关掉所有不应该打开的端口,如N e t B i o s端口1 3 9,这是一个典型的危险端口;怎样禁止这些端口?除了使用防火墙外, N T的T C P / I P设置里面也提供了这种功能:打开“控制面板|网络|协议| T C P / I P |属性|高级|启用安全机制|配置”,这里面提供了T C P和U D P端口的限制和I P协议的限制功能。
6.管理员的账号要设置得复杂一些,建议加入特殊字符。
7.把F T P、Te l n e t的T C P端口改为非标准端口,通常笔者都是设置到 10 000~65 000的范围。
8.删除可以删除的所有共享,包括打印机共享和隐藏的共享如 I C P $和A d m i n $等,微软说这些特殊共享资源很重要,大多数情况下不能删除,而实际上放在 I n t e r n e t上的机器大多数不需要共享。 IPC$: 适用于远程管理计算机和查看共享资源,在网上最好不要用。Admin$: 实际上就是 c : " w i n n t,也没有必要共享。C$: 登录为A d m i n和B a c k u p - o p e r a t o r的用户可以用" "计算机名" C $的方式访问C盘,虽然仅限于局域网 ,但是远程黑客也有办法伪装成局域网的登录用户,所以都应该关掉。Print$: 这是放打印机驱动程序的目录,也是个很危险的入口。Netlogon: 这是处理域登录请求的共享。如果你的机器为主域控制器,域内有其他机器要登录进来,就不要删除它,否则照样可以删除。用“服务器管理器”|“共享目录 ”|“停止共享”。
9.将A S P的目录集中管理,为A S P的程序目录设置详尽的访问权限。
10.把w i n n t下的s a m . _文件改名,实践证明这个可能泄露密码的文件可以删除不要。
11.对于已知的N T安全漏洞,都应该在自己的机器上做测试检查。并及时安装补丁程序。
12.有必要的情况下采用I I S 4 . 0提供的S S L安全通信机制来防止数据在网上被截获。

*********************************************************************************************
NTFS 权限

您可以通过为单独的文件和目录应用 NTFS 访问权限来保护 ASP 应用程序文件。NTFS 权限是 Web 服务器安全性的基础,它定义了一个或一组用户访问文件和目录的不同级别。当拥有 Windows NT 有效帐号的用户试图访问一个有权限限制的文件时,计算机将检查文件的 访问控制表 (ACL)。该表定义了不同用户和用户组所被赋予的权限。如果用户的帐号具有打开文件的权限,计算机则允许该用户访问文件。例如,Web 服务器上的 Web 应用程序的所有者需要有摳臄权限来查看、更改和删除应用程序的 .asp 文件。但是,访问该应用程序的公共用户应仅被授予撝欢翑权限,以便将其限制为只能查看而不能更改应用程序的 Web 页。

维护 Global.asa 的安全

为了充分保护 ASP 应用程序,一定要在应用程序的 Global.asa 文件上为适当的用户或用户组设置 NTFS 文件权限。如果 Global.asa 包含向浏览器返回信息的命令而您没有保护 Global.asa 文件,则信息将被返回给浏览器,即便应用程序的其他文件被保护。

有关配置 NTFS 权限的详细信息,请参阅 访问控制。

注意 一定要对应用程序的文件应用统一的 NTFS 权限。例如,如果您不小心过度限制了一应用程序需要包含的文件的 NTFS 权限,则用户可能无法查看或运行该应用程序。为了防止此类问题,在为您的应用程序分配 NTFS 权限之前应仔细计划。

Web 服务器权限

您可以通过配置您的 Web 服务器的权限来限制所有用户查看、运行和操作您的 ASP 页的方式。不同于 NTFS 权限提供的控制特定用户对应用程序文件和目录的访问方式, Web 服务器权限应用于所有用户,并且不区分用户帐号的类型。

对于要运行您的 ASP 应用程序的用户,在设置 Web 服务器权限时,必须遵循下列原则:

对包含 .asp 文件的虚拟目录允许摱翑或摻疟緮权限。 

对 .asp 文件和其他包含脚本的文件(如 .htm 文件等)所在的虚目录允许摱翑和摻疟緮权限。 

对包含 .asp 文件和其他需要撝葱袛权限才能运行的文件(如 .exe 和 .dll 文件等)的虚目录允许摱翑和撝葱袛权限。 

有关配置 Web 服务器权限的详细信息,请参阅 访问控制。

脚本映射文件

应用程序的脚本映射保证了 Web 服务器不会意外地下载 .asp 文件的源代码。例如,即使您为包含了某个 .asp 文件的目录设置了摱翑权限,只要该 .asp 文件隶属于某个脚本映射应用程序,那么您的 Web 服务器就不会将该文件的源代码返回给用户。

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 cookie 被截获。有关加密的详细信息,请参阅 安全性。

使用身份验证机制保护被限制的 ASP 内容

您可以要求每个试图访问被限制的 ASP 内容的用户必须要有有效的 Windows NT 帐号的用户名和密码。每当用户试图访问被限制的内容时,Web 服务器将进行身份验证,即确认用户身份,以检查用户是否拥有有效的 Windows NT 帐号。

Web 服务器支持以下几种身份验证方式:

基本身份验证 提示用户输入用户名和密码。 

Windows NT 请求/响应式身份验证 从用户的 Web 浏览器通过加密方式获取用户身份信息。 

然而,Web 服务器仅当禁止匿名访问或 Windows NT 文件系统的权限限制匿名访问时才验证用户身份。详细信息,请参阅 关于身份验证。

保护元数据库

访问元数据库的 ASP 脚本需要 Web 服务器所运行的计算机的管理员权限。在从远程计算机上运行这些脚本时,须经已通过身份验证的连接,如使用 Windows NT 请求/响应验证方式进行连接。应该为管理级 .asp 文件创建一个服务器或目录并将其目录安全验证方式设置为 Windows NT 请求/响应式身份验证。目前,仅 Microsoft Internet Explorer version 2.0 或更高版本支持 Windows NT 请求/响应式身份验证。

使用 SSL 维护应用程序的安全

Secure Sockets Layer (SSL) 3.0 协议作为 Web 服务器安全特性,提供了一种安全的虚拟透明方式来建立与用户的加密通讯连接。SSL 保证了 Web 内容的验证,并能可靠地确认访问被限制的 Web 站点的用户的身份。

通过 SSL,您可以要求试图访问被限制的 ASP 应用程序的用户与您的服务器建立一个加密连接;以防用户与应用程序间交换的重要信息被截取。详细信息,请参阅 加密。 

维护包含文件的安全

如果您从位于没有保护的虚拟根目录中的 .asp 文件中包含了位于启用了 SSL 的目录中的文件,则 SSL 将不被应用于被包含文件。因此,为了保证应用 SSL,应确保包含及被包含的文件都位于启用了 SSL 的目录中。

客户资格认证

控制对您的 ASP 应用程序访问的一种十分安全的方法是要求用户使用 客户资格 登录。客户资格是包含用户身份信息的数字身份证,它的作用与传统的诸如护照或驾驶执照等身份证明相同。用户通常从委托的第三方组织获得客户资格,第三方组织在发放资格证之前确认用户的身份信息。(通常,这类组织要求姓名、地址、电话号码及所在组织名称;此类信息的详细程度随给予的身份等级而异。)

每当用户试图登录到需要资格验证的应用程序时,用户的 Web 浏览器会自动向服务器发送用户资格。如果 Web 服务器的 Secure Sockets Layer (SSL) 资格映射特性配置正确,那么服务器就可以在许可用户对 ASP 应用程序访问之前对其身份进行确认。

用于处理资格证明的 ASP 脚本

作为 ASP 应用程序开发人员,您可以编写脚本来检查资格是否存在并读取资格字段。例如,您可以从资格证明中访问用户名字段和公司名字段。Active Server Pages 在 Request 对象的 ClientCertificate 集合中保存资格信息。详细信息,请参阅 ASP 内建对象。

必须将 Web 服务器配置为接受或需要客户资格,然后才能通过 ASP 处理客户资格;否则,ClientCertificate 集合将为空。

--------------------------------------------------------------------------------

创建事务性脚本

商业应用程序常常需要具有在事务内部运行脚本和组件的能力。事务是一种服务器操作,即使该操作包括很多步骤(例如,定货、查看存货、付帐等),也只能整体返回操作是成功还是失败。用户可以创建在事务内部运行的 ASP 脚本,如果脚本的任何一部分失败,整个事务都将会终止。

ASP 事务处理是以 Microsoft? Transaction Server (MTS) 为基础的。Microsoft? Transaction Server (MTS) 是一个事务处理系统,用于开发、配置和管理高性能、可分级的、有鲁棒性的企业 Internet 和 Intranet 服务器应用程序。Transaction Server 为开发分布式的,基于组件的应用程序提供了一个应用程序设计模型。它也为配置和管理这些应用程序提供了一个运行环境。

创建事务性脚本的功能内置在 Internet Information Server 和 Personal Web Server 中。如果您安装了 Microsoft Transaction Server,就可以将组件打包,以使组件在事务内部运行。有关组件打包的详细信息,请参阅 创建 MTS 包。

关于事务

事务是整体成功或失败的操作。事务处理用于对数据库进行可靠地更新。在对数据库进行许多相关更改或同时更新多个数据库时,要保证所有更改都被正确执行。如果这些更改中的任何一个失败,都需要恢复数据库表的原始状态。

如果没有 MTS,您就需要编写脚本和组件,手工跟踪请求的更改情况,以便在某些更改失败时恢复数据。使用 MTS,您只需简单的将您的脚本和组件声明为撔枰挛駭并让 MTS 处理事务的一致性。事务处理只适用于数据库访问;MTS 不能对文件系统或其他的非事务性资源的更改进行恢复操作。应用程序所访问的数据库必须为 MTS 所支持。目前,MTS 支持 SQL Server 及任何支持 XA 协议(由 X/Open 协会制定)的服务器。MTS 将继续扩展对其他数据库的支持。

事务不能跨越多个 ASP 页。如果一个事务需要来自多个组件的对象,则须将使用这些对象的操作组合在一个 ASP 页中。例如,假定有一个组件用于更新工资单数据库,还有一个组件用于更新人力资源数据库中的员工记录。为了记录一个员工的新的工资信息,您需要编写这样一个脚本,该脚本在一个事务环境中调用这两个组件,一个用于更新工资单数据库,另一个用于更新人力资源数据库中的员工等级。

声明事务性脚本

在将一个页声明为事务性时,此页中的任何脚本命令和对象都运行在同一个事务环境中。Transaction Server 处理生成事务的细节并决定事务成功(提交)或失败(终止)。要将某个页声明为事务性,可在页首添加 @TRANSACTION 指令:

<%@ TRANSACTION = value %>

value 参数可以是下列之一:

值 意义 

Requires_New 启动一个新的事务。 

Required 启动一个新的事务。 

Supported 不启动事务。 

Not_Supported 不启动事务。 

@TRANSACTION 指令必须在一页中的第一行,否则将产生错误。必须将该指令添加到需要在事务下运行的每一页中。当脚本处理结束时,当前事务即告结束。

大多数应用程序只有一些特定的操作需要事务环境。例如,一个航空公司的站点可能只需要事务性脚本处理购票和安排座位,而其他所有脚本则无须事务环境即可安全运行。因为事务只须用于需要事务处理的页即可,不要将应用程序的 Global.asa 文件声明为事务性。

如果事务被终止,Transaction Server 将恢复对支持事务的资源的任何更改。目前,仅数据库服务器完全支持事务,因为数据库中的数据对于企业应用是最为关键的。Transaction Server 不对硬盘上的文件、会话和应用程序的变量、集合等的改变进行恢复。然而您可以如下文主题所述,通过编写事务事件来编写恢复变量和集合的脚本。在某些时候,您的脚本也可以显式的提交或终止一个事务,如向文件写数据失败时。

提交或终止脚本

因为 Transaction Server 跟踪事务处理,所以它决定事务是完全成功还是失败。脚本可以通过调用 ObjectContext.SetAbort 显式地声明终止一个事务。 例如,当一个事务在从一个组件收到错误消息、违反商业规范时(例如,帐户余额小于 0)或读写文件等非事务性操作失败时,脚本就需要终止该事务。如果页在事务完成之前超时,也必须终止事务。

编写事务事件

脚本本身不能决定事务是成功还是失败。但是,可以编写提交或终止事务时被调用的事件。例如,假设有一个确认银行帐户的脚本,并且您需要针对事务的不同状态将不同的页返回给用户,那么就可以使用 OnTransactionCommit 和 OnTransactionAbort 事件来编写对用户的不同响应。

<%@ TRANSACTION = Required %>

<%

'Buffer output so that different pages can be displayed.

Response.Buffer = True

%>

<HTML>

<BODY>

<H1>Welcome to the online banking service</H1>

<%

Set BankAction = Server.CreateObject("MyExample.BankComponent")

BankAction.Deposit(Request("AcctNum"))

%>

<P>Thank you. Your transaction is being processed.</P>

</BODY>

</HTML>

<%

' Display this page if the transaction succeeds.

Sub OnTransactionCommit()

Response.Write "<HTML>"

Response.Write "<BODY>"

Response.Write "Thank you. Your account has been credited."

Response.Write "</BODY>"

Response.Write "</HTML>"

Response.Flush()

end sub

%>

<%

' Display this page if the transaction fails.

Sub OnTransactionAbort()

Response.Clear()

Response.Write "<HTML>"

Response.Write "<BODY>"

Response.Write "We are unable to complete your transaction."

Response.Write "</BODY>"

Response.Write "</HTML>"

Response.Flush()

End sub

%>

在 MTS 资源管理器中登记一个组件

为了参与一个事务,组件必须在 MTS 包中登记,而且必须被配置为需要事务。例如,如果您的脚本是通过调用两个组件来处理订单的,一个更新库存数据库,另一个更新付款数据库。那么,这两个组件就要在同一个事务环境中运行。Transaction Server 保证如果任意一个组件失败,那么将不会有数据库被更新。某些组件不需要事务;例如,Ad Rotator 组件。

注册和配置事务性组件可使用 MTS 资源管理器。必须将事务的属性设置为需要事务或需要新事务。事务组件必须在 MTS 包中注册。不要将组件放在 IIS 内部进程包中,而应该创建自己的包。通常,应将所有的组件放在一个组件库中。组件库的组件可被多个 ASP 应用程序使用并以 ASP 应用程序进程运行。使用 MTS 资源管理器可创建新的包并将包的 Activation 属性设置为 Library。

也可以在 Server 包中注册事务性组件。Server 包通常以服务器上的一个独立的进程运行。如果希望使用基于职能组的安全性检查或希望您的组件可被远程计算机上的应用程序访问,可对事务性组件使用 Server 包。

要使用 MTS 资源管理器,必须安装 Microsoft Transaction Server。有关注册组件和选择包类型的详细信息,请参阅 创建 MTS 包。

对象作用域

一般情况下,不要将从 MTS 组件中创建的对象存储在 ASP Application 或 Session 对象中。 MTS 对象在事务完成后消失。因为 Session 对象和 Application 对象是为在不同 ASP 页之间使用的对象实例设计的,所以不要用它们保存在事务结束时即被释放的对象。

ASP 脚本是已声名的事务的根,即起始点。任何事务性 ASP 页所使用的 MTS 对象都被认为是事务的一部分。当事务完成后,在页中使用的 MTS 对象将消失,其中包括存储在 Session 或 Application 对象中的对象。在此之后,从另一个事务性页中调用会话作用域或应用程序作用域对象的尝试都将失败。

事务排队

从一个远程服务器对数据库的更新可能因为网络延迟或故障而导致事务延迟或终止。因为事务的所有部分都必须提交,所以应用程序将可能挂起,等待远程服务器的提交或终止消息,也可能由于无法发送数据库更新而导致事务被放弃。

对于必须同时完成的更新,正确的做法是在事务的所有参与者都能够提交之前,终止事务或推迟完成事务。例如,航空公司的定票程序应该同时完成对客户的银行帐号计入借方和对航空公司的银行帐户计入贷方。如果一个更新属于事务整体的一部分,但可能晚于其他更新,您可能不希望让客户等待整个更新过程的完成。例如,机票预定事务可能也要向食品供应商发送食品订单或更新客户的旅程津贴。这些操作虽然也必须完成,但可以晚一些。

Microsoft Message Queue Server 使您能够将一个或一组更新捆绑到一个事务性消息中送给远程服务器。Message Queue Server 保证更新将被发送给远程服务器,即使目前网络不可用。您的应用将收到一个提交消息,从而可以继续处理事务。

有关在 ASP 应用程序中使用消息队列的示例,请参阅 开发人员范例。要查看这些示例,必须安装 SDK 文档。

有关 Microsoft Message Queue Server 的详细信息,请参阅 Microsoft Message Queue Server。

--------------------------------------------------------------------------------

模块 1:创建 ASP 页

请选择本课的脚本语言

在本模块中,通过创建自己的 ASP 页(.asp 文件),您将学习一些 ASP 的基本知识。在这些课程中用到的示例文件,可以在 localhost Web 服务器的 Tutorial 目录 (C:"WINNT"Help"iis"htm"tutorial) 中找到。请将您创建的文件也保存到 Tutorial 目录中。

要点 要保存并查看您在本模块中的工作结果,必须在 localhost Web 服务器上对 /iishelp/iis/htm/tutorial 虚拟目录具有“写 (Write)”和“改编 Web 服务器 (Script Web server)”权限,当然必须已经安装了 Active Server Pages。详细信息,请参阅 设置 Web 服务器权限。

原标题:维护ASP应用程序的安全

关键词:ASP

ASP
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流