Forum und email

אימות HTTP בעזרת PHP.

אימות HTTP ב PHP , עובד רק עם מודול Apache , ולכן לא יעבוד בגירסת ה CGI . במודול של Apache בסקריפטים של PHP , יש אפשרות להתשמש בתכונת ה header() על מנת לשלוח "בקשת אימות" - "Authentication Required", לדפדפן הלקוח, שתגרום לו להקפיץ את חלון ה"שם\סיסמא". אחרי שהמשתמש מילא את הנתונים, הכתובת URL שמכילה את הסקריפט תיקרא שוב, עם ה PHP script will be called again with the משתנים שמוגדרים מראש PHP_AUTH_USER, PHP_AUTH_PW, ו AUTH_TYPE בהם מוזנים , שם המשתמש, הסיסמא, וסוג האימות. המשתנים האלה נמצאים במערך$_SERVERובמערך $HTTP_SERVER_VARS . רק אימות "בסיסי" נתמך. ראה את הפונקציות על header() למידע נוסף.

Note: הערת גירסה של PHP. Autoglobals, כמו$_SERVER, התחילו להיות זמנים החל מגירסה» 4.1.0. $HTTP_SERVER_VARS התחיל להיות זמין החל מ PHP 3.

דוגמא לקטע קוד שיכפה אימות על הלקוח, במהלך ריצת העמוד

Example#1 דוגמא לאימות HTTP .

<?php
  
if (!isset($_SERVER['PHP_AUTH_USER'])) {
    
header('WWW-Authenticate: Basic realm="My Realm"');
    
header('HTTP/1.0 401 Unauthorized');
    echo 
'Text to send if user hits Cancel button';
    exit;
  } else {
    echo 
"<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
    echo 
"<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
  }
?>

Note: הערת תאימות צריך להיזהר בעת קידוד כותרות של HTTP. מאחר ועל מנת לקבל תאימות מקסימלית, מילת "Basic" צריכה להיכתב בתחילית גדולה "B", המחרוזת חייבת להסתיים במרכאות כפולות , ולא במרכא בודדת, ובדיוק רווח אחד חייב להיות לפני הקוד 401 ב HTTP/1.0 401 שורת הכותרת.

במקום לכתוב בפשטות PHP_AUTH_USER ו PHP_AUTH_PW, כמו בדוגמה למעלה , אולי תרצה לוודא את נכונות שם המשתמש והסיסמא, ע"י שאילתא לבסיס הנתונים, או ע"י פניה לקובץ.

הזהר מדפדפן אקספלורר , ומהבאגים בו, הוא דורש שליחה מדויקת של כותרות ה HTTP. שליחה של הכותרת WWW-Authenticateלפני הכותרת , HTTP/1.0 401 נראת כשיטה הטובה להשתמש בה.

החל מ PHP גירסה 4.3.0, במטרה למנוע את היכולת לכתוב סקריפט in שיחשוף את הסיסמא , משתני הב PHP_AUTH לא יקבעו אם מותרת גישה לאימות ממקור חיצוני, לעמוד הספציפי , ומצב safe mode מאופשר. מעבר לזה, אפשר להשתמש ב REMOTE_USER לזיהוי של משתמש עם אימות חיצוני, כך שאתה יכול להשתמש $_SERVER['REMOTE_USER'].

Note: הערת קונפיגורציה. PHP משתמשת בנוכחות הנחיהAuthType לקבוע האם יהיה אפקט לאימות חיצוני.

שים לב, אין מניעה למישהו שיש לו שליטה על כתובת URL לא מאומתת, לגנוב סיסמאות מכתובת מאומתת על אותו שרת.

גם נטסקייפ וגם אינטרנט אקספלורר , ינקו את הקש של הלקוח, בקבלת הודעת שגיאה 401 מהשרת. דבר זה יכול לשמש ביעילות, להוצאת המשתמש מהמערכת , "log out",והכרחתו להרשם מחדש ע"י הוספת שם משתמש וסיסמא. אפשר להתשמש בזה גם ליצירת מנגון "time out" , או לספק כפתור יציאה "log-out" .

Example#2 דוגמא לאימות HTTP

<?php
  
function authenticate() {
    
header('WWW-Authenticate: Basic realm="Test Authentication System"');
    
header('HTTP/1.0 401 Unauthorized');
    echo 
"You must enter a valid login ID and password to access this resource\n";
    exit;
  }
 
  if (!isset(
$_SERVER['PHP_AUTH_USER']) ||
      (
$_POST['SeenBefore'] == && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
   
authenticate();
  } 
  else {
   echo 
"<p>Welcome: {$_SERVER['PHP_AUTH_USER']}<br>";
   echo 
"Old: {$_REQUEST['OldAuth']}";
   echo 
"<form action='{$_SERVER['PHP_SELF']}' METHOD='POST'>\n";
   echo 
"<input type='hidden' name='SeenBefore' value='1'>\n";
   echo 
"<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}'>\n";
   echo 
"<input type='submit' value='Re Authenticate'>\n";
   echo 
"</form></p>\n";
  }
?>

ההתנהגות הזאת לא מתבקשת ע"י סטנדרט האימות הבסיסי של HTTP , לכן אסור לסמוך על זה . למשל בדפדפן Lynx אין ביטול של הקש ,למרות הודעת שגיאה 401 של השרת, כלומר בלחיצה קדימה ואחורה בדפדפן, יפתחו שוב את הגישה למשאבים, והסיסמא תמוחזר. למרות זאת המשתמש יכול ללחוץ על מקש '_' על מנת לנקות את מידע האימות..

הערה נוספת , עד ל PHP גירסה 4.3.3, אימות HTTP לא עבד ביחד עם שרת מיקרוסופט IIS עם גרסת CGI של PHP בגלל הגבלות של שרת ה IIS. במטרה לגרום לאימות לעבוד עם PHP 4.3.3+, חייבים לערוך את הקונפיגורציה של ה "Directory Security" בשרת ה IIS . הכנס לתכונה "ערוך" - "Edit" ותדאג שרק הכפתור "כניסה אנונימית" - "Anonymous Access" יהיה דלוק בעוד שאר השדות יהיו מכובים.

הגבלה נוספת בשימוש במודול של ה IIS (ISAPI), אתה לא תוכל להשתמש במשתנהPHP_AUTH_* אלא, במשתנה HTTP_AUTHORIZATION במקום. לדוגמא הקוד הבא : list($user, $pw) = explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));

Note: הערת IIS : על מנת שאימות HTTP יעבוד עם שרת IIS, הגדרת PHP cgi.rfc2616_headersחייבת להיות קבועה ל- 0 (ערך ברירת המחדל).

Note: אםsafe mode במצב מאופשר, מזהה המשתמש (uid) של הסקריפט נוסף לתחום ההכרה(realm ) של כותרת ה WWW-Authenticate .