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请求都不会受到保护。