PHP中Header函数和PHP_AUTH_USER做用户验证
php Header PHP_AUTH_USER PHP_AUTH_PW 用戶驗證
在php中,可以使用Header函數做一些有趣的事情,用戶驗證就是其中一個很有意思的功能。具體用法:
Header("WWW-Authenticate: Basic realm="USER LOGIN"");Header("HTTP/1.0 401 Unauthorized");在頁首設計這兩個Header函數,頁面在載入前會出現一個登錄框,要求輸入用戶名和密碼。習慣了在頁面登錄的我們,是否覺得這樣的登錄很原始,又很新奇呢?
為了獲取從這個對話框中傳來的用戶名和密碼,需要用到php提供的兩個特殊變量$PHP_AUTH_USER和$PHP_AUTH_PW,要這樣使用這兩個特殊變量好像需要在php.ini中設置相關的選項,不然就只能像下面這樣引用:
$_SERVER['PHP_AUTH_USER']$_SERVER['PHP_AUTH_PW']獲取到用戶提交上來的用戶名和密碼之后,要怎樣處理邏輯就跟我們一般的程序處理沒有什么區別了。下面提供兩個例程供參考:
<?if(!isset($PHP_AUTH_USER)) {Header("WWW-authenticate: basic realm="XXX"");Header("HTTP/1.0 401 Unauthorized");$title="Login Instructions";?><blockquote>In order to enter this section of the web site, you must be an XXXsubscriber. If you are a subscriber and you are having trouble loggingin,please contact <a href="mailto:support@xxx.com">support@xxx.com</a>.</blockquote><?exit;} else {mysql_pconnect("localhost","nobody","") or die("Unable to connect toSQL server");mysql_select_db("xxx") or die("Unable to select database");$user_id=strtolower($PHP_AUTH_USER);$password=$PHP_AUTH_PW;$query = mysql_query("select * from users where user_id='$user_id' andpassword='$password'");if(!mysql_num_rows($query)) {Header("WWW-authenticate: basic realm="XXX"");Header("HTTP/1.0 401 Unauthorized");$title="Login Instructions";?><blockquote>In order to enter this section of the web site, you must be an XXXsubscriber. If you are a subscriber and you are having troublelogging in,please contact <a href="mailto:support@xxx.com">support@xxx.com</a>.</blockquote><?exit;}$name=mysql_result($query,0,"name");$email=mysql_result($query,0,"email");mysql_free_result($query);}?>來源頁面:http://www.weberdev.com/get_example-82.html
另外一個參考的例程:
<?php//assume user is not authenticated$auth = false;$user = $_SERVER['PHP_AUTH_USER'];$pass = $_SERVER['PHP_AUTH_PW'];if ( isset($user) && isset($pass) ){//connect to dbinclude 'db_connect.php';//SQL query to find if this entered username/password is in the db$sql = "SELECT * FROM healthed_workshop_admin WHEREuser = '$PHP_AUTH_USER' ANDpass = '$PHP_AUTH_PW'";//put the SQL command and SQL instructions into variable$result = mysql_query($sql) or die('Unable to connect.');//get number or rows in command; if more than 0, row is found$num_matches = mysql_num_rows($result);if ($num_matches !=0){//matching row found authenticates user$auth = true;}}if (!$auth){header('WWW-Authenticate: Basic realm="Health Ed Presentation Admin"');header('HTTP/1.0 401 Unauthorized');echo 'You must enter a valid username & password.';exit;}else{echo 'Success!';}?>?
?PHP 的 HTTP 認證機制僅在 PHP 以 Apache 模塊方式運行時才有效,因此該功能不適用于 CGI 版本。在 Apache 模塊的 PHP 腳本中,可以用 header() 函數來向客戶端瀏覽器發送“Authentication Required”信息,使其彈出一個用戶名/密碼輸入窗口。當用戶輸入用戶名和密碼后,包含有 URL 的 PHP 腳本將會再次和預定義變量 PHP_AUTH_USER、PHP_AUTH_PW 和 AUTH_TYPE 一起被調用,這三個變量分別被設定為用戶名,密碼和認證類型。預定義變量保存在 $_SERVER 或者 $HTTP_SERVER_VARS 數組中。系統僅支持“基本的”認證
<?php $authorization = false; if($_SERVER['PHP_AUTH_USER'] == "admin" && $_SERVER['PHP_AUTH_PW'] == "admin888"){echo "login";$authorization = true;exit; } if(!$authorization){header("WWW-Authenticate:Basic realm='Private'");header('HTTP/1.0 401 Unauthorized');print "You are unauthorized to enter this area."; } ?>1.實現說明
怎么樣,看到上面的代碼了吧,就這么幾行添加到你的程序頁面上就可以實現了.
它是通過利用header()函數向客戶端瀏覽器發送”Authentication Required”信息,強制其彈出一個用戶名/密碼輸入窗口,當用戶輸入用戶名和密碼后,包含有URL的PHP腳本將會加上預定義變量PHP_AUTH_USER, PHP_AUTH_PW和AUTH_TYPE然后再次調用,這三個變量分別表示用戶名,密碼和認證類型(從PHP5.0.1起開始支持”Basic”和”Digest”兩種認證方式),它們被保存在$_SERVER(從HP>>4.1.0起有效)或$HTTP_SERVER_VARS(從PHP3起有效)數組中具體應用時,我們可以把驗證的幾行代碼寫成函數,只要判斷到用戶變量不存在或驗證不正確就一直執行該函數并彈出窗口,而且還可以設置錯誤登錄幾次就不允許該用戶訪問,具體的使用大家使勁的發散思考吧.
2.注意事項:
我們在使用PHP實現HTTP認證機制時還有幾點問題我們是需要注意的:
1.這段代碼必須放到程序的開始,且在其開始執行之前不能有任何輸出(若有輸出則
需要使用輸出緩沖函數才行).
2.PHP的HTTP認證機制僅在PHP以Apache模塊方式運行時才有效,這個容易理解,它本身是HTTP強制認證,肯定是不適合于CGI版本,不能在命令行下執行的.
3.header發送標頭代碼時請小心.為了對所有的客戶端保證兼容性,關鍵字”Basic”的第一個字母必須大寫為”B”,分界字符串必須用雙引號引用(不能是單引號);在HTTP/1.0和401之間必須有且僅有一個空格.
4.在上面列子中,僅輸出了用戶名和密碼,而在實際系統中則可按照登錄驗證流程進行與數據庫或其他方式進行判斷和驗證.
5.從PHP4.3.0起,為防止有人通過編寫腳本來從頁面上獲取密碼,當外部認證對特定頁面有效,并且安全模式被開啟時,PHP_AUTH變量將不會被設置.可以用REMOTE_USER來辨別外部認證的用戶,用AuthType指令來判斷外部認證機制是否有效.
6.要想讓HTTP認證能夠在IIS下工作,PHP配置選項cgi.rfc2616_headers必須設置為0(默認值).
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的PHP中Header函数和PHP_AUTH_USER做用户验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对公账户注销流程
- 下一篇: PHP面向对象基础总结