数码资讯
PHP程序漏洞的原因分析及防范方法
滥用包括 1。漏洞成因: 包含是PHP站点中最常用的函数,它支持相对路径。有许多PHP脚本直接使用输入变量作为包含的参数,造成诸如任意引用脚本、绝对路径泄漏等漏洞,请看下面的代码: … includepage美元=美元_get {includepage}; 包括($ includepage); …
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
滥用包括
1。漏洞成因:
包含是PHP站点中最常用的函数,它支持相对路径。有许多PHP脚本直接使用输入变量作为包含的参数,造成诸如任意引用脚本、绝对路径泄漏等漏洞,请看下面的代码:
…
includepage美元=美元_get {includepage};
包括($ includepage);
…
很明显,我们只需要提交不同的includepage变量来获取所需的网页。如果你提交的网页不存在,您可以使PHP脚本错误并揭示出真正的绝对路径(解决这个问题的办法是在下面的文章中解释)。
2。漏洞的解决方案:
此漏洞的解决方案非常简单,即确定页面是否存在,然后包含。或者更严格地说,数组用于指定包含文件:
复制代码代码如下所示:
pagelist美元=阵列(test1。PHP
如果(isset($ _get {includepage})) / /确定是否有includepage美元
{
includepage美元=美元_get {includepage};
foreach($ pagelist达调入)
{
如果($ includepage = = $调入)/检查文件是否在允许列表中
{
包括($调入);
checkfind美元=真;
打破;
}
}
如果($ checkfind = = true){ unset($ checkfind);}
否则{死()无效引用页!;}
}
这是解决这个问题的好办法。
提示:这个问题的功能是:需要(),(),()require_once include_once,ReadFile()等,并应注意写作。
不过滤输入变量
1。漏洞成因:
这个漏洞已经在ASP出现早,和无数的注入漏洞造成的。但因为PHP是影响力较小的时候,没有那么多的人能够注意,PHP,这个漏洞是比ASP更具影响力的因为有很多PHP脚本中使用的文本类型库。有,当然,对SQL注入问题。一个比较经典的例子,首先,是数据库:
复制代码代码如下所示:
ID =美元美元_get {id};
为查询=SELECT * FROM my_table id是,; ID美元/ /经典的SQL注入漏洞
结果= mysql_query美元($查询);
很明显,我们可以用注入来获取数据库的其他内容。这里没有更详细的描述,如ASP注入,您可以查看以前的黑防御。然后我们查看文本数据库的问题:
复制代码代码如下所示:
美元=美元_post { ,};
_post text2 =美元美元{正文};
$text3=$_POST{Text3};
FD = fopen(美元测试PHP 。
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
文本的漏洞,可以说是越来越严重。如果我们插入一个非常小的PHP代码在我们提交的变量,其他文本数据库test.php可以成为PHP后门。甚至将上传的代码允许我们上传一个完美的PHP后门。然后提出了特权,而服务器你的。
2。漏洞的解决方案:
这一漏洞的解决方案是非常简单的,它是严格过滤所有提交的变量。代替一些敏感的特点,我们可以用htmlspecialchars取代HTML内容()提供的PHP函数。这里是一个例子:
复制代码代码如下所示:
过滤器功能结构
功能flt_tags($文本)
{
$坏字眼=阵列(他妈的
为文本= RTrim($文本);
foreach($坏字眼达BadWord) /这里有词汇过滤
{
如果(stristr(合文本,美元= =真坏词)){死(错误:您提交的内容包含敏感词,请不要提交敏感内容。);}
}
文本= htmlspecialchars($ $ / /文本);HTML替换
要输入/替换的两行
文本= str_replace美元( R
美元( str_replace文本=
文本= str_replace美元(线;
文本= preg_replace美元( / / / 的{ 2 }
文本= preg_replace美元( / / T
如果((get_magic_quotes_gpc)){ $文本= stripslashes($文本);} / /如果magic_quotes开放,取代
返回$文本;
}
美元=美元_post { ,};
_post text2 =美元美元{正文};
正文=美元美元_post {正文};
所有输入过滤器
$text1=flt_tags ($text1);
flt_tags text2 =美元($ 2);
正文= flt_tags美元($正文);
FD = fopen(美元测试PHP 。
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
在一些替换和筛选器之后,您可以安全地将数据写入文本或数据库中。
管理员的判断是不完整的。
1。漏洞成因:
我们写脚本,PHP,这通常需要管理员权限。一些脚本只做一个是的判断,对管理员的权限,而往往忽略了无的判断。在PHP的配置文件,当打开的register_globals 4.2.0版本,默认是关闭的,但许多人打开它的方便。这是极其危险的行为。它会发生,提交的变量是冒充管理员。让我们在例子代码看:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
$ =真;
}
如果($){ 现在是管理员状态;}
它看起来像一个安全的样子,呵呵。现在我们假设register_globals在PHP的配置文件是开放的,我们提交了这样一个地址,test.php行政,真的,你看到了吗我们没有正确的cookie,但因为register_globals是开放的,管理变量我们提交自动注册是真实的。在剧本的判断力的缺失使得我们有可能得到管理员通过管理=真问题的权威存在于大多数网站和论坛。
2。漏洞的解决方案:
为了解决这个问题,我们只需要添加一个判断到脚本中的管理员。我们仍然认为register_globals在PHP的配置文件是开放的,看代码:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
$ =真;
}
其他的
{
$ = false;
}
如果($){ 现在是管理员状态;}
这样,即使攻击者提交管理=真正的变量没有正确的cookie,剧本也将设置为管理员在未来的判断错误。这解决了一些问题,但因为美元的管理员是一个变量,一个新的危机,可如果一个漏洞发生在未来的其他脚本引用可以被重新分配至admin.therefore触发,我们应该使用常数存储管理员的权限,定义()语句是用来定义一个管理员不断记录管理员的权限,后来,如果你指定一个重新分配,这就犯了一个错误,达到保护的目的。看看下面的代码:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
定义(admin,true);
}
其他的
{
定义(admin,false);
}
如果(admin){现在是管理员状态;}
值得一提的是,我们使用了定义语句,所以在调用admin常量时,不习惯添加变量符号$,但是我们应该使用admin和admin。
文本数据库曝光
1。漏洞成因:
正如已经提到的,由于文本数据库是非常灵活的,没有外部的支持是必需的。此外,PHP是非常能够处理文件,所以文本数据库中广泛使用的PHP脚本。甚至有一些好的论坛程序使用一个文本数据库,但它已被丢失,和文本数据库的安全性也低于其他数据库。
2。漏洞的解决方案:
文本数据库,作为一个普通的文件,可以下载,像MDB。所以我们要保护MDB保护文本数据库,更改文本数据库to.php.and后缀名添加在数据库中的第一行。全文数据库将作为一个PHP文件并退出一线,是的,回到一个空的页保护文本数据库。
错误路径泄漏
1。漏洞成因:
当PHP遇到错误时,它给出错误脚本的位置、行数和原因,如:
注意:使用未定义的常数测试assumed'test'in D: interpub bigfly test.php线3
很多人说这没什么大不了的,但是揭示实际道路的后果是不可想象的。对于一些入侵者来说,这些信息是非常重要的,但事实上,有许多服务器存在这个问题。
一些网络管理员只需设置display_errors在PHP配置文件,但我认为这种方法太消极了。有时候,我们需要PHP返回的错误信息来调试。也可能需要给用户导航到其他页面,甚至当它是错的。
2。漏洞的解决方案:
PHP 4.1.0开始从提供功能set_error_handler()一个自定义错误处理句柄,但一些脚本知道。在众多的PHP论坛,我看到的只有一小部分的这种情况,set_error_handler使用如下:
字符串set_error_handler(回调error_handler {,int error_types })
现在我们使用自定义错误处理来过滤实际路径。
复制代码代码如下所示:
admin是管理员的身份决定,管理员是真的。
/ /自定义错误处理函数必须有4个输入变量errno errstr美元,美元,美元errfile,errline美元,否则无效。
功能my_error_handler($ errno,errstr美元美元美元,errfile,errline)
{
如果管理员/筛选实际路径
如果(!管理员)
{
errfile美元= str_replace(getcwd函数(),
errstr美元= str_replace(getcwd函数(),
}
开关($ errno)
{
Case E_ERROR:
回声错误:{ ID错误} errstr美元美元(线:errline美元美元errfile)
;
程序已停止运行,请与管理员联系;
在退出脚本时遇到错误级别错误
出口;
打破;
案例e_warning:
回声警告:{ ID错误} errstr美元美元(线:errline美元美元errfile)
;
打破;
违约:
无等级通知/错误显示
打破;
}
}
/ /错误处理设置my_error_handler功能
set_error_handler(my_error_handler );
…
这样,安全性和调试方便性之间的矛盾就可以很好地解决,你也可以花点时间把错误的提示变得更漂亮,以符合网站的风格:
(1)e_error,e_parse,e_core_error,e_core_warning,e_compile_error和e_compile_warning将不被处理的处理,即是,他们将以最原始的方式显示出来。然而,这些错误都是编译或PHP内核错误一般不会发生。
(2)当set_error_handler()的使用,error_reporting()会失败,所有的错误(除上述错误)给出了一个自定义函数的处理。
有关其他信息set_error_handler(),你可以参考PHP官方手册。
后的脆弱
1。漏洞成因:
前面已经说过,它是依靠register_globals登记变量的一个坏习惯。在一些留言本和论坛程序,它是检查之间的提交页面和时间间隔的方式更重要。为了防止灌水发帖和外部提交。让我们看看下面的消息的代码看起来:
复制代码代码如下所示:
…
= flt_tags美元($);
flt_tags text2 =美元($ 2);
正文= flt_tags美元($正文);
FD = fopen(美元数据。PHP
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
显然,如果我们提交网址后,phptext1 = testhahatext2 = testhahatext3 = testhaha。将数据写入文件正常。此程序不会检测变量的来源和方式浏览器获取页面。如果我们重复这个页面很多次,它会在洪水中发挥了作用。那里也有一些软件,利用这个漏洞做广告的论坛或留言簿。这是可耻的行为。我朋友的留言本在1周内满了10多页。
2。漏洞的解决方案:
在处理和存储数据,首先判断浏览器的方式获取页面。使用$ _server {request_method}变量得到的浏览器访问页面,检查它是否是后。在剧本中,会话是用来记录用户提交的数据是否通过正常途径(即是的,填写页面,提交内容),或者使用$ _server {http_referer}来检测,但它是不推荐的,因为有些浏览器不设置参考,有些防火墙也会屏蔽参考。此外,我们还必须检查提交的内容看数据库中存在任何重复。以留言本为例,使用会话来做决定。
为了填充内容的页面,我们添加到前端:
_session美元{ } =时间(allowgbookpost ); / /填写注册时间
在接收消息数据并保存的页面中,在进行数据处理之前,我们还使用会话处理以下处理:
复制代码代码如下所示:
如果(strtoupper($ _server {request_method})!= POST){死()错误:不要在外部提交它
如果(!isset($ _session {allowgbookpost ))或(时间()至_session {allowgbookpost} < 10)){死(错误:不提交在外面。);} / /检查消息填充时间
如果(isset($ _session {gbookposttime )},(时间()$ _session {gbookposttime} < 120){死(错误:两提交信息的间隔不得少于2分钟)。);} / /检查消息间隔
unset($ _session {allowgbookpost});对allowgbookpost变量 / /取消阻止填补多次提交页面
_session美元{ } =时间(gbookposttime );/ /注册时间发送信息,以防止恶意攻击或灌溉
…
数据处理与存储
1。漏洞成因:
包含是PHP站点中最常用的函数,它支持相对路径。有许多PHP脚本直接使用输入变量作为包含的参数,造成诸如任意引用脚本、绝对路径泄漏等漏洞,请看下面的代码:
…
includepage美元=美元_get {includepage};
包括($ includepage);
…
很明显,我们只需要提交不同的includepage变量来获取所需的网页。如果你提交的网页不存在,您可以使PHP脚本错误并揭示出真正的绝对路径(解决这个问题的办法是在下面的文章中解释)。
2。漏洞的解决方案:
此漏洞的解决方案非常简单,即确定页面是否存在,然后包含。或者更严格地说,数组用于指定包含文件:
复制代码代码如下所示:
pagelist美元=阵列(test1。PHP
如果(isset($ _get {includepage})) / /确定是否有includepage美元
{
includepage美元=美元_get {includepage};
foreach($ pagelist达调入)
{
如果($ includepage = = $调入)/检查文件是否在允许列表中
{
包括($调入);
checkfind美元=真;
打破;
}
}
如果($ checkfind = = true){ unset($ checkfind);}
否则{死()无效引用页!;}
}
这是解决这个问题的好办法。
提示:这个问题的功能是:需要(),(),()require_once include_once,ReadFile()等,并应注意写作。
不过滤输入变量
1。漏洞成因:
这个漏洞已经在ASP出现早,和无数的注入漏洞造成的。但因为PHP是影响力较小的时候,没有那么多的人能够注意,PHP,这个漏洞是比ASP更具影响力的因为有很多PHP脚本中使用的文本类型库。有,当然,对SQL注入问题。一个比较经典的例子,首先,是数据库:
复制代码代码如下所示:
ID =美元美元_get {id};
为查询=SELECT * FROM my_table id是,; ID美元/ /经典的SQL注入漏洞
结果= mysql_query美元($查询);
很明显,我们可以用注入来获取数据库的其他内容。这里没有更详细的描述,如ASP注入,您可以查看以前的黑防御。然后我们查看文本数据库的问题:
复制代码代码如下所示:
美元=美元_post { ,};
_post text2 =美元美元{正文};
$text3=$_POST{Text3};
FD = fopen(美元测试PHP 。
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
文本的漏洞,可以说是越来越严重。如果我们插入一个非常小的PHP代码在我们提交的变量,其他文本数据库test.php可以成为PHP后门。甚至将上传的代码允许我们上传一个完美的PHP后门。然后提出了特权,而服务器你的。
2。漏洞的解决方案:
这一漏洞的解决方案是非常简单的,它是严格过滤所有提交的变量。代替一些敏感的特点,我们可以用htmlspecialchars取代HTML内容()提供的PHP函数。这里是一个例子:
复制代码代码如下所示:
过滤器功能结构
功能flt_tags($文本)
{
$坏字眼=阵列(他妈的
为文本= RTrim($文本);
foreach($坏字眼达BadWord) /这里有词汇过滤
{
如果(stristr(合文本,美元= =真坏词)){死(错误:您提交的内容包含敏感词,请不要提交敏感内容。);}
}
文本= htmlspecialchars($ $ / /文本);HTML替换
要输入/替换的两行
文本= str_replace美元( R
美元( str_replace文本=
文本= str_replace美元(线;
文本= preg_replace美元( / / / 的{ 2 }
文本= preg_replace美元( / / T
如果((get_magic_quotes_gpc)){ $文本= stripslashes($文本);} / /如果magic_quotes开放,取代
返回$文本;
}
美元=美元_post { ,};
_post text2 =美元美元{正文};
正文=美元美元_post {正文};
所有输入过滤器
$text1=flt_tags ($text1);
flt_tags text2 =美元($ 2);
正文= flt_tags美元($正文);
FD = fopen(美元测试PHP 。
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
在一些替换和筛选器之后,您可以安全地将数据写入文本或数据库中。
管理员的判断是不完整的。
1。漏洞成因:
我们写脚本,PHP,这通常需要管理员权限。一些脚本只做一个是的判断,对管理员的权限,而往往忽略了无的判断。在PHP的配置文件,当打开的register_globals 4.2.0版本,默认是关闭的,但许多人打开它的方便。这是极其危险的行为。它会发生,提交的变量是冒充管理员。让我们在例子代码看:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
$ =真;
}
如果($){ 现在是管理员状态;}
它看起来像一个安全的样子,呵呵。现在我们假设register_globals在PHP的配置文件是开放的,我们提交了这样一个地址,test.php行政,真的,你看到了吗我们没有正确的cookie,但因为register_globals是开放的,管理变量我们提交自动注册是真实的。在剧本的判断力的缺失使得我们有可能得到管理员通过管理=真问题的权威存在于大多数网站和论坛。
2。漏洞的解决方案:
为了解决这个问题,我们只需要添加一个判断到脚本中的管理员。我们仍然认为register_globals在PHP的配置文件是开放的,看代码:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
$ =真;
}
其他的
{
$ = false;
}
如果($){ 现在是管理员状态;}
这样,即使攻击者提交管理=真正的变量没有正确的cookie,剧本也将设置为管理员在未来的判断错误。这解决了一些问题,但因为美元的管理员是一个变量,一个新的危机,可如果一个漏洞发生在未来的其他脚本引用可以被重新分配至admin.therefore触发,我们应该使用常数存储管理员的权限,定义()语句是用来定义一个管理员不断记录管理员的权限,后来,如果你指定一个重新分配,这就犯了一个错误,达到保护的目的。看看下面的代码:
复制代码代码如下所示:
cookiesign美元=admincookiesign ; / /确定管理cookie变量
adminsign美元=美元_cookie {标志}; / /获得用户的cookie变量
如果($ adminsign = = $ cookiesign)
{
定义(admin,true);
}
其他的
{
定义(admin,false);
}
如果(admin){现在是管理员状态;}
值得一提的是,我们使用了定义语句,所以在调用admin常量时,不习惯添加变量符号$,但是我们应该使用admin和admin。
文本数据库曝光
1。漏洞成因:
正如已经提到的,由于文本数据库是非常灵活的,没有外部的支持是必需的。此外,PHP是非常能够处理文件,所以文本数据库中广泛使用的PHP脚本。甚至有一些好的论坛程序使用一个文本数据库,但它已被丢失,和文本数据库的安全性也低于其他数据库。
2。漏洞的解决方案:
文本数据库,作为一个普通的文件,可以下载,像MDB。所以我们要保护MDB保护文本数据库,更改文本数据库to.php.and后缀名添加在数据库中的第一行。全文数据库将作为一个PHP文件并退出一线,是的,回到一个空的页保护文本数据库。
错误路径泄漏
1。漏洞成因:
当PHP遇到错误时,它给出错误脚本的位置、行数和原因,如:
注意:使用未定义的常数测试assumed'test'in D: interpub bigfly test.php线3
很多人说这没什么大不了的,但是揭示实际道路的后果是不可想象的。对于一些入侵者来说,这些信息是非常重要的,但事实上,有许多服务器存在这个问题。
一些网络管理员只需设置display_errors在PHP配置文件,但我认为这种方法太消极了。有时候,我们需要PHP返回的错误信息来调试。也可能需要给用户导航到其他页面,甚至当它是错的。
2。漏洞的解决方案:
PHP 4.1.0开始从提供功能set_error_handler()一个自定义错误处理句柄,但一些脚本知道。在众多的PHP论坛,我看到的只有一小部分的这种情况,set_error_handler使用如下:
字符串set_error_handler(回调error_handler {,int error_types })
现在我们使用自定义错误处理来过滤实际路径。
复制代码代码如下所示:
admin是管理员的身份决定,管理员是真的。
/ /自定义错误处理函数必须有4个输入变量errno errstr美元,美元,美元errfile,errline美元,否则无效。
功能my_error_handler($ errno,errstr美元美元美元,errfile,errline)
{
如果管理员/筛选实际路径
如果(!管理员)
{
errfile美元= str_replace(getcwd函数(),
errstr美元= str_replace(getcwd函数(),
}
开关($ errno)
{
Case E_ERROR:
回声错误:{ ID错误} errstr美元美元(线:errline美元美元errfile)
;
程序已停止运行,请与管理员联系;
在退出脚本时遇到错误级别错误
出口;
打破;
案例e_warning:
回声警告:{ ID错误} errstr美元美元(线:errline美元美元errfile)
;
打破;
违约:
无等级通知/错误显示
打破;
}
}
/ /错误处理设置my_error_handler功能
set_error_handler(my_error_handler );
…
这样,安全性和调试方便性之间的矛盾就可以很好地解决,你也可以花点时间把错误的提示变得更漂亮,以符合网站的风格:
(1)e_error,e_parse,e_core_error,e_core_warning,e_compile_error和e_compile_warning将不被处理的处理,即是,他们将以最原始的方式显示出来。然而,这些错误都是编译或PHP内核错误一般不会发生。
(2)当set_error_handler()的使用,error_reporting()会失败,所有的错误(除上述错误)给出了一个自定义函数的处理。
有关其他信息set_error_handler(),你可以参考PHP官方手册。
后的脆弱
1。漏洞成因:
前面已经说过,它是依靠register_globals登记变量的一个坏习惯。在一些留言本和论坛程序,它是检查之间的提交页面和时间间隔的方式更重要。为了防止灌水发帖和外部提交。让我们看看下面的消息的代码看起来:
复制代码代码如下所示:
…
= flt_tags美元($);
flt_tags text2 =美元($ 2);
正文= flt_tags美元($正文);
FD = fopen(美元数据。PHP
fwrite($ FD, Rtext1line美元美元美元;text2line;正文);
Fclose($ FD);
显然,如果我们提交网址后,phptext1 = testhahatext2 = testhahatext3 = testhaha。将数据写入文件正常。此程序不会检测变量的来源和方式浏览器获取页面。如果我们重复这个页面很多次,它会在洪水中发挥了作用。那里也有一些软件,利用这个漏洞做广告的论坛或留言簿。这是可耻的行为。我朋友的留言本在1周内满了10多页。
2。漏洞的解决方案:
在处理和存储数据,首先判断浏览器的方式获取页面。使用$ _server {request_method}变量得到的浏览器访问页面,检查它是否是后。在剧本中,会话是用来记录用户提交的数据是否通过正常途径(即是的,填写页面,提交内容),或者使用$ _server {http_referer}来检测,但它是不推荐的,因为有些浏览器不设置参考,有些防火墙也会屏蔽参考。此外,我们还必须检查提交的内容看数据库中存在任何重复。以留言本为例,使用会话来做决定。
为了填充内容的页面,我们添加到前端:
_session美元{ } =时间(allowgbookpost ); / /填写注册时间
在接收消息数据并保存的页面中,在进行数据处理之前,我们还使用会话处理以下处理:
复制代码代码如下所示:
如果(strtoupper($ _server {request_method})!= POST){死()错误:不要在外部提交它
如果(!isset($ _session {allowgbookpost ))或(时间()至_session {allowgbookpost} < 10)){死(错误:不提交在外面。);} / /检查消息填充时间
如果(isset($ _session {gbookposttime )},(时间()$ _session {gbookposttime} < 120){死(错误:两提交信息的间隔不得少于2分钟)。);} / /检查消息间隔
unset($ _session {allowgbookpost});对allowgbookpost变量 / /取消阻止填补多次提交页面
_session美元{ } =时间(gbookposttime );/ /注册时间发送信息,以防止恶意攻击或灌溉
…
数据处理与存储
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。