变量虚拟主机问题之用PHP 4.2书写安全的脚本

php虚拟主机  时间:2020-12-28  阅读:()

虚拟主机问题之用PHP4.2书写安全的脚本

虚拟主机问题之用PHP4.2书写安全的脚本

在很长一段时间内 PHP作为服务

在很长一段时间内 PHP作为服务器端脚本语言的最大卖点之一就是会为从表单提交的值自动建立一个全局变量。在PHP4.1中 PHP 的制作者们推荐了一个访问提交数据的替代手段。在PHP4.2中他们取消了那种老的做法正如我将在这篇文章中解释的那样作出这样的变化的目的是出于安全性的考虑。我们将研究PHP在处理表单提交及其它数据时的新的做法并说明为什么这样做会提高代码的安全性。

这里有什么错误

看看下面的这段PHP脚本它用来在输入的用户名及口令正确时授权访问一个Web页面 <?php

//检查用户名及口令if($username==‘kevin’and$password==’secret’)

$authorized=true;

?>

<?phpif( !$authorized):?>

< ! –未授权的用户将在这里给予提示–>

<p>Pleaseenteryourusernameandpassword:</p>

<formaction=”<?=$PHP_SELF?>”method=”POST”>———————————————————————————————————————————————

<p>Username:<inputtype=”text”name=”username”/><br/>

Password:<inputtype=”password”name=”password”/><br/>

<inputtype=”submit”/></p>

</form>

<?phpelse:?>

< ! –有安全要求的HTML内容–>

<?phpendif;?>

OK我相信大约半数的读者会不屑的说“太愚蠢了–我不会犯这样的错误的”但是我保证有很多的读者会想“嗨没什么问题啊我也会这么写的”当然还会有少数人会对这个问题感到困惑( “什么是PHP ” ) 。 PHP被设计为一个“好的而且容易的”脚本语言初学者可以在很短的时间内学会使用它它也应该能够避免初学者犯上面的错误。

再回到刚才的问题上面的代码中存在的问题是你可以很容易地获得访问的权力而不需要提供正确的用户名和口令。只在要你的浏览器的地址栏的最后添加?authorized=1。因为PHP会自动地为每一个提交的值创建一个变量—不论是来自动一个提交的表单、 URL查询字符串还是一个cookie—这会将$authorized设置为1这样一个未授权的用户也可以突破安全限制。

———————————————————————————————————————————————

那么怎么简单地解决这个问题呢只要在程序的开头将$authorized默认设置为false。这个问题就不存在了 $authorized是一个完全在程序代码中创建的变量但是为什么开发者得为每一个恶意的用户提交的变量担心呢

PHP4.2作了什么改变

在PHP4.2中新安装的PHP中的register_globals选项默认为关闭因此EGPCS值(EGPCS是Environment、Get、 Post、 Cookies、 Server 的缩写—这是PHP中外部变量来源的全部范围)不会被作为全局变量来创建。当然这个选项还可以通过手工来开启但是PHP的开发者推荐你将其关闭。要贯彻他们的意图你需要使用其它的方法来获取这些值。从PH P4.1开始 EGPCS值就可以从一组指定的数组中获得

$_ENV—包含系统环境变量

$_G ET—包含查询字符串中的变量 以及提交方法为G ET的表单中的变量

$_POST—包含提交方式为POST的表单中的变量

$_COOKIE—包含所有cookie变量

$_SERVER—包含服务器变量例如HTTP_USER_AGENT

$_REQUEST—包含$_GET、 $_POST和$_COOKI E的全部内容

$_SESSION—包含所有已注册的session变量

在PHP4.1之前 当开发者关闭register_globals选项(这也被考虑为提高PHP性能的一种方法)后必须使用诸如$HTTP_GET_VARS这样的令人讨厌的名字来获取这些变量。这些新的变量名不仅仅短而且———————————————————————————————————————————————

它们还有其他优点。

首先让我们在PHP4.2中(也就是说关闭register_globals选项)重写上面提到的代码 <?php

$username=$_REQUEST['username'];

$password=$_REQUEST['password'];

//检查用户名和口令if($username==‘kevin’and$password==’secret’)

$authorized=true;

?>

<?phpif( !$authorized):?>

< ! –未授权的用户将在这里给予提示–>

<p>Pleaseenteryourusernameandpassword:</p>

<formaction=”<?=$PHP_SELF?>”method=”POST”><p>Username:<inputtype=”text”name=”username”/><br/>

Password:<inputtype=”password”name=”password”/><br/>

<inputtype=”submit”/></p>

</form>

<?phpelse:?>

< ! –有安全要求的HTML内容–>

———————————————————————————————————————————————

<?phpendif;?>

正如你看到的我所需要做的只是在代码的开始增加下面两行

$username=$_REQUEST['username'];

$password=$_REQUEST['password'];

因为我们希望用户名和密码是由用户提交的所以我们从$_REQUEST数组中获取这些值。使用这个数组使得用户可以自由选择传递方式通过URL查询字符串(例如允许用户创建书签时自动输入他们的证书)、通过一个提交的表单或者是通过一个cookie。如果你想要限制只能通过表单提交证书(更精确地说是通过HTTP POST请求)你可以使用$_PO ST数组

$username=$_POST['username'];

$password=$_POST['password'] ;

除了“引入”这两个变量以外程序代码没有任何改变。简单地关闭register_globals选项促使开发者更进一步了解哪些数据是来自外部的(不可信任的)资源。

请注意这里还有一个小问题 PHP中默认的error_reporting设置仍然是E_ALL&~E_NOTICE因此如果“username”和“password”这两个值没有被提交试图从$_REQUEST数组或$_POST数组中获得这两个值并不会招致任何错误信息。如晨不你的PHP程序需要

严格的错误检查你还需要增加一些代码以首先检查这些变量。

但是这是不是意味着更多的输入

是的在象上面这样的简单程序中使用PHP4.2常常会增加输———————————————————————————————————————————————

入量。但是还是看看光明的一面吧—你的程序终究是更安全了

不过认真的说 PHP的设计者并没有完全忽视你的痛苦。在这些新数组中有一个特殊的其它所PHP变量都不具备的特征它们是完全的全局变量。这对你有什么帮助呢让我们先对我们的示例进行一下扩充。

为了使得站点中的多个页面可以使用用户名/口令论证我们将我们用户认证程序写到一个include文件(protectme.php)中

<?php/*protectme.php*/functionauthorize_user($authuser,$authpass)

{

$username=$_POST['username'];

$password=$_POST['password'];

//检查用户名和口令if($username!=$authuseror$password!=$authpass):

?>

< ! –未授权的用户将在这里给予提示–>

<p>Pleaseenteryourusernameandpassword:</p>

<formaction=”<?=$PHP_SELF?>”method=”POST”><p>Username:<inputtype=”text”name=”username”/><br/>

———————————————————————————————————————————————

Password:<inputtype=”password”name=”password”/><br/>

<inputtype=”submit”/></p>

</form>

<?php exit();endif;

}

?>

现在我们刚才的页面看上去将是这样的

<?php require(’protectme.php’);authorize_user(’kevin’,’secret’);

?>

< ! –有安全要求的HTML内容–>

很简单很清晰明了对不对现在是考验你的眼力和经验的时候了—在authorize_user函数中少了什么

在函数中没有申明$_POST是一个全局变量在ph p4.0中当register_globals开启时你需要增加一行代码以在函数中获取$username和$password变量functionauthorize_user($authuser,$authpass)

{global$username,$password;

———————————————————————————————————————————————

在PHP中和其它具有类似语法的语言不同函数外的变量在函数中不能自动获得你需

要象上面所说明的那样增加一行以指定其来自global范围。

在PHP4.0中 当关闭register_globals以提供安全性时你可以使用$HTTP_POST_VARS数组以获得你的表单提交的值但是你还是需要从全局范围导入这个数组functionauthorize_user($authuser,$authpass)

{global$HTTP_POST_VARS;

$username=$HTTP_POST_VARS['username'];

$password=$HTTP_POST_VARS['password'];

但是在PH P4.1及以后的版本中特殊的$_POST变量(以及上面提到的其它变量)可以在所有范围内使用。这就是不需要在函数中申明$_POST变量是一个全局变量的原因functionauthorize_user($authuser,$authpass)

{

$username=$_POST['username'];

$password=$_POST['password'];

这对session有什么影响

特殊的$_SESSION数组的引入实际上有助于简化session代码。你不需要将sess ion变量申明为全局变量然后再去留意哪些变量被注———————————————————————————————————————————————

册了你现在可以简单地从$_SESSION['varname']中引用你所有的session变量。

现在让我们来看看另一个用户认证的例子。这一次我们使用sessions以标志一个在你的网站继续逗留的用户已经经过了用户认证。首先我们来看看PHP4.0版本(开启register_globals) 

<?php session_start();if($username==‘kevin’and$password==’secret’)

{

$authorized=true;session_register(’authorized’);

}

?>

<?phpif( !$authorized):?>

< ! –显示HTML表单以提示用户登录–>

<?phpelse:?>

< ! –有安全要求的HTML内容–>

<?phpendif;?>

和刚开始的程序一样这个程序也存在安全漏洞在URL的最后加上?authorized=1可以绕过安全措施直接访问页面内容。开发者可以将$authorized视为一个session变量而忽视了可以很容易地通过用户输入设置同样的变量。

———————————————————————————————————————————————

PacificRack 端午节再来一款年付$38 VPS主机 2核4GB内存1TB流量

这不端午节和大家一样回家休息几天,也没有照顾网站的更新。今天又出去忙一天没有时间更新,这里简单搜集看看是不是有一些商家促销活动,因为我看到电商平台各种推送活动今天又开始一波,所以说现在的各种促销让人真的很累。比如在前面我们也有看到PacificRack 商家发布过年中活动,这不在端午节(昨天)又发布一款闪购活动,有些朋友姑且较多是端午节活动,刚才有看到活动还在的,如果有需要的朋友可以看看。第一、端...

欧路云(22元) 新增美国Cera线路VPS主机且可全场8折

欧路云(oulucloud) 商家在前面的文章中也有陆续介绍过几次,这不今天有看到商家新增加美国Cera线路的VPS主机,而且有提供全场八折优惠。按照最低套餐最低配置的折扣,月付VPS主机低至22元,还是比较便宜的。不过我们需要注意的是,欧路云是一家2021年新成立的国人主机商,据说是由深圳和香港的几名大佬创建。如果我们有介意新商家的话,选择的时候谨慎且月付即可,注意数据备份。商家目前主营高防VP...

vdsina:俄罗斯VPS(datapro),6卢布/天,1G内存/1核(AMD EPYC 7742)/5gNVMe/10T流量

今天获得消息,vdsina上了AMD EPYC系列的VDS,性价比比较高,站长弄了一个,盲猜CPU是AMD EPYC 7B12(经过咨询,详细CPU型号是“EPYC 7742”)。vdsina,俄罗斯公司,2014年开始运作至今,在售卖多类型VPS和独立服务器,可供选择的有俄罗斯莫斯科datapro和荷兰Serverius数据中心。付款比较麻烦:信用卡、webmoney、比特币,不支持PayPal...

php虚拟主机为你推荐
vps虚拟主机VPS主机、虚拟主机和云主机 它们之间有什么区别?它们哪一个比较好?asp主机请问虚似主机和Asp服务器软件都是一个意思吗vps试用请问有什么网站可以提供免费vps试用的?想用它来刷一下外国pt站域名主机什么是域名主机国内免费空间免费空间哪个好用免备案虚拟主机请问哪里好一点的免备案的虚拟主机?虚拟主机控制面板万网的虚拟主机控制面板指的是什么呢?1g虚拟主机1G虚拟空间大约多少钱?河南虚拟主机谁那有好的虚拟主机?中文域名中文域名有哪写类型?
网页空间租用 域名主机基地 过期域名抢注 重庆服务器托管 国外主机 vps.net 全球付 域名优惠码 免费网络电视 网盘申请 绍兴高防 vip购优汇 空间登陆首页 免费ftp lamp什么意思 葫芦机 谷歌搜索打不开 蓝队云 qq空间打开很慢 alexa搜 更多