pHp脚本滥用1.漏洞原因及学习与理解(一)

发布时间:2025-09-15 点击:2
本文主要讲解《如何防止php程序漏洞》。文章中的讲解简单明了,易学易懂。现在,请跟随小编的思路,深入了解《如何防止php程序产生的漏洞》吧!
虐待
1.漏洞原因:
是写php网站最常用的函数,支持相对路径。很多php脚本直接使用某个输入变量作为参数,导致脚本任意引用、绝对路径泄露等漏洞。看下面的代码:
...
$=$_get[];
($);
...
显然,我们只需要提交不同的变量就可以得到想要的页面。如果提交的页面不存在,可以在 php 脚本中报错,并显示实际绝对路径(此问题的解决方法在下一篇文章中说明)。
2.漏洞解决方案:
这个漏洞的解决方法很简单,就是先判断页面是否存在再继续。或者更严格地说,使用数组来指定可用文件。看下面的代码:
复制代码代码如下:
$=(.php,.php,.php); //此处指定可用文件
if(($_get[])) //判断是否有$
{
$=$_get[];
($ 为 $)
{
if($==$) //检查文件是否在允许列表中
{
($);
$=真;
;
}
}
if($==true){ ($);}
else{ die(无效的参考页!);}
}
这将很好地解决问题。
tips:还有其他函数有这个问题:()、()、()、()等,写的时候也要注意。
输入变量未过滤
1.漏洞原因:
这个漏洞最早出现在asp中,当时造成的注入漏洞数不胜数。但是由于当时 php 的影响力比较小,所以没有多少人能够关注到这一点。对于 php 来说,这个漏洞的影响要大于 asp,因为更多的 php 脚本使用了基于文本的数据库。当然,还有sql语句注入的问题。举一个更经典的例子,首先是数据库:
复制代码代码如下:
$id=$_get[id];
$= * from id='.$id.'; //很经典的sql注入漏洞
$=($);
这里很明显,我们可以使用注入来获取数据库的其他内容。这里就不细说了,和asp注入一样,大家可以看前面的hack。然后我们看一下文本数据库的问题:
复制代码代码如下:
$=$[];
$=$[];
$=$[];
$fd=(test.php,a);
($fd,\r\n$&line;$&line;$);
($fd);
文中的漏洞可以说是比较严重了。如果我们在提交的变量中插入一小段 php 代码,我们就可以将这个文本数据库 test.php 变成一个 php 后门。甚至插入上传代码,这样我们就可以上传一个完整的php后门。然后提升权限,服务器就是你的了。
2.漏洞解决方案:
这个漏洞的解决方法其实很简单,就是严格过滤所有提交的变量。替换一些敏感字符。我们可以使用 php 提供的 () 函数来替换 html 内容。下面是一个例子:
复制代码代码如下:
//构造过滤函数
($文本)
{
$=(操,操); //词汇过滤列表
$text=($text);
($ as $) //这里进行词汇过滤
{
if(($text,$)==true){ die(错误:您提交的内容包含敏感词,请不要提交敏感内容。);}
}
$text=($text); //html 替换
//将回车替换为
$text=(\r, ,$text);
$text=(\n,,$text);
$text=(&line;,│,$text); //替换文本数据库分隔符“&line;” 全角“│”
$text=(/\s{ 2 }/, ,$text); //空间替换中国网管联盟
$text=(/\t/, ,$text); //或空格替换
if(()){ $text=($text);} //如果开启,则替换\'
$文本;
}
$=$[];
$=$[];
$=$[];
//过滤所有输入
$=($);
$=($);
$=($);
$fd=(test.php,a);
($fd,\r\n$&line;$&line;$);
($fd);
经过一些替换和过滤后,您可以安全地将数据写入文本或数据库。
管理员判断不完整
1.漏洞原因:
我们使用php编写脚本,通常涉及到管理员的权限。并且有些脚本只对管理员权限做出“是”的判断,而往往忽略“否”的判断。在php配置文件中打开的情况(4.2.0及以后的版本默认是关闭的,但是很多人为了方便打开,是极其危险的行为),会出现提交变量 假装是管理员。我们来看一下示例代码:
复制代码代码如下:
$=; //判断是否的变量
$=$[符号]; //获取用户变量
如果($==$)
{
$=真;
}
if($){ echo 现在是管理员状态。;}
看起来很安全,哈哈。现在我们假设 php 配置文件已打开。我们提交这样一个地址“test.php?=true”,你看到结果了吗?虽然我们没有正确的,但我们提交的变量由于打开状态自动注册为真。而且,脚本缺少“否”判断,这让我们可以通过=true 成功获取管理员权限。这个问题存在于大多数网站和论坛中。
2.漏洞解决方案:
解决这个问题,我们只需要在脚本中给管理员添加一个“否”判断即可。我们仍然假设 php 配置文件是打开的。看一下代码:
复制代码代码如下:
$=; //判断是否的变量
$=$[符号]; //获取用户变量
如果($==$)
{
$=真;
}
别的
{
$=;
}
if($){ echo 现在是管理员状态。;}
这样,即使攻击者提交的变量=true 不正确,脚本也会在以后的判断中设置$为。这解决了部分问题。但是,因为$是一个变量,如果以后其他脚本引用出现漏洞,重新给$赋值,就会造成新的危机。因此,我们应该使用常量来存储管理员权限的判断。使用()语句定义一个常量来记录管理员的权限。之后,如果重新赋值,就会报错,达到保护的目的。看下面的代码:
复制代码代码如下:
$=; //判断是否的变量
$=$[符号]; //获取用户变量
如果($==$)
{
(,真的);
}
别的
{
(,);
}
if(){ echo 现在是管理员状态。;}
值得注意的是,我们已经使用了语句,所以在调用常量之前不要习惯性地添加变量符号$,而是使用and!。
文本数据库曝光
1.漏洞原因:
如前所述,由于文本数据库具有很大的灵活性,因此不需要任何外部支持。此外,php 具有非常强的文件处理能力,因此在 php 脚本中广泛使用文本数据库。甚至有几个使用文本数据库的优秀论坛程序。但有得有失,文本数据库的安全性低于其他数据库。
2.漏洞解决方案:
作为普通文件,可以下载文本数据库,就像mdb一样。所以我们必须通过保护mdb来保护文本数据库。将文本数据库的后缀更改为.php。并加入数据库的第一行。这样,文本数据库就会作为php文件使用,第一行就退出执行。即返回一个空页面,从而达到保护文本数据库的目的。
错误路径泄漏
1.漏洞原因:
php遇到错误时,会给出错误脚本的位置、行号和原因,例如:
: 在 d:\\\test.php 第 3 行使用 test-'test'
很多人说这没什么大不了的。但是泄露实际路径的后果是难以想象的。对于某些入侵者来说php代码执行漏洞,这些信息非常重要。其实现在很多服务器都有这个问题。
有的网管干脆把php配置文件里的设置设为off,但我觉得这个方法太消极了。有时,我们确实需要 php 返回错误消息以进行调试。并且可能需要在发生错误时给用户一个解释,甚至导航到另一个页面。
2.漏洞解决方案:
php提供了一个从4.1.0开始的自定义错误处理函数(),但是很少有脚本编写者知道。在很多 php 论坛中,我只看到了一些处理这种情况的。使用方法如下:
([, 整数 ])
现在我们使用自定义错误处理来过滤掉实际路径。
复制代码代码如下:
//身份判断为管理员,true为管理员。
//自定义错误处理函数必须有这4个输入变量$,$,$,$,否则无效。
($,$,$,$)
{
//如果你不是管理员,过滤实际路径
如果(!)
{
$=((),,$);
$=((),,$);
}
($)
{
案件:
echo : [id $] $ (行: $ of $)
\n;
echo 程序已停止运行,请联系管理员。;
//遇到关卡错误时退出脚本
出口;
;
案件:
echo : [id $] $ (行: $ of $)
\n;
;

//不显示电平错误
;
}
}
//将错误处理设置为函数
();

这样就可以很好的解决安全性和调试方便性之间的矛盾。而且你也可以花一点时间思考,让错误信息更美观,以配合网站的风格。但有两点需要注意:
(1), ,,,, 不会被这个句柄处理,也就是会以最原始的方式显示出来。不过,这些错误是编译或者php内核错误,一般情况下不会发生。
(2)使用()后,()会失效,即所有的错误(除了上面的错误)都会由自定义函数处理。
关于()的其他信息可以参考php官方手册。
post 漏洞
1.漏洞原因:
如前所述,依赖注册变量是一个坏习惯。在一些留言簿和论坛程序中,需要严格检查获取页面的方法和提交的时间间隔。防止泛滥的发帖和外部提交。下面我们来看看一个留言板程序的代码:
复制代码代码如下:
...
$=($);
$=($);
$=($);
$fd=(data.php,a);
($fd,\r\n$&line;$&line;$);
($fd);
显然,如果我们提交 url “post.php?=&=&=。数据将正常写入文件。该程序不检测变量的来源和浏览器获取页面的方式。如果我们多次提交到这个页面,它就会像洪水一样。现在一些软件利用这个漏洞在论坛或留言簿上发布广告。这是一种可耻的行为(我朋友的留言簿一周就塞满了10多页,无奈)。
2.漏洞解决方案:
在处理和保存数据之前,首先要确定浏览器是如何获取页面的。使用 $[] 变量来获取浏览器获取页面的方式。检查它是否是“post”。脚本中用于记录用户是否通过正常方式提交数据(即填写待提交内容的页面)。或者使用 $[] 来检测,但不推荐这样做。因为有些浏览器没有设置,有些防火墙也会屏蔽。另外,我们还需要检查提交的内容,看看数据库中是否有重复的内容。以留言板为例php代码执行漏洞,使用确定:
在填写浏览内容的页面,我们在最前面添加:
$[]=time(); //注册和填写的时间
在接收和保存消息数据的页面上,我们在处理数据之前也使用如下处理:
复制代码代码如下:
if(($[])!=”post”){ die(: do not .);} //检查页面获取方式是否为post
if(!($[]) or (time()-$[] <10)){ die(: do not .);} //检查消息并填写时间
if(($[]) and (time()-$[] <120)){ die(错误:两次提交的间隔不能少于2分钟。); } //查看消息间隔
($[]); //注销变量,防止进入一次填写页面后多次提交
$[]=time(); //注册发送消息的时间,防止浇水或恶意攻击
...
数据处理和存储
感谢您的阅读。以上就是《如何防止php程序产生的漏洞》的内容。看了这篇文章,相信大家对如何防范php程序产生的漏洞有了更深入的了解。每个人都需要通过实践来验证。这就是伊素云。小编会为大家推送更多相关知识点的文章,欢迎关注!


网站推广企业未来发展何去何从?
SEO如果只是为了排名,那将毫无意义
为什么网站改版费用和新建网站一样?
一个网站做好了,怎么获取客户呢
沈阳网站制作的模板网站对企业宣传有哪些影响
做一个网站需要多少钱?网站建设价格方案如何选?
你的网站做SEO之后,能够满足用户需求吗?
找不专业的网站建设制作公司会面临哪些问题