PHP安全之道——项目安全的架构、技术与实践(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-05 11:23:38

点击下载

作者:栾涛

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

PHP安全之道——项目安全的架构、技术与实践

PHP安全之道——项目安全的架构、技术与实践试读:

前言

作为资深的PHP“码农”,多年来无论面对多么复杂的项目,我总是能带领研发团队顺利攻破难关,满足各种需求,甚至超出预期。但是无论多么努力,总是会出现各种安全问题,我自己也一直被安全问题所困扰。因此,我一直在寻觅面向研发人员的项目安全类图书,但是不尽如人意。市场上针对各种漏洞进行挖掘的图书应有尽有,所面向的读者大都是白帽子、信息安全人员,提供给研发人员,帮助其对系统进行加固、防止漏洞产生的安全类图书却很少。

安全无小事,企业系统应根据自己的业务特点,建立安全红线,特别是在涉及人身、资金、敏感信息等方面,需要在效率、增长、系统性能做出取舍的情况下,确保把安全放在第一位。

如果一个企业连基本的人身、资金、敏感信息等方面的安全都不重视,那么一旦出现问题,就会给企业造成致命的伤害。如果漏洞被攻击者发现并利用,造成的人身损害、企业名誉损失、资金损失、信息损失等基本上是无法弥补的。

在网络安全问题日益突出的今天,必须对网站系统的安全加以重视。只要加以重视,大部分安全问题就可以在系统的研发阶段消灭掉。然而,大多数研发人员只注重代码功能的实现,没有考虑到业务的安全问题,也没有考虑到编码的安全问题,这将给企业和互联网带来严重的安全隐患。

因一个很好的机遇,我加入了奇虎360企业,非常幸运地和很多安全专家一起共事,这使我对安全有了新的认知,同时也丰富了我的安全知识。在不断学习中,我将研发项目时积累的经验记录下来汇成此书,希望能给PHP研发人员提供帮助。│本书的定位│

本书面向的读者是PHP研发人员。经统计,90%的安全问题是由于研发人员缺乏安全意识造成的。本书阐述了一些漏洞的产生原理及防范措施,希望可以帮助PHP研发人员提高安全意识。本书不是为了让研发人员去做一个白帽子或者攻击者,而是为了更好地帮助研发人员进行系统的安全加固,在项目的研发过程中重视项目安全,合理编码,从根本上解决PHP项目的安全问题。│致谢│

能认识欧总(欧怀谷)是我的荣幸,感谢欧总在工作上对我的悉心指导,并将多个Web安全业务交给我负责,这对我经验的积累以及编写此书起着决定性作用。非常感谢欧总在百忙之中为本书题写序言。栾涛名词解释

│漏洞│指一个系统存在的弱点或缺陷,可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误,也可能来自业务在交互处理过程中的设计缺陷或逻辑流程上的不合理之处。

漏洞可能被有意或无意地利用,从而对一个组织的资产或运行造成不利影响,如信息系统被攻击或控制、重要资料被窃取、用户数据被篡改、系统被作为入侵其他主机系统的跳板。

│白帽子│也称为白帽黑客,指能够识别计算机系统或网络系统中安全漏洞的安全技术专家,但他们并不会恶意利用漏洞,而是提交给企业,帮助企业在被其他人恶意利用之前修补漏洞,以维护计算机和互联网安全。

│攻击者│本书中统一将针对缺陷实施攻击的人称为攻击者。这里的缺陷,包括软件缺陷、硬件缺陷、网络协议缺陷、管理缺陷和人为失误。第1章 PHP项目安全概述

PHP被称为全世界最好用的Web开发语言之一,其独特的语法混合了C、Java、Perl以及PHP自创的语法。因在研发业务逻辑上简单易用,PHP已成为一种广受欢迎的脚本语言,尤其适用于Web开发,其程序还可通过C和C++进行扩展,支持几乎所有流行的数据库及操作系统。PHP简单易用,学习门槛低,但在其快速发展的同时安全问题也日益突出,所出现的问题亦不可小觑。1.1 PHP项目安全形势不容乐观

W3Techs是一个提供各种技术在Web上使用信息统计的平台,图1-1所示是2018年在Web服务端使用动态开发语言的统计数据。从统计结果可以看出,PHP占比达到82%。其次是ASP.NET和Java。图1-1 由W3Techs统计的Web服务端所用动态开发语言的占比情况

Exploit-db是面向全世界的一个漏洞平台,该平台通过收集和公布漏洞来督促研发人员对系统漏洞进行修复,图1-2是对历史漏洞所用的开发语言进行归类的统计结果。从图中可以看出,90%的Web平台漏洞所使用的开发语言是PHP。通过图1-1和图1-2的对比,很容易得出一个结论:PHP应用得多,由其导致的漏洞也最多。图1-2 由Exploit-db统计的各Web平台漏洞对应的开发语言分布情况

图1-3是美国国家漏洞库(National Vulnerability Database,NVD)所做的从2008年到2017年的历年常见漏洞类型的统计数据图。从该统计数据图上可以看出,近几年来随着研发框架安全性的不断提高,SQL注入有了明显的改善,但是SQL注入问题依然没有彻底解决;认证问题、跨站点脚本(XSS)、信息泄露/信息披露等漏洞几乎没有改善。图1-3 由NVD所做的历年常见漏洞类型的统计数据变化情况

PHP通常用来开发Web应用。对于Web应用来说,传统的Web网[1][2][3]络层的防护手段,如防火墙、入侵检测系统、入侵防御系统等,无法阻止或检测到Web应用层的攻击。攻击者一旦发现Web漏洞就可以穿透网络层,直接对后面的业务层数据库、文件系统、服务器发起攻击,毁坏或窃取企业数据。1.2 PHP项目安全问题产生的原因

研发人员的关注点如图1-4所示,Web设计者或研发人员考虑更多的是如何满足用户应用,如何更好地实现业务。如果研发人员未经过安全编码培训,则很少考虑网站应用研发过程中所存在的漏洞。多数网站设计研发人员、网站维护人员对网站攻防技术的了解甚少,这些漏洞在不关注安全代码设计的人员眼里几乎不可见。图1-4 研发人员的关注点

随着业务复杂度的提升,在系统研发过程中,PHP应用程序代码量大,研发人员多,难免会出现疏漏。即使漏洞被修复,由于很多业务系统迭代速度快、升级频繁,人员经常变更,也会导致代码不一致,已修复的漏洞可能又出现在新代码中。同时在很多情况下同一台服务器会运行多个Web系统,即使保证了自己研发的系统没有安全漏洞,但也无法避免系统被感染。

普通用户的关注点如图1-5所示,在正常使用过程中,即便存在安全漏洞,正常的使用者也不会察觉。但由于关注点不同,多数研发人员只注重业务逻辑功能的实现,对安全编码没有足够的认识,网站安全代码设计方面了解甚少,即使发现网站安全存在问题和漏洞,其修复方式只是停留在页面修复,很难针对网站具体的漏洞原理对源代码进行改造。图1-5 用户的关注点

恶意攻击者的关注点如图1-6所示,攻击者关注的是应用中是否可以输入恶意攻击字符,是否有逻辑缺陷可利用以绕过或者打破系统[4]的信任边界,伪装成被信任用户,窃取或劫持正常用户,获取敏感信息。图1-6 攻击者的关注点

研发人员、用户、攻击者的考虑和关注角度不同。单个系统的设计和研发人员总是数量有限的少数群体,具体功能可能只有几个人负责,甚至一个人同时研发多个系统,安全知识范围有限,由于系统暴露于公共网络中,与庞大的恶意攻击群体相比形成了攻防的严重不对等,如图1-7所示。图1-7 攻防对比悬殊

由于攻击者更多的是关注系统的弱点,在非正常状态下使用系统且不关心业务功能逻辑,因此在很多场景中,只要攻击者找到一个系统漏洞,整个系统就将遭到攻击或被攻击者利用去攻击其他系统。1.3 PHP项目安全原则

存在如此多的安全漏洞,信息随时具有泄漏的风险,因此不得不将安全问题重视起来。如何避免系统被攻击,如何减少漏洞的数量,以及如何修复漏洞,可以从以下几个方面入手。1.3.1 不可信原则

对Web系统来讲,访问系统的用户几乎都是不被信任的,他们当中隐藏着攻击者。研发人员应该时刻保持警惕性,对所有用户的输入和输出进行检查。一│检查所有的输入

合法的输入才可以进入流程,这样才能最大限度地保证程序的安全。一般情况下,需要检查的输入内容包括URL、GET、POST、Cookie、Referer、User-Agent等,当用户提交数据时需要根据字段本身的性质进行检查,检查数据长度、范围、格式、类型是否正确,如邮编必须为六位数字、身份证号码必须符合身份证号码的编码规则等。当发现非法数据时,应该立即阻断响应,而不是修复数据,防止发生二次污染或者遭到攻击。

为了进一步提高网站的安全性,应该采用前后端数据检查相结合的方法来完成程序对输入数据的检查,避免只在前端通过客户端脚本完成数据检查的做法,因为攻击者很容易绕过客户端检查程序,如SQL注入攻击等。需要尽量规范用户可以输入的内容,除了限制并过滤输入的非法信息外,还要严禁上传非法文件,防止发生越权、命令执行等漏洞。二│检查所有的输出

要保障输出数据的合法性,防止输出数据夹杂用户的自定义数据。警惕所有输出数据,所有数据都有被篡改的可能性。特别要注意的是防止邮件内容的输出、短信内容的输出,因为这些输出容易被恶意攻击者利用为钓鱼攻击、非法广告宣传等;防止输出内容中夹杂用户可控的HTML、JavaScript数据,因为攻击者可以通过这些数据控制页面内容、窃取服务器以及用户信息。三│数据在传输过程中的安全

为了防止传递到服务端和从服务端回传的数据被监听截获以及被篡改,通常的做法是为数据添加时效性,或者将数据进行加密处理,采用合理的方式来保障数据的安全传输。1.3.2 最小化原则

研发人员在PHP项目中要对用户的每一次访问、每一次数据操作[5]都进行身份认证。确认当前用户的真实身份后,将用户的可见范围控制在允许的最小范围,并去访问用户所拥有的权限和数据。一│权限最小化

研发人员总是希望用户访问应该访问的页面,不希望用户跳出网站程序的限制,访问到别人的数据,或者直接查看数据库,甚至控制服务器。只授予用户必要的权限,避免过度授权,可以有效地降低系统、网络、应用、数据库被非法访问的概率。

对于服务器目录的权限也应该做出规定。比如,存放上传文件的目录,在绝大多数情况下是不应该有执行权限的,应防止用户通过可执行程序获取服务器权限等。二│暴露最小化

应用程序需要与外部数据源进行频繁通信,主要的外部数据源是客户端浏览器和数据库。如果你正确地跟踪数据,就可以确定哪些数据被暴露了。公共网络是最主要的暴露源之一,需要时刻小心防止数据被暴露在Web系统上。

数据暴露不一定就意味着安全风险,但数据暴露要尽量最小化。例如,一个用户进入支付系统,在向你的服务器传输他的信用卡数据时,要防止在传输过程中被窃取,你应该用安全套接层(Secure Sockets Layer,SSL)对它加以保护。如果你要在一个确认页面上显示他的信用卡号,由于该卡号信息是由服务端发向他的客户端的,因此你同样要用SSL去保护它。

在上述例子中,显示信用卡号显然加大了暴露的概率。SSL确实可以降低风险,但是比较好的解决方案是通过只显示最后4位数来达到降低风险的目的。

为了降低对敏感数据的暴露率,需要确认什么数据是敏感的,同时跟踪它,并消除所有不必要的数据暴露。在本书中,将会展示一些技巧,以保护一些常见的敏感数据。1.3.3 简单就是美

PHP之所以流行,就是因为它较其他语言来说简单易懂。研发一个功能正常的系统,需要做到项目易读易维护、系统安全有保障、性能扩展性强,这几个关键要素形成了项目金字塔,如图1-8所示。图1-8 项目金字塔

功能正常、保障系统可用、业务流程完整,是对一个系统的基本要求。如果一个系统可读性特别差,维护难度高,很容易引起功能异常,项目交付时间会不断被拉长,即使暂时交付,隐藏的问题在后期也会不断地暴露出来,影响用户的正常使用。一│易读易维护

做一个项目,在保证它能正常满足需求的情况下,易读易维护是第一位,而复杂不仅会滋生错误,而且很容易导致安全漏洞,使得业务功能、系统安全、性能优化无从下手。研发过程中,代码上使用清晰的流程结构,保持逻辑清晰,可以在一定程度上避免安全问题的发生。二│系统安全有保障

在项目易读易维护、基本功能正常的前提下,再来考虑系统的安全性,对系统进行加固。安全漏洞的存在,轻则功能异常,重则系统崩溃,更有甚者导致数据全部泄露,给用户和企业造成无法挽回的损失。三│性能扩展性强

一个完美的项目,离不开可靠的性能和良好的扩展性。性能与扩展性依赖于项目的易读易维护性,反之,系统性能优化和扩展将无法进行。随着系统业务量和功能的不断增加,原有的性能和扩展性差的项目将被废弃,企业将不得不重新进行规划和投入更高的研发成本。1.3.4 组件的安全

为了使网站功能更为强大,可以使用组件,组件在带来强大功能的同时也会带来安全隐患。对于内置组件的使用,应当有明确的使用范围;对于自己注册的组件,必须认真考虑组件的效率和是否有漏洞;[6]对于第三方组件,要明确来源,检测是否有后门程序。

如PHP本身的图片处理功能比较弱,通常通过借助第三方组件ImageMagick来加强PHP的图像处理能力。ImageMagick是一个功能强大的开源图形处理软件,可以用来处理的图片格式超过90种,包括流行的JPEG、GIF、PNG、PDF以及PhotoCD等,它可以对图片进行切割、旋转、组合等多种特效处理。

由于功能强大、性能较好,并且对很多语言有拓展支持,因此在程序研发中ImageMagick被广泛使用,比如生成用户头像,编辑图片等。

2016年5月,ImageMagick被曝出命令执行漏洞,虽然危害不是太大,但是由于大量的Web程序使用了其拓展功能,导致这些本地命令执行漏洞在Web环境里可以被远程触发,变成了危害巨大的远程命令执行。

对于此类威胁,研发人员应该时刻关注官方发布的最新补丁,及时升级所用的应用软件,以免恶意攻击者有可乘之机。扩展阅读除了编码安全之外,网络操作系统、Web服务器系统及数据库系统本身也会存在安全漏洞。2014年4月7日,互联网安全协议OpenSSL被曝存在一个十分严重的安全漏洞。这个漏洞被命名为心脏出血(Heartbleed),即服务器内核出现了致命内伤。利用该漏洞,攻击者可以获取约30%的以HTTPS开头网址的用户登录账号和密码。国内知名网站几乎都出现问题,其中包括购物、网银、社交、门户等类型网站。OpenSSL在漏洞公布当天发布了修复版本,在短时间内比较大的网站基本修复了。要防止此类漏洞,一定要关注权威机构发布的最新漏洞舆情信息,一定要定时升级,并在发现漏洞时及时更新安全补丁。更多的组件漏洞,可查阅本书“附录1 PHP各版本漏洞”。1.4 小结

本章归纳总结了PHP目前的安全状况,呼吁研发人员在研发过程中重视安全问题。

本章探讨了PHP项目安全问题在大环境下所面临的严峻挑战。在攻防严重不对等的今天,不能只依赖基础安全设备和框架来避免所有的安全威胁,每个研发人员都应具备安全研发的能力,以从根本上解决安全问题,避免产生安全问题。同时本章提出了对项目安全开发的要求,无论是在研发过程中还是在生产环境中都要遵守安全原则。注释[1] 防火墙是一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通信时执行的一种访问控制尺度,它能允许经内部网“许可”的人和数据进入网络,同时将经内部网“不许可”的人和数据拒之门外,从而最大限度地阻止网络攻击者访问内网络。[2] 入侵检测系统(Intrusion Detection System,IDS)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。与其他网络安全设备的不同之处在于,IDS是一种积极主动的安全防护技术。[3] 入侵防御系统(Intrusion Prevention System,IPS)是计算机网络安全设施,是对防病毒软件(Antivirus Programs)和防火墙(Packet Filter, Application Gateway)的补充,能够监视网络或网络设备的网络资料传输行为,并能即时中断、调整或隔离一些不正常或者具有伤害性的网络资料传输行为。[4] 信任边界通常指系统防火墙或应用中的鉴权系统、浏览器的跨域限制等。[5] 身份验证又称“验证”“鉴权”,是指通过一定的手段完成对用户身份的确认。[6] 后门程序一般是指那些绕过安全性控制而获取对程序或系统访问权的程序方法。在软件的研发阶段,程序员常常会在软件内创建后门程序以便可以修改程序设计中的缺陷。但是,如果这些后门被其他人知道,或是在软件发布之前没有被删除,就会成为安全风险,容易被恶意攻击者当成漏洞进行攻击。第2章 PHP项目安全基础

经历多年的发展,PHP自身的安全机制也在不断完善,PHP环境部署完成后,通常还会进行一些安全设置。研发人员除熟悉各种PHP漏洞外,还可以通过修改PHP配置文件来加固PHP的运行环境。

当配置好PHP的Web运行环境后,通常需要修改配置来达到安全目的。在优化配置、增强性能的同时,正确地配置PHP可以避免很多[1]安全问题。修改PHP的配置,一般是修改php.ini文件。如果是Windows系统,一般在所安装的PHP目录中可以找到该文件;如果是Linux系统,一般在/etc/php配置路径下可以找到该文件。找到文件所在的位置并打开文件以后,修改对应的选项值,保存文件,然后重启Web运行环境,即可完成修改。

下面来逐一了解一些PHP相关的安全配置。2.1 信息屏蔽[2]

信息屏蔽可以有效地防止服务器信息泄露,避免被恶意攻击者获取服务器信息,为实行下一步攻击做准备。这些信息主要包括服务器信息上的操作系统更新、各种软件信息、PHP版本信息等。2.1.1 屏蔽PHP错误信息

PHP的错误日志控制项可以控制PHP是否将脚本执行的error、notice、warning日志打印出来。

错误提示信息在研发过程中可以用于辅助研发人员及时发现错误并且进行修复,其中包含了很多服务端的系统信息,但在生产环境中将错误提示信息显示出来是非常危险的。虽然系统在没有漏洞的正常情况下不会出现错误提示信息,但攻击者可能会通过提交非法的参数,诱导服务器进行报错,这样将把服务端的WebServer、数据库、PHP代码部署路径甚至是数据库连接、数据表等关键信息暴露出去。通过对错误信息进行收集和整理,攻击者可以掌握服务器的配置从而更为便利地实施攻击。

如图2-1所示,在配置文件中设置display_errors=On开启了PHP错误显示,在PHP程序遇到错误时,如下的错误信息会被打印在页面上。Notice:Undefined index:search in \home\web\php\index.php on line 3图2-1 开启PHP错误显示

这个提示信息暴露了程序和系统的路径,很容易被攻击者利用来了解服务器的目录结构。可以通过修改PHP配置文件将提示信息隐藏,配置文件通常在/etc/php.ini下,具体修改方式如下。;Default Value:On ;默认开启;Development Value:On ;研发环境开启;Production Value:Off ;生成环境关闭;http://php.net/display-errorserror_reporting = E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATEDdisplay_errors = Off ; 如果是生成环境, 这里应该设定为Off, 避免将错误提示信息展示给用户error_log=/var/log/php/error_log.log ;指定日志写入路径

在生产环境中,display_errors一般要设置为Off,不要暴露错误信息给用户;研发的时候,可以设置为On。最好的方式是将所有PHP的错误信息记录在日志中,以方便查看。2.1.2 防止版本号暴露[3]

2015年5月20日,PHP被爆出存在远程DoS漏洞。若攻击者利用该漏洞构造非法请求发起连接,容易导致目标主机CPU被迅速消耗,使服务器宕机,影响正常业务。

漏洞产生的原因是PHP在解析HTTP中的multipart/form-data格式数据时,会不断地重复复制字符串导致DoS。远程攻击者可以通过发送恶意构造的multipart/form-data请求,导致服务器CPU资源被耗尽,从而导致服务器无法响应正常请求。此漏洞涉及众多PHP版本,因而影响范围极大。

受该漏洞影响的PHP版本号如下。

·PHP 5.0.0—5.0.5

·PHP 5.1.0—5.1.6

·PHP 5.2.0—5.2.17

·PHP 5.3.0—5.3.29

·PHP 5.4.0—5.4.40

·PHP 5.5.0—5.5.24

·PHP 5.6.0—5.6.8[4]

这些版本的PHP很容易被攻击者进行DoS攻击。攻击者要利用该漏洞,首先要知道服务器上的PHP版本号。

在默认配置情况下,PHP版本号显示是开启状态,expose_php设置值为On,默认将PHP的版本号返回到HTTP请求的头部信息中,如图2-2所示。图2-2 PHP版本号显示开启

图2-3所示是一个HTTP请求返回的Response头部数据,HTTP头里返回服务端状态的信息。其中X-Powered-By:PHP/7.2.0的版本号暴露无遗,攻击者很容易捕获此信息。一旦该版本的PHP存在漏洞,攻击者很容易将其利用。图2-3 HTTP头中显示PHP版本

因此,建议在生产环境中隐藏PHP版本号,在PHP配置文件中查找expose_php,将值设置为Off,PHP的版本显示关闭,如图2-4所示。图2-4 在PHP配置中关闭PHP版本显示

隐藏PHP的版本号,可以避免攻击者进行批量扫描,防止服务器暴露,从而降低被攻击的风险。线上环境应该隐藏PHP版本号,通过修改PHP的配置文件,将expose_php的值设置为Off,如图2-5所示。图2-5 通过配置将PHP版本号隐藏

设置为Off后,PHP会将当前的PHP版本号进行隐藏,防止恶意攻击者通过定位PHP的版本号来利用PHP的固有漏洞。

更多关于PHP版本号的漏洞可参阅本书的附录。2.2 防止全局变量覆盖

在PHP全局变量功能开启的情况下,传递过来的数据会被直接注册为全局变量使用,如图2-6所示。在关闭的情况下,PHP会把接收到的数据存放在规定好的全局数组中。图2-6 PHP全局变量开启

图2-6中将register_globals设置为全局变量开启。接下来用下面的一段代码提交一个用户登录的表单,其中包含用户名和密码。

当register_globals=On时,程序可以直接使用$username和$password来接收值,同时用户也可以定义其他全局变量。

例如,register_globals配置选项打开之后,可导致下面代码中的$authorized变量被覆盖,无需认证用户名和密码就可以直接设置authorized的值为true,跳过认证进入登录状态,这会造成很大的安全隐患。

如图2-7所示,设置PHP配置文件中register_globals=Off,程序只能使用$_GET['username']、$_GET['password']或$_REQUEST['username']、$_ REQUEST ['password']来接收传递过来的值。

因此从系统安全角度出发,建议设置register_globals=Off,客户端所有提交到服务端的数据都应该通过PHP预定义内置的全局数组来获取。图2-7 关闭全局变量

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载