前面2节课全部都是之前写过的程序重新用PHP编程语言来实现。
这节课开始学习如何使用PHP结合HTML网页来实现具体的动态数据网页。
学哥计划做一个学生分数管理功能的网页,首先来做一个一览查询页面。
查询页面上可以输入一些查询条件,例如学生姓名或者科目等信息,点击查询按钮之后,下面显示相应的查询结果,查询结果使用表格的形式来显示。
PHP嵌入HTML的方式
前面几节课都是纯粹的PHP代码,然后通过php命令执行php文件代码的方式来运行PHP代码。
在这一章的第一节课里面,其实已经学习过将PHP代码嵌入HTML网页中的方式,来复习一下:
echo "Hello World";
?>
可以看到,虽然这个文件名最后保存为helloworld.php,但是其本质还是一个html规范格式文件,因为最终这个文件的内容是要显示在浏览器当中的,所以起本质仍然是一个html规范文件。
PHP代码的作用,仅仅是通过动态编程语言生成需要的数据或者是显示格式。
可以这样理解,PHP代码在服务器端运行,运行结束后的文件内容是HTML内容。这样的好处不言而喻,可以根据需求对每一个客户端浏览器生成完全不同的网站内容。
上面的代码,其实也可以完全用PHP代码来实现:
echo "";
echo "";
echo "Hello World";
echo "";
echo "";
?>
这段代码运行起来的结果,和上面的一段代码运行的结果是一模一样的。
这也就是说,在PHP代码里面,不在这组开始和结束标签里面的内容,其实就是默认相当于使用echo输出的方式返回给浏览器的。这也是PHP的一种默认的代码规范。
除了echo函数外,使用其他的标准输出函数,也是类似于echo一样,将输出内容返回到浏览器的。例如print函数、print_r函数、var_dump函数等等。只不过输出的内容如果不符合html规范的话,可能显示在浏览器里面就不是期望的样子了。
编写一览查询页面
创建2个文件studentlist.php文件和student.css文件。
参照之前的index.html和index.css样式,编写html文件和显示样式。
先通过div分成上下3个区域,最上面显示一个标题“学生信息查询”,然后下面2个div分别显示查询条件和查询按钮。
查询条件如下:姓名(文本输入)/性别(单选)/科目(多选)/分数段(下拉框选择)。
下面的区域显示查询一览结果,使用table显示,第一行是表头,显示下列数据:
ID/姓名/性别/科目/分数。
修改studentlist.php文件:
修改student.css文件:
将这2个文件部署到本地服务器的相应目录中,然后启动本地Web服务程序,然后通过浏览器访问这个php网页:
然后在下面一行的td里面编写显示查询一览结果的table。
显示下列数据:ID/姓名/性别/科目/分数。
第一行是表头,第二行是数据。表头和数据的显示样式可以不一样,以示区别。
修改studentlist.php文件:
修改student.css文件,新增下列代码:
刷新网页:
可以看到网页中显示了一个表格,内容是学生分数查询结果。
将数据行复制多行,并且让奇数行和偶数行显示不一样的底色,这样看起来更美观。
修改studentlist.php文件:
修改student.css文件,增加一个样式tdb:
刷新网页:
可以看到表格显示了多行数据,并且行之间有明显分隔。
使用PHP代码循环显示一个table的数据
通过编写静态html内容的方式,可以完成显示样式的编码。
然后将这里的多行显示内容修改为用PHP代码来动态生成。
首先将刚刚增加的4行数据行删除,只保留一行数据。
然后,在这个数据行的前面和后面分别增加PHP代码,将这行数据放入一个for循环当中,也就是让这行数据重复显示5次。
修改studentlist.php文件:
刷新网页:
可以看到,页面显示5行完全一模一样的数据。这就是PHP代码的威力。
如果要将5行变成100行,也只需要修改一个数字即可。而如果是纯粹的HTML代码,要重复100行的话,也要花很多时间进行复制粘贴。
如果要将奇数行和偶数行的显示变得不一样,可以这样修改:
首先设置一个用于显示样式是tda还是tdb的变量,名字为tds;
然后根据当前行是偶数行则赋予tds的值为tdb字符串;
然后在需要显示样式的地方,输出这个变量。这样循环当中,当变量$i变化时,对2求模的结果会是0或者1,也就是奇数还是偶数,这样变量tds的值就会变成tda或者tdb,最后输出的时候就会不一样了。
修改studentlist.php文件:
刷新网页:
如果要将这5行的ID和姓名显示的不一样,应该怎么处理呢?
一个简单的办法就是修改显示的内容为跟随当前循环变量来生成:
修改studentlist.php文件,同时调整代码的分行位置:
刷新网页:
可以看到,每一行的ID和名字都不一样了。
当然,在实际项目中,一般是不采用这样的方式的,一般来说,整个数据结果集肯定是一起返回到页面显示的地方,然后通过访问这个数据结果集来嵌入到HTML的table里面来进行显示的。
一般的方式是采用二维数组变量来保存数据结果集的。
增加一个变量$alldatas,然后内容是二维数据,外面一层是每一行的意思,里面一层用键和值来表示不同的字段数据。
然后显示循环内部,通过访问这个二维数组的某个键来获得对应的数据,并通过echo来输出到网页内容中。
修改studentlist.php文件:
刷新网页:
可以看到数据显示了5行,每一行的姓名都是按照数组变量中的值来进行显示。通过这样的方式,可以很方便的显示出后台数据。
但是有一个不正确的地方,那就是数据的行数长度为5,代码仍然是用for循环5次,加入数据的行数长度不是5,那么这里for循环就不正确了。应该改为foreach针对二维数组变量进行遍历循环,这样才能完全按照存储变量的数据来显示行数和内容。
修改循环方式和变量显示,同时将其他的字段都修改为按照这样的方式来显示。
修改studentlist.php文件:
刷新网页:
可以看到,所有的显示内容都是依赖于数组变量里面存储的值了。只要修改这个变量里面存储的数据,网页就会显示不同的内容了。
这就是动态网站的精髓之所在。
编写各个查询项目和查询按钮
接下来,编写上面的查询条件和查询按钮。
在3-4这一节当中,大致介绍了各种输入项的编写方式,来复习一下:
可以在网页上显示一个文本输入框。
可以在网页上显示一个单选按钮。
可以在网页上显示一个多选按钮。
可以在网页上显示一个按钮。
使用select元素可以显示一个下拉框。
选项1
选项2
以上代码可以在网页中显示一个下拉框选项,里面有2个选择项目。
按照以上方式,在上面区域中增加下列查询条件和一个查询按钮。
姓名(文本输入)/性别(单选)/科目(多选)/分数段(下拉框选择)/查询按钮。
首先来规划一下这5个项目如何摆放在页面中。
打算将查询按钮放在最右侧,然后左边分成上下2行,上面一行分成3列,分别显示姓名和性别和分数段;
下面一行由于是科目多选,需要的长度比较长,因此下面一行占用3列宽度,这样正好利用table的合并单元格属性来实现。
首先,写好table的各个tr和td的分布,将边框显示出来,验证排版是否正确:
修改studentlist.php文件:
刷新网页看看效果:
然后,编写所有的查询条件和查询按钮:
修改studentlist.php文件:
修改student.css文件:
刷新网页看看效果:
可以看到,查询网页已经基本成型了,那么接下来就是实现点击查询按钮之后的功能,也就是根据输入不同的条件,返回不同的查询数据结果。
特别说明
这节课的内容非常关键,是编写动态网站的核心入门教程。由于这节课的内容用到了很多之前课程的相关内容,如果大家是碰巧第一次看到这篇文章的话,可能有很多不明白的地方,那么可能需要看看学哥之前写的文章,建议从0001这节课开始看,这样前后有连贯,才会更好的理解。
.
声明:本人只是分享一些床长人工智能教程相关的免费杂文而已,并非床长人工智能网校的收费文章。
文章目录闲扯代码执行和命令执行的区别回调函数可变函数的模式双引号导致代码执行修复方案
闲扯
菜鸡的我被拒绝了,有点悲丧,努力吧。
这些内容是看视频学的,有些点还比较有用,尤其是那里,经常遇到了但是利用不了。
代码执行和命令执行的区别
代码执行是执行脚本代码,执行的是命令执行是执行系统命令,执行的是。
但是我们也可以通过代码执行调用函数,来达到命令执行的效果,所以有时候就搞不清两者的区别。
这两个函数都可以将字符串转换为代码执行
函数把字符串按照代码来计算。
该字符串必须是合法的代码,且必须以分号结尾。
如果是字符串,它将会被当做代码来执行。
本地测试
换成也是可以的
代码执行导致的命令执行
回调函数
一般就是,回调函数的意思就是代表他们可以调用其他函数。
审计的时候发现,一般我们传入的函数都有白名单限制的,很难受。
解释
拿来说,我们在第一个参数处传入要执行的函数名,后面的参数都是我们指定函数所需要的参数。
我们传入就可以代码执行了。
例子
本地测试这里又和版本有关系了,的不行,我用的成功了,但是这个函数的确是支持的,没搞懂
这里不能使用函数,查官方文档才找到原因
可变函数
解释
可以通过把函数名赋值给变量,然后用变量来调用函数的功能。
本地测试
这里又不能使用函数,再去看官方文档,
没看到有提,但是也举例了几个不能用的,所以猜测应该也在这个列表里。
的模式
解释小于的版本中,存在模式修正符,允许代码执行。
它的第二个参数位置就填我们要执行的代码。
例子
本地测试
可控点在第三个参数
代码解释
是表示匹配除换行符等以外的字符,加上括号是表示取出这部分内容,\\是代表第一个里的缓冲区内容,这里就是匹配出了
可控点在第二个参数那就直接输入执行了
可控点在第一个参数
这里又要用到双引号的特性了,这个点在下面会说
发现使用单引号包围第一个参数的话失败,下面用双引号尝试成功
双引号导致代码执行
在中,双引号里面如果包含有变量,解释器会进行解析单引号中的变量不会被处理。
再结合可变变量的特性,在里的代码就会被执行,具体看下面的例子。
这个特性单用比较鸡肋,原因下面会说。
例子
我们可以看到,直接在双引号内输入会成功
但是我们改成传参却不行了
我们尝试直接在本地赋值,发现也不行
但是我们不给加引号包裹能成功
那么失败的原因就是,我们传参进入的变成了字符串,导致不能执行。
因为没找到官方文档解释,我的猜测理解是这样的,遇到双引号内有变量的时候,就会进行解析,所以先解析了或者,但是这个时候双引号被用掉了,内层的没办法被解析了,就代表只有这个字符串,但是没有被当成代码解析。
这只是我的猜测,所以这个双引号的特性会配合的模式一起使用。
修复方案
尽量不要执行外部传入的参数
过滤所有输入。。。
为什么选择PHP学习代码审计?PHP是天生用来开发web程序的,正如之前的梗"PHP是世界上最好的语言",最主要的原因是PHP编写的各种程序随处可见。
一、入门准备
1.PHP的编程基础
2.环境配置能力
二、代码结构
常见的代码结构有两种:
1、HTML与PHP代码混编,特征就是一个url对应一个PHP页面,例如WordPress的登陆页面http://wordpress.com.test/wp-login.php
2、MVC模式
把代码拆分为Model View Controller三部分结构,模型一般是数据库操作的相关的代码,例如jsp中的javabean用来设计数据的属性和行为,提供获取属性和设置属性的get/set方法视图通常是HTML代码和其他编程语言的混编结果,可以把一些控制器传递过来的结果,进行一定的拼接控制器的代码一般是接受数据,做一些数据的校验,权限的判定,调用一些模型的数据库操作代码,把获得到的数据,传递给视图,然后视图把装好的HTML代码发送到客户端MVC的常见表现形式是通常有一个入口文件,这个入口一般是index.php
三、目录结构
放引用的库或者插件,文件夹名字一般叫librarie/lib/plugin现代的PHP项目还有一个vendor文件夹,是PHP的包管理器安装依赖代码存放的路径视图代码文件夹名称一般叫layout,theme,template,view控制器文件夹一般叫controller公用的一些代码文件夹一般叫common一些工具函数可能放helper/util/tool文件夹里配置文件放在config文件夹里components或modules:这里有mvc的代码,把功能互相独立出来route.php:对不同的url调用不同的代码篇幅有限先介绍到这里,以上技术内容参考 安全牛课堂 PHP代码审计,侵权删。
我以下面三个例子为例,来说下PHP代码优化。
1、使用require与使用require_once 的对比。
2、提前计算一个for循环的长度。
3、比较for、foreach和while 循环在访问数组元素时的性能。
在这里,具体的理论东西我不会太多说。我将从实际代码的角度让大家比较直观的了解下那个是最佳的代码实践。能够认识到代码的不同写法确实能给我们的整体性能带来提升。
PHP性能调优之PHP代码最佳实践除此之外,还有一些其他的优化技术,比如file_get_contents获取内容的问题。使用逗号而不是句点来链接字符串,或者在字符串包含变量时使用双引好而不是单引号等等。这些大家可以自己在工作中测试和验证一下。
1、require 与 require_once。
说明,我的测试文件路径存放在了 : /var/shared/htdocs/myapp/models/MyModels/ 目录下。
加载四个外部类文件的基本代码:
require_once 代码片段A类到D类分别是:
A到D类的代码片段以上4个空类均可以帮助我们模拟一个需要在主脚本中使用外表PHP文件的PHP脚本。我们排除任何额外的函数调用。专注与使用 require_once()文件的加载。
将每一个类放在单独的文件中: classA.php、classB.php、ClassC.php、classD.php
将这些文件与代码放在同一个目录下。重启WEB服务器,使用ab测试工具进行测试。
ab命令模拟10万个请求,同一时间有5个并发请求,命令终止后,应该可以看到类似如下的结果。
ab -c 5 -n 100000 localhost /index.php
require_once ab 测试结果截图使用此ab命令测试require_once()。我们可以看到,相应时间为99毫秒。我们的结果还说明,该脚本每秒可以支持100.63个请求。
现在,让我们将require_once()函数调用改成required()。重启WEB服务器,然后重新运行 ab 命令。结果如下所示:
require 代码片段每秒可支持的请求数量有所提升,从 100.63增加到了105.44.这个结果还说明,代码的相应时间从最初的99.37毫秒降低到了94.84毫秒,减少了5毫秒。
require ab 测试结果截图2、提前计算 for 循环的长度:
在进入循环之前计算循环长度是理工一个可以使用的优化技术。
如下图所示的代码是一个简单的for 循环。它将便利数组$items 并分10此计算出数值。要确定那些地方可以进行优化,你需要一步一步的分析嗲吗做了什么。
没有提前计算数组长度模拟代码片段如上,代码循环10次,则count($items )计算10次。
如上代码,从10此计算数组长度降低到一次计算数组长度。我们可以使用函数 microtime() 来准确的计算出减少9次count()函数调用可以节省多少时间。如下所示:
计算没有提前计算数组长度时候执行时间片段执行十次该代码并计算平均值,我们得出,10万次循环的总执行时间为0.046毫秒,重启服务器,然我们测试下如下代码,其中包含优化了的for 循环
提前计算过数组长度执行时间代码片段我们再次运行10此代码并获取平均值。使用此代码,我们看到,for 循环的平均执行时间为0.0095,减少了0.036毫秒。优化过的代码快了0.036毫秒。
3、使用 foreach 、for 、while 循环访问数组元素。
访问数组数据的方法是可以优化的。方法是使用foreach 循环替代 while 或 for 循环。优化数据访问的方法至关重要。因为很多的web 应用程序需要从数据库或者XML 文件中读取数据并且必须遍历每一条记录后才能将数据显示给用户。为了演示这种优化,我们将使用如下的代码:
foreach 循环代码片段如上创建了一个数组$items ,其中包含10万个元素,每个元素还有155个字节的字符串,代表数据库中的典型数据。在后该代码设置了开始时间并使用foreach 循环访问数组的每一个元素,最后,我们以毫秒为单位显示所示是时间。我么连续执行10次代码,然后计算出每次执行时间的平均数值,其结果是0.0078毫秒。
while 循环代码片段重启服务器且运行该代码10此后,我们再次计算平均执行时间。用while 循环访问数组中的单个元素的平均时间为0.0099 毫秒。
最后一组循环比较的是for 循环。我们使用如下代码,按照同样的基准循环流程,重启服务器,执行代码10次并计算:
for 循环执行时间代码片段上述三种循环基准的结果列于如下表中。表宗结果可以证明,使用foreach 循环访问数组是最好的方法。
三种循环执行时间比较从上面的几个例子,我们可以感受到代码优化的重要性。
做网站大家首先想到的就是要怎么写代码,选择PHP还是asp,或者Java等语言,还有数据库使用MySQL、oracle还是access等等,其实完全没有那个担心,很多的个人站长并不会写代码,这是事实。只要掌握网站建设的基本方法,对于各种类型的开源网站系统都可以轻松驾驭,做出漂亮的网站。
01了解开源网站系统
开源网站系统就是开放源代码的意思,所有的代码均没有被加密,你可以任意修改,直到满足你的功能未知;开源系统一般不允许二次发布或销售,你自己使用,随便你怎么改都可以,但是不能把你改好的进行销售或再一次发布。
现在90%以上的开源网站系统使用的是PHP语言开发,主要是PHP免费,MySQL数据库也免费,PHP运行速度快等特点,一般情况下,网站语言选择PHP的就行。部分开源系统会有购买授权这一要求,个人仍然是可以免费使用的,如果是公司使用可以根据实际情况购买授权,比如你的网站已经稳定运营了,建议购买,如果是刚开始或者运营不稳定,暂缓购买授权也行(不买也可以,只不过为了减少不必要的麻烦买一个授权更放心)。
常用的开源网站系统,均为PHP+MySQL
dedecms:开源用来搭建资讯类,个人博客,企业网站,图片站,商品展示,商城,分类信息站等,功能强大,不可多得的内容管理系统,有授权,不买也可以使用;简单易学,入门很快。
discuz:简称DZ,做论坛就用他了,你现在看到的论坛网站几乎都是discuz系统搭建的,还可以用来搭建门户网站,dz应用中有很多的插件,能够实现分类信息、地方门户,商城网站,分销等很多功能;模板设计稍微复杂,只要稍加学习即可搞定。
WordPress:国外的一款使用很广泛的博客系统,可以用于搭建个人博客和企业网站。
还有很多不太知名的开源网站系统,如果不知道可以百度搜索。
02本地测试环境介绍
想要使用任何一款开源的网站系统,总是需要先在本地电脑上测试一下,所以配置一个完整的PHP环境就必不可少了,但是PHP环境的搭建优点复杂,于是有了很多的本地集成PHP环境软件,现在比较流行的有PHPstudy,PHPenv及wampserver等,大家可以百度搜索下载安装。
先将PHP集成环境在本地电脑上安装好,再去下载相应的网站源码,在集成环境上安装即可进行测试。
03模板制作或选择免费模板
开源网站系统都有一个共同的特点:模板是通用的。你可以去下载免费的模板直接使用,有条件的话也可以花钱购买一些付费的模板,直接套用就行。
如果是自己设计模板,需要懂得css和HTML相关的代码才行,这个是必须的基础,没有别的办法;其实也有简单的方法,可以去下载一些免费的模板,进行适当的修改即可成为自己的模板。很多仿站就是这么弄得,把别人的css和js文件下载下来,再进行标签套用即可。
04网站上线运营
将我们制作好的网站上线运营,需要购买服务器,可以根据自身的条件选择购买虚拟主机或是独立服务器,要是小型网站,使用虚拟空间就可以了,这个在购买的时候资讯空间商就行。
剩下的就是填充网站内容,优化和推广,获得用户或进行商品销售。网站设计制作是不是也很简单,只要会,一周上线一个网站其实是很容易的,想那些专门卖模板的网站,一套模板稍微修改一下就可以用于另一个网站,一天上线几个网站都可以。
据外媒报道,安全研究员Andrew Danau发现,PHP 7存在远程代码执行漏洞CVE-2019-11043,运行PHP-FPM的网站受影响。
图片来源于pixabay据悉,该漏洞概念验证PoC代码已被发布,运行PHP 7+版本的服务器易受攻击。由于许多PHP-FPM教程可在Internet上获得部分Web托管提供商正在使用的配置,因此黑客的攻击成功率被大大提高。
图片来源于pixabay漏洞源于PHP-FPM模块中“env_path_info”的下溢内存损坏,即使不使用特定技能,黑客也可接管服务器,启用PHP-FPM的NGINX服务器受影响。此外,将其与其他问题链接在一起,可能允许黑客在Web服务器上远程执行任意代码。
图片来源于pixabay截至目前,官方已发布漏洞补丁,但黑客很可能已开始扫描Internet来搜索易受攻击的网站,因此专家建议用户将PHP更新到最新的PHP 7.3.11和PHP 7.2.24以保护网站。
PHP作为在web开发中最得力的编程语言,自从PHP7后来之后,PHP7比PHP5速度提升了两倍左右,但是除了官方php本身程序的提升,我们还可以从编程代码的方式提升PHP运行速度,下面介绍几种提升PHP代码方式,你们认同哪几个?
第一,如果能将常用类的方法定义改成static,它的速度会提升将近4倍。
第二,PHP本身提供很多方式,在没有必要的情况不需要第三方扩展类,尽量采用PHP内置函数可以提高PHP速度。
第三,尽量做HTML缓存设计,在PHP解析脚步时会降低速度,如果引用缓存数据这在很多时间内可以完成页面显示。
第四,一般情况下设计一个全局变量要比设计一个局部变量速度慢2倍以上,我们想一下,全局变量是整个程序一直在运行,而局部变量在需要的时候在运行。
第五,PHP与mysql结合可以说是完美结合,很多人习惯是连接数据库使用长连接方式,如果每次使用完数据库关闭连接可以提高PHP的解析速度。
第六,PHP错误消息PHP初级程序员习惯使用@屏蔽消息,要记住只是屏蔽并非解决,所以PHP运行时还会有错误只是被屏蔽掉了,这样对于PHP消耗非常大,极其不建议这样做。
以上是PHP常见的提高程序运行速度的代码方式,你们认同哪几个?
目标1:
执行如下最简单的php程序(代码):
可见,还不行,于是,需要去配置。
apache的配置文件在哪里?
apache安装目录/conf/httpd.conf
用编辑器打开它:
如下:
这就是apache中的“众多模块”,有的已经,有的没有开启。
“php语言”就是apache中的一个模块——但我们得自己去添加上并进行配置!
分两步:
第1步:添加php语言模块,如下所示:
第2步:设定有php语言包,去执行php后缀的文件(中的脚本代码)
然后,重启apache,重新浏览刚才的php网页,如下:
漏洞描述
2019年9月26日,PHP官方发布漏洞通告,披露了一个远程代码执行漏洞CVE-2019-11043,此漏洞由于在使用PHP-FPM + Nginx组合并采用一定配置的情况下,通过恶意构造的数据包,即可让PHP-FPM执行任意代码。
漏洞编号
CVE-2019-11043
漏洞级别
高危
影响范围
PHP 5.6-7.x
漏洞复现
使用 phuip-fpizdam进行验证,如下图所示。
运行成功之后访问:http://192.168.42.140:8080/index.php?a=/bin/sh+-c%20%27whoami%27%20&,即可看到命令已成功执行
修复建议
1.PHP已于10月12号发布该漏洞补丁,请参考以下链接安装补丁:https://bugs.php.net/patch-display.php?bug_id=78599&patch=0001-Fix-bug-78599-env_path_info-underflow-can-lead-to-RC.patch&revision=latest
2.在不影响正常业务的情况下,在 Nginx 的配置文件中删除如下配置:fastcgi_split_path_info ^(.+?.php)(/.*)$;fastcgi_param PATH_INFO $fastcgi_path_info;
参考链接
https://github.com/neex/phuip-fpizdamhttps://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
发现 | 发掘
为随时发生的网安动态发声
资讯|干货|案例|威胁|动态
ZDNet从威胁情报公司“坏包”(Bad packet)那里了解到,现代版本的PHP编程语言中最近修补的一个安全缺陷正在被用于接管服务器。该漏洞是PHP 7中的远程代码执行(RCE), PHP 7是PHP的较新分支,PHP是用于构建网站的最常用编程语言。这个问题被称为CVE-2019-11043,它允许攻击者仅通过访问一个特制的URL就可以在服务器上运行命令。利用这个漏洞并不重要,本周早些时候,GitHub上发布了公开的概念验证的利用代码。
“GitHub存储库中包含的PoC脚本可以通过发送特别制作的请求来查询目标web服务器,以确定它是否容易受到攻击,”成立公司的高级安全响应经理Satnam Narang说。“一旦一个脆弱的目标被识别出来,攻击者就可以通过添加‘?a='在一个脆弱的web服务器的URL。"- ice (@ice43396118) 2019年10月24日
只有NGINX服务器受到影响
幸运的是,并非所有支持php的web服务器都受到影响。只有启用了PHP-FPM的NGINX服务器是脆弱的。PHP- fpm,或FastCGI进程管理器,是另一种具有一些附加功能的PHP FastCGI实现。然而,尽管PHP- fpm不是Nginx安装的标准组件,一些web托管提供商将其作为其标准PHP托管环境的一部分。
其中一个例子是网络主机提供商Nextcloud,它在10月24日(周四)向客户发布了一份安全建议,敦促客户将PHP更新到最新版本7.3.11和7.2.24,这两个版本是在同一天发布的,包含了CVE-2019-11043的补丁。许多其他的虚拟主机提供商也被怀疑运行脆弱的Nginx+PHP-FPM组合。但是也有一些网站所有者由于技术限制不能更新PHP或者不能从PHP- fpm切换到另一个CGI处理器。
发现PHP7 RCE的Wallarm公司的这篇博客文章介绍了网站管理员如何使用标准的mod_security防火墙工具来阻止网站url中的%0a (newline)字节,并防止任何攻击。Wallarm公司称赞其安全研究员安德鲁·达诺在上个月的“夺旗”(CTF)比赛中发现了这个漏洞。由于公共PoC代码的可用性和利用这个bug的简单性,建议网站所有者检查服务器设置,如果他们运行了易受攻击的配置,则应尽快更新PHP。