电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

用PHP 4.2書寫安全的腳本

瀏覽:4日期:2024-01-25 13:50:36
原著: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代碼。;
標簽: PHP
主站蜘蛛池模板: 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 柔软云母板-硬质-水位计云母片组件-首页-武汉长丰云母绝缘材料有限公司 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | 杰恒蠕动泵-蠕动泵专业厂家-19年专注蠕动泵 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 运动木地板_体育木地板_篮球馆木地板_舞台木地板-实木运动地板厂家 | 气体检测仪-氢气检测仪-可燃气体传感器-恶臭电子鼻-深国安电子 | 生物制药洁净车间-GMP车间净化工程-食品净化厂房-杭州波涛净化设备工程有限公司 | 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 杭州ROHS检测仪-XRF测试仪价格-百科 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格]| 膏剂灌装旋盖机-眼药水灌装生产线-西林瓶粉剂分装机-南通博琅机械科技 | 农产品溯源系统_农产品质量安全追溯系统_溯源系统 | 杭州网络公司_百度SEO优化-外贸网络推广_抖音小程序开发-杭州乐软科技有限公司 | 不锈钢水箱厂家,不锈钢保温水箱-山东桑特供水设备 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 澳洁干洗店加盟-洗衣店干洗连锁「澳洁干洗免费一对一贴心服务」 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 威廉希尔WilliamHill·足球(中国)体育官方网站 | 小型铜米机-干式铜米机-杂线全自动铜米机-河南鑫世昌机械制造有限公司 | 氧化铁红厂家-淄博宗昂化工 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 上海质量认证办理中心| 烘箱-工业烘箱-工业电炉-实验室干燥箱 - 苏州华洁烘箱制造有限公司 | 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 河北凯普威医疗器材有限公司,高档轮椅系列,推车系列,座厕椅系列,协步椅系列,拐扙系列,卫浴系列 | 南京和瑞包装有限公司 | 琉璃瓦-琉璃瓦厂家-安徽盛阳新型建材科技有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 |