3.4 Web服务器技术

Web服务器技术主要包括服务器、CGI、Servlet、PHP、ASP、ASP.NET和JSP技术。服务器包括服务器操作系统的选择和Web服务器的选择,前面已经介绍,在此不再赘述。

3.4.1 PHP

PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl及PHP自创的语法,利于学习,使用广泛,主要适用于Web开发领域。

根据动态网站要求,PHP语言作为一种语言程序,其专用性逐渐在应用过程中显现,其技术水平的优劣与否将直接影响网站的运行效率。其特点是具有公开的源代码,在程序设计上与通用型语言(如C语言)相似性较高,因此在操作过程中简单易懂,可操作性强。同时,PHP语言具有较高的数据传送处理水平和输出水平,可以广泛应用在Windows系统及各类Web服务器中。

PHP可以与很多主流的数据库建立起连接,如MySQL、ODBC和Oracle等,PHP是利用编译的不同函数与这些数据库建立起连接的,PHPLIB就是常用的为一般事务提供的基库。在PHP语言的使用中,可以分别使用面向过程和面向对象,而且可以将PHP面向过程和面向对象两者一起混用,这是其他很多编程语言做不到的。

PHP安全加固主要涉及以下几个方面。

(1)关闭全局变量

如果开启全局变量会使一些表单提交的数据被自动注册为全局变量,代码如下:

如果开启了全局变量,则服务器端PHP脚本可以用$username和$password来获取用户名和密码,这会造成极大的脚本注入危险。

开启方法是在php.ini中作如下修改:

建议将其关闭,参数如下:

当全局变量关闭后,就只能从$_POST、$_GET和$_REQUEST中获取相关参数。

(2)文件系统限制

可以通过open_basedir来限制PHP可以访问的系统目录。

如果不限制,使用下面的脚本代码(hack.php)可以获取系统密码。

如果设置了限制,则会报如下错误,让系统目录不会被非法访问。

设置文件系统限制的方法如下:

(3)屏蔽PHP错误输出

在/etc/php.ini(默认配置文件位置)中将如下配置值修改为Off:

不要将错误堆栈信息直接输出到网页上,防止黑客利用相关信息。

(4)屏蔽PHP版本

默认情况下PHP版本会显示在返回头中,如:

将php.ini中如下的配置值修改为Off:

(5)打开PHP的安全模式

PHP的安全模式是非常重要的内嵌的安全机制,能够控制一些PHP中的函数,如system()。同时把很多文件操作函数进行了权限控制,也不允许某些包含关键字的文件,如/etc/passwd,但是默认的php.ini是没有打开安全模式的,打开方法如下:

(6)打开magic_quotes_gpc来防止SQL注入

SQL注入是非常危险的,会使网站后台被入侵,甚至整个服务器沦陷,所以一定要小心。php.ini中有一项设置如下:

此项默认是关闭的,如果将其打开则自动把用户提交对SQL的查询进行转换,如把'转为\'等,这对防止SQL注入有很大作用,推荐设置为:

3.4.2 JSP

JSP即Java Server Pages,是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其他Java程序共同处理复杂的业务需求。

JSP将Java代码和特定变动内容嵌入静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码编写的Servlet,然后由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

JSP安全中出现的源代码暴露、远程程序执行等问题,主要通过在服务器软件网站下载安装最新的补丁来解决。

3.4.3 ASP/ASP.NET

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的Web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML网页文件中的服务器端的脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和COM组件调用。

ASP简单、易于维护,是小型页面应用程序的选择,在使用分布式组件对象模型(Distributed Component Object Model,DCOM)和微软事务处理服务器(Microsoft Transaction Server,MTS)的情况下,ASP甚至可以实现中等规模的企业应用程序。

ASP.NET又称为ASP+,不仅是ASP的简单升级,还是微软公司推出的新一代脚本语言。ASP.NET基于.NET Framework的Web开发平台,不但吸收了ASP以前版本的最大优点并参照Java、VB语言的开发优势加入了许多新的特色,同时也修正了之前的ASP版本的运行错误。

ASP.NET具备开发网站应用程序的一切解决方案,包括验证、缓存、状态管理、调试和部署等全部功能。在代码撰写方面的特色是将页面逻辑和业务逻辑分开,它分离程序代码与显示的内容,让丰富多彩的网页更容易撰写。同时使程序代码看起来更洁净、更简单。

ASP/ASP.NET安全加固主要涉及以下几个方面。

1)保护Windows的设置包括使用NTFS格式,选择安全的口令,重新设置管理员账户、重新命名或重新建立,删除不必要的共享和设置ACL等。

2)设置Windows安全性,使用微软提供的模板。

3)在ASP.NET的web.config中使用URL授权,可以允许或拒绝。

4)ASP.NET账户默认该用户只拥有本地USERS组的权限。

3.4.4 CGI

公共网关接口(Common Gateway Interface,CGI)是Web服务器运行时外部程序的规范,按CGI编写的程序可以扩展服务器功能。CGI应用程序能与浏览器进行交互,还可通过数据API与数据库服务器等外部数据源进行通信,从数据库服务器中获取数据,格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。几乎所有服务器都支持CGI,可用任何语言编写CGI,包括C、C++、Java、VB和Delphi等。CGI分为标准CGI和间接CGI两种。标准CGI使用命令行参数或环境变量表示服务器的详细请求,服务器与浏览器通信采用标准输入、输出方式。间接CGI又称缓冲CGI,在CGI程序和CGI接口之间插入一个缓冲程序,缓冲程序与CGI接口间用标准输入、输出进行通信。

CGI安全加固主要涉及以下几个方面。

● 使用最新版本的Web服务器,安装最新的补丁程序,正确配置服务器。

● 按照帮助文件正确安装CGI程序,删除不必要的安装文件和临时文件。

● 使用C语言编写CGI程序时,使用安全的函数。

● 使用安全有效的验证用户身份的方法。

● 验证用户的来源,防止用户短时间内过多动作。

● 注意处理好意外情况。

● 实现功能时制定安全合理的策略。

● 培养良好的编程习惯。

● 科学严谨的治学态度,避免“想当然”的错误。

3.4.5 Servlet

Servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。一般情况下,人们按广义的Servlet来理解其定义。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP的Web服务器。

服务器上需要一些根据用户输入访问数据库的程序,这些程序通常是使用CGI应用程序完成的。若要在服务器上运行Java,这些程序可使用Java编程语言实现。在通信量大的服务器上,JavaServlet的优点是它们的执行速度快于CGI程序,各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。

Servlet安全加固主要涉及以下几个方面。

一般来说,Servlet会部署到Internet上,因此需要考虑安全性。可以制定Servlet的安全模式,如角色、访问控制和鉴权等,这些可以用annotation或web.xml进行配置。

@ServletSecurity定义了安全约束,它可以添加在Servlet实现类上,这样对Servlet中的所有方法都生效,也可以单独添加在某个doXXX方法上,这样只针对此方法有效。容器会强制调整doXXX方法被指定角色的用户调用。

Java代码举例:

在上面的代码段中,@HttpMethodConstraint定义了doGet方法只能被角色为R2的用户调用,doPost方法只能被角色为R3或R4的用户调用。@HttpConstraint定义了其他的所有方法都能被角色为R1的用户调用。角色与用户映射容器的角色和用户。

安全约束也可以使用web.xml中的<security-constraint>元素来定义。在此元素中,使用<web-resource-collection>元素来指定HTTP操作和Web资源,元素<auth-constraint>用来指定可以访问资源的角色,<user-data-constraint>元素中使用<transport-guarantee>元素来指定客户端和服务器端的数据应该怎样被保护。

xml代码举例:

上面这段部署描述符表示:在/account/* URL上使用GET请求会受到保护,访问的用户必须是manager角色,并且需要保证数据的完整性。所有GET之外的其他HTTP请求都不会受到保护。