在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

(轉)用PHP 4.2書寫安全的腳本!

(轉)用PHP 4.2書寫安全的腳本!

更新時間:2022-04-27 文章作者:未知 信息來源:網絡 閱讀次數:

原著:Kevin Yank轉自:www.linuxforum.net (恭喜再此開通)

在很長一段時間內,PHP作為服務器端腳本語言的最大賣點之一就是會為從表單提交的值自動建立一個全局變量。在PHP 4.1中,PHP的制作者們推薦了一個訪問提交數據的替代手段。在PHP 4.2中,他們取消了那種老的做法!正如我將在這篇文章中解釋的那樣,作出這樣的變化的目的是出于安全性的考慮。我們將研究PHP在處理表單提交及其它數據時的新的做法,并說明為什么這樣做會提高代碼的安全性。

這里有什么錯誤?

看看下面的這段PHP腳本,它用來在輸入的用戶名及口令正確時授權訪問一個Web頁面:
<?php
// 檢查用戶名及口令
if ($username == 'kevin' and $password == 'secret')
$authorized = true;
?>
<?php if (!$authorized): ?>
<!-- 未授權的用戶將在這里給予提示 -->
<p>Please enter your username and password:</p>
<form action="<?=$PHP_SELF?>" method="POST">
<p>Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" /></p>
</form>
<?php else: ?>
<!-- 有安全要求的HTML內容 -->
<?php endif; ?>
OK,我相信大約半數的讀者會不屑的說“太愚蠢了-- 我不會犯這樣的錯誤的!”但是我保證有很多的讀者會想“嗨,沒什么問題啊,我也會這么寫的!”當然還會有少數人會對這個問題感到困惑(“什么是PHP?”)。PHP被設計為一個“好的而且容易的”腳本語言,初學者可以在很短的時間內學會使用它;它也應該能夠避免初學者犯上面的錯誤。
再回到剛才的問題,上面的代碼中存在的問題是你可以很容易地獲得訪問的權力,而不需要提供正確的用戶名和口令。只在要你的瀏覽器的地址欄的最后添加?authorized=1。因為PHP會自動地為每一個提交的值創建一個變量 -- 不論是來自動一個提交的表單、URL查詢字符串還是一個cookie -- 這會將$authorized設置為1,這樣一個未授權的用戶也可以突破安全限制。
那么,怎么簡單地解決這個問題呢?只要在程序的開頭將$authorized默認設置為false。這個問題就不存在了!$authorized是一個完全在程序代碼中創建的變量;但是為什么開發者得為每一個惡意的用戶提交的變量擔心呢?

PHP 4.2作了什么改變?

在PHP 4.2中,新安裝的PHP中的register_globals選項默認為關閉,因此EGPCS值(EGPCS是Environment、Get、Post、Cookies、Server的縮寫 -- 這是PHP中外部變量來源的全部范圍)不會被作為全局變量來創建。當然,這個選項還可以通過手工來開啟,但是PHP的開發者推薦你將其關閉。要貫徹他們的意圖,你需要使用其它的方法來獲取這些值。
從PHP 4.1開始,EGPCS值就可以從一組指定的數組中獲得:
$_ENV -- 包含系統環境變量
$_GET -- 包含查詢字符串中的變量,以及提交方法為GET的表單中的變量
$_POST -- 包含提交方式為POST的表單中的變量
$_COOKIE -- 包含所有cookie變量
$_SERVER -- 包含服務器變量,例如HTTP_USER_AGENT
$_REQUEST -- 包含$_GET、$_POST和$_COOKIE的全部內容
$_SESSION -- 包含所有已注冊的session變量
在PHP 4.1之前,當開發者關閉register_globals選項(這也被考慮為提高PHP性能的一種方法)后,必須使用諸如$HTTP_GET_VARS這樣的令人討厭的名字來獲取這些變量。這些新的變量名不僅僅短,而且它們還有其他優點。
首先,讓我們在PHP 4.2中(也就是說關閉register_globals 選項)重寫上面提到的代碼:
<?php
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];

// 檢查用戶名和口令
if ($username == 'kevin' and $password == 'secret')
$authorized = true;
?>
<?php if (!$authorized): ?>
<!-- 未授權的用戶將在這里給予提示 -->
<p>Please enter your username and password:</p>
<form action="<?=$PHP_SELF?>" method="POST">
<p>Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" /></p>
</form>
<?php else: ?>
<!-- 有安全要求的HTML內容 -->
<?php endif; ?>
正如你看到的,我所需要做的只是在代碼的開始增加下面兩行:
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
因為我們希望用戶名和密碼是由用戶提交的,所以我們從$_REQUEST數組中獲取這些值。使用這個數組使得用戶可以自由選擇傳遞方式:通過URL查詢字符串(例如允許用戶創建書簽時自動輸入他們的證書)、通過一個提交的表單或者是通過一個cookie。如果你想要限制只能通過表單提交證書(更精確地說,是通過HTTP POST請求),你可以使用$_POST數組:
$username = $_POST['username'];
$password = $_POST['password'];
除了“引入”這兩個變量以外,程序代碼沒有任何改變。簡單地關閉register_globals選項促使開發者更進一步了解哪些數據是來自外部的(不可信任的)資源。
請注意這里還有一個小問題:PHP中默認的error_reporting設置仍然是E_ALL & ~E_NOTICE,因此如果“username”和“password”這兩個值沒有被提交,試圖從$_REQUEST數組或$_POST數組中獲得這兩個值并不會招致任何錯誤信息。如晨不你的PHP程序需要嚴格的錯誤檢查,你還需要增加一些代碼以首先檢查這些變量。

但是這是不是意味著更多的輸入?

是的,在象上面這樣的簡單程序中,使用PHP 4.2常常會增加輸入量。但是,還是看看光明的一面吧 -- 你的程序終究是更安全了!
不過認真的說,PHP的設計者并沒有完全忽視你的痛苦。在這些新數組中有一個特殊的其它所PHP變量都不具備的特征,它們是完全的全局變量。這對你有什么幫助呢?讓我們先對我們的示例進行一下擴充。
為了使得站點中的多個頁面可以使用用戶名/口令論證,我們將我們用戶認證程序寫到一個include文件(protectme.php)中:
<?php /* protectme.php */
function authorize_user($authuser, $authpass)
{
$username = $_POST['username'];
$password = $_POST['password'];
// 檢查用戶名和口令
if ($username != $authuser or $password != $authpass):
?>
<!-- 未授權的用戶將在這里給予提示 -->
<p>Please enter your username and password:</p>
<form action="<?=$PHP_SELF?>" method="POST">
<p>Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" /></p>
</form>
<?php
exit();
endif;
}
?>
現在,我們剛才的頁面看上去將是這樣的:
<?php
require('protectme.php');
authorize_user('kevin','secret');
?>
<!-- 有安全要求的HTML內容 -->
很簡單,很清晰明了,對不對?現在是考驗你的眼力和經驗的時候了 -- 在authorize_user 函數中少了什么?
在函數中沒有申明$_POST是一個全局變量!在php 4.0中,當register_globals開啟時,你需要增加一行代碼以在函數中獲取$username和$password變量:
function authorize_user($authuser, $authpass)
{
global $username, $password;
...
在PHP中,和其它具有類似語法的語言不同,函數外的變量在函數中不能自動獲得,你需要象上面所說明的那樣增加一行以指定其來自global范圍。
在PHP 4.0中,當關閉register_globals以提供安全性時,你可以使用$HTTP_POST_VARS數組以獲得你的表單提交的值,但是你還是需要從全局范圍導入這個數組:
function authorize_user($authuser, $authpass)
{
global $HTTP_POST_VARS;
$username = $HTTP_POST_VARS['username'];
$password = $HTTP_POST_VARS['password'];
但是在PHP 4.1及以后的版本中,特殊的$_POST變量(以及上面提到的其它變量)可以在所有范圍內使用。這就是不需要在函數中申明$_POST變量是一個全局變量的原因:
function authorize_user($authuser, $authpass)
{
$username = $_POST['username'];
$password = $_POST['password'];

這對session有什么影響?

特殊的$_SESSION數組的引入實際上有助于簡化session代碼。你不需要將session變量申明為全局變量,然后再去留意哪些變量被注冊了,你現在可以簡單地從$_SESSION['varname']中引用你所有的session變量。
現在讓我們來看看另一個用戶認證的例子。這一次,我們使用sessions以標志一個在你的網站繼續逗留的用戶已經經過了用戶認證。首先,我們來看看PHP 4.0版本(開啟register_globals):
<?php
session_start();
if ($username == 'kevin' and $password == 'secret')
{
$authorized = true;
session_register('authorized');
}
?>
<?php if (!$authorized): ?>
<!-- 顯示HTML表單以提示用戶登錄 -->
<?php else: ?>
<!-- 有安全要求的HTML內容 -->
<?php endif; ?>
和剛開始的程序一樣,這個程序也存在安全漏洞,在URL的最后加上?authorized=1可以繞過安全措施直接訪問頁面內容。開發者可以將$authorized視為一個session變量而忽視了可以很容易地通過用戶輸入設置同樣的變量。
當我們增加了我們的特殊的數組(PHP 4.1)并關閉register_globals(PHP 4.2)后,我們的程序將是這樣的:
<?php
session_start();
if ($username == 'kevin' and $password == 'secret')
$_SESSION['authorized'] = true;
?>
<?php if (!$_SESSION['authorized']): ?>
<!-- 顯示HTML表單以提示用戶登錄 -->
<?php else: ?>
<!-- 有安全要求的HTML內容 -->
<?php endif; ?>
是不是更加簡單了?你不再需要再將普通的變量注冊為一個session變量,你只需要直接設置session變量(在$_SESSION數組中),然后用同樣的方法使用它。程序變得更短了,而且對于什么變量是session變量也不會引起混亂!

總結

在這篇文章中,我解釋了PHP腳本語言作出改變的深層原因。在PHP 4.1中,添加了一組特殊數據以訪問外部數據。這些數組可以在任何范圍內調用,這使得外部數據的訪問更方便。在PHP 4.2中,register_globals被默認關閉以鼓勵使用這些數組以避免無經驗的開發者編寫出不安全的PHP代碼。


--------------------
我相信對大家會有幫助的~

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 欧美不卡在线播放| 免费在线a视频| 国产 日韩 亚洲 欧美| 手机精品视频在线| 无码人妻丰满熟妇区毛片18| 91小视频在线播放| 91av视频免费观看| xxxx18hd亚洲hd捆绑| 成人免费视频91| 热99这里只有精品| 日韩 欧美 视频| 无码人妻精品一区二区三区99v| 嫩草av久久伊人妇女超级a| 欧美爱爱视频免费看| 久草视频这里只有精品| 日韩视频免费在线播放| 国产二区视频在线| 97超碰免费观看| 日韩高清第一页| 国产精品专区在线| 婷婷五月综合缴情在线视频| 久久久久国产一区| 国产主播自拍av| 四虎影院一区二区| 国产三级国产精品国产专区50| 最近中文字幕一区二区| 男女裸体影院高潮| 爱福利视频一区二区| 91 视频免费观看| 我的公把我弄高潮了视频| 国产精品12p| 亚洲一级片网站| koreanbj精品视频一区| 日本爱爱免费视频| 永久免费网站视频在线观看| 久久精品网站视频| 999精品网站| 2021狠狠干| 成人高清在线观看视频| 美国av在线播放| 亚洲第一天堂久久| 最新黄色av网站| 免费cad大片在线观看| 久热免费在线观看| 亚洲欧美日韩综合网| 日本网站在线看| 欧美极品少妇无套实战| 日本大胆人体视频| 国产成人一区二区三区别| 17c丨国产丨精品视频| av高清在线免费观看| 亚洲视频在线不卡| 日韩一级片免费视频| 国产高清不卡无码视频| 干日本少妇视频| 色婷婷一区二区三区在线观看| 一区二区久久精品| 无码毛片aaa在线| 中文字幕国产高清| 9色porny| 亚洲色图欧美自拍| 精品少妇在线视频| 亚洲不卡中文字幕无码| 亚洲一二区在线观看| 四虎成人在线播放| 日本中文字幕精品—区二区| 日韩a∨精品日韩在线观看| 亚洲一二三区av| 久久精品国产精品亚洲色婷婷| 奇米777在线| 老子影院午夜伦不卡大全| 中国黄色录像片| 99er在线视频| 日韩极品视频在线观看| 欧美这里只有精品| 亚洲欧洲日产国码无码久久99 | 亚洲高清在线不卡| 欧美人与动牲交xxxxbbbb| wwwwww欧美| 波多野结衣 作品| 国产欧美精品aaaaaa片| 欧美视频亚洲图片| 三级黄色片免费看| 欧美日韩精品区别| 免费一级特黄毛片| 强开小嫩苞一区二区三区网站| 免费在线观看的毛片| 午夜剧场高清版免费观看| 久久观看最新视频| 午夜免费福利网站| 人人妻人人澡人人爽欧美一区双 | 2018国产在线| 免费国产a级片| 超碰人人爱人人| 亚洲一区日韩精品| 欧美日韩亚洲自拍| 99999精品视频| 一级特黄性色生活片| 亚洲视频在线a| 91高清国产视频| 久久精品无码中文字幕| 久久久久久免费看| 亚洲精品高清无码视频| 欧美 日韩 国产 高清| 黄网站色视频免费观看| 国产a视频免费观看| 五十路熟女丰满大屁股| 成人在线免费观看av| 蜜桃传媒一区二区三区| 91亚洲精品久久久蜜桃借种| 日韩中文字幕免费在线| 人人妻人人澡人人爽精品欧美一区| 国产二级片在线观看| 日本三日本三级少妇三级66| 97国产精东麻豆人妻电影| heyzo国产| 亚洲天堂网2018| 国产免费视频传媒| 青青青青草视频| 黑人糟蹋人妻hd中文字幕| 亚洲精品第三页| 国产一区二区四区| 日韩高清第一页| 九九久久九九久久| 国产av不卡一区二区| 亚洲自拍偷拍一区二区三区| 依人在线免费视频| 久久久国产欧美| 黄色三级视频在线| 日韩欧美视频网站| 自慰无码一区二区三区| 99999精品视频| 先锋影音男人资源| 亚洲人视频在线| www.com久久久| 奇米影音第四色| 国产福利影院在线观看| 日韩亚洲在线视频| av免费网站观看| 欧美日韩中文不卡| 美国av在线播放| 国产男女免费视频| 免费看污污网站| 日本一道在线观看| 免费看一级大黄情大片| 成人免费观看视频在线观看| 菠萝蜜视频在线观看入口| 天天干天天色天天干| 99视频在线视频| dy888午夜| 情侣黄网站免费看| 日本欧美黄色片| 欧美 日韩 国产在线观看| 国产九九九九九| 999精彩视频| 免费久久久久久| 日本毛片在线免费观看| 久久久久久三级| 黄色成人在线免费观看| 国产 欧美 日本| xxx中文字幕| 日本在线播放一区二区| 成人久久久久久久久| 久久精品网站视频| 日本免费色视频| 中文字幕在线视频一区二区| 奇米视频7777| 日本三级中文字幕在线观看| 亚洲av毛片在线观看| 黄色网络在线观看| 久艹视频在线免费观看| av免费播放网址| 国产精品自在自线| 岛国大片在线播放| 自拍偷拍 国产| 懂色av一区二区三区四区五区| 欧美少妇在线观看| 手机看片福利盒子久久| 中文字幕第38页| www.国产在线播放| a√天堂在线观看| 成人午夜视频免费在线观看| 农民人伦一区二区三区| 欧美 日韩 激情| 91看片在线免费观看| 日本www.色| 自拍日韩亚洲一区在线| 热久久精品免费视频| 手机av在线免费| 国产原创popny丨九色| 污污网站在线观看视频| 精品无码国产一区二区三区av| 白嫩少妇丰满一区二区| 国产精品自拍合集| 福利网在线观看| 国产高潮呻吟久久久| 国产三级生活片| 超碰在线资源站| 黄色a级三级三级三级| 亚洲一区二区偷拍|