在本章中,我们将解释如何在输入、传输和存储过程中安全地处理用户数据。这将允许我们以端到端的方式,在网站与用户之间进行安全的事务处理。
在本章中,我们将主要介绍以下内容:
■提供安全事务处理
■使用Secure Sockets Layer(SSL,加密套接字层)
■提供安全存储
■确定是否需要存储信用卡号码
■在PHP中使用加密技术
18.1 提供安全的事务处理
实际上,在使用Internet的过程中,提供安全的事务处理就是这样的问题:检查系统中信息的流动,确保在每一点的信息都是安全的。在网络安全问题中,没有绝对的安全。没有系统在过去或将来都无法入侵。对于安全来说,我们的意思是保护一个系统或者一次传输所付出的努力与涉及的信息的价值相比较而言的。
如果要有效地在安全方面付出正确的努力,需要在系统各个部分检查信息流。一个典型应用程序的用户信息流如图18-1所示,该程序使用PHP和MySQL编写。
图 18-1 一个典型Web应用程序环境的元素将用来存储与处理用户信息出现在每个系统中的每个事务处理的细节各不相同,这取决于系统设计和用户数据以及触发事务的行为。我们可以用类似的方法检查所有这些细节。Web应用程序与用户之间的每个事务都是以用户使用浏览器经由Internet向Web服务器发送请求为开始的。如果被请求页面是一个PHP脚本,Web服务器会将该页委托给PHP引擎处理。
该PHP脚本可能要读写磁盘数据。它也可以使用include或require来包含其他PHP或HTML文件。它还可以向MySQL后台发送SQL查询并接收响应。MySQL引擎负责读写引擎所需处理的磁盘数据。
该系统由3个主要部分组成:
■用户机器
■Internet
■我们的系统
接下来,我们将分别讨论每个部分的安全问题,显然,在很大程度上,用户机器和Internet的安全将超出控制范围。
18.1.1 用户机器
从我们的角度出发,用户机器正在运行一个Web浏览器。我们无法控制其他一些因素,例如,该机器配置的安全程度。需要记住的是,这台机器可能是非常不安全的,或者甚至是图书馆、学校或咖啡厅中的一台共享终端。
如今,人们可以使用许多不同浏览器,而每个浏览器都有各自不同的功能。如果只考虑目前最流行的两种浏览器最新版本,它们之间的大多数差异只会影响HTML的显示方式,但是,我们还需要考虑一些安全问题或功能问题。
我们应该注意到,如果考虑到安全或隐私风险,一些人将不会使用一些有用的特性,例如,Java、cookies或JavaScript。如果使用这些特性,就必须对一些情况进行测试,例如,对于不使用这些特性的用户来说,是否会降低应用程序性能,或者,考虑提供一种要求特性更少,但界面更丰富的应用程序以允许这些人的访问。
美国和加拿大以外的用户使用的Web浏览器可能只支持40位加密。尽管在2000年1月,美国政府已经对法律进行了修改,允许出口功能强大的加密技术(到非禁止国家),支持128位加密的Web浏览器对大多数用户来说也已经可以使用,但一些旧版本的浏览器仍将不会升级。除非在网站的文本中向用户保证了安全性,否则对于一个Web开发人员来说,它并不会引起重视。SSL将自动使服务器和用户浏览器以它们都知道的最安全级别进行通信。
我们不能保证一个正在连接站点的Web浏览器是否正在通过我们所希望的接口进行交互。
网站的请求可能来自另一个网站,它可能企图窃取我们网站的图片或者内容,或者来自一个使用类似于cURL软件的人,该软件可以成功地绕过安全措施。
cURL软件库可以用于模拟浏览器连接,要了解其详细内容,请参阅第20章。该软件库对开发人员来说非常有意义,但是,它也有可能被怀有恶意的人所使用。
虽然我们不能改变或控制用户的机器配置,但是一定要牢牢记住这点。用户机器的可变性可能是决定我们所提供的功能能够发挥多大作用的一个重要因素,这些功能包括我们通过服务器端脚本(例如,PHP)提供的功能,以及客户端脚本(例如,JavaScript)提供的功能。
PHP提供的功能能够与每个用户的浏览器兼容,因为最终结果通常都是HTML页面。使用的任何东西,除了基本的JavaScript之外,就要考虑不同浏览器版本的兼容性了。
从安全的角度来看,使用服务器端脚本来处理一些事情,例如数据验证,还是比较好的,因为这样,用户就无法看到我们的源代码。如果在JavaScript中验证数据,用户能够看到代码,并且可能绕过这些代码。
需要保留的数据可以作为文件或者数据库记录保存到服务器中,也可以作为cookies保存到用户的机器中。要了解如何使用cookies保存一些有限的数据(例如,会话密钥),请参阅第23章的详细介绍。
我们保存的大部分数据应该在服务器上或者数据库中。当然,也有许多好的理由要将小信息尽可能地保存在用户的机器中。如果信息在系统之外,那么我们将无法控制这些信息存储的安全性,也不能确认用户是否已经删除了它,甚至不能阻止用户修改它,从而使系统产生混淆。