安全矩阵

 找回密码
 立即注册
搜索
查看: 4321|回复: 0

PHP项目安全浅析

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-8-1 21:41:02 | 显示全部楼层 |阅读模式
原文链接:PHP项目安全浅析
PHP被称为全世界最好用的Web开发语言之一,其独特的语法混合了C、Java、Perl以及PHP自创的语法。因在研发业务逻辑上简单易用,PHP已成为一种广受欢迎的脚本语言,尤其适用于Web开发,其程序还可通过C和C++进行扩展,支持几乎所有流行的数据库及操作系统。PHP简单易用,学习门槛低,但在其快速发展的同时安全问题也日益突出,所出现的问题亦不可小觑。

1、PHP项目安全形势不容乐观

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




Exploit-db是面向全世界的一个漏洞平台,该平台通过收集和公布漏洞来督促研发人员对系统漏洞进行修复,图2是对历史漏洞所用的开发语言进行归类的统计结果。从图中可以看出,90%的Web平台漏洞所使用的




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


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

2、PHP项目安全问题产生的原因

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



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

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





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


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

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

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

(1)不可信原则


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

1)检查所有的输入

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

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

2)检查所有的输出

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

3)数据在传输过程中的安全

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

(2)最小化原则

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

1)权限最小化

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

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

2)暴露最小化

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

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

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

为了降低对敏感数据的暴露率,需要确认什么数据是敏感的,同时跟踪它,并消除所有不必要的数据暴露。


(3)简单就是美

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



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

1)易读易维护

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

2)系统安全有保障

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

3)性能扩展性强

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

(4)组件的安全

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

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

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

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

对于此类威胁,研发人员应该时刻关注官方发布的最新补丁,及时升级所用的应用软件,以免恶意攻击者有可乘之机。

在攻防严重不对等的今天,不能只依赖基础安全设备和框架来避免所有的安全威胁,每个研发人员都应具备安全研发的能力,以从根本上解决安全问题,避免产生安全问题。无论是在研发过程中还是在生产环境中都要遵守安全原则。






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:38 , Processed in 0.013107 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表