If you want to implement password protection on a per-script basis, you can create a basic authentication mechanism by combining the header () function with the $php_auth_user, $PHP _AUTH_PW global variables. Typically the server-based authentication request/response process is as follows:
1. The user requests a file from a Web server. If the file is within a protected area, the server responds with a 401 (illegal user) string inside the header of the response data.
2. When the browser sees the response, the User name/password dialog box pops up.
3. The user enters the user name and password in the dialog box, and then clicks OK to send the information back to the server for authentication.
4. If the user name and password are valid, the protected file will be displayed to the user. This confirmation will continue to be valid for the confirmed user's time in the protected area.
A simple PHP script can simulate the HTTP authentication request/Response system by sending the appropriate HTTP header to automatically display the Username/Password dialog box on the client screen. PHP stores the User Input dialog box information in the $php_auth_user and $PHP_AUTH_PW variables. By using these variables, you can store a list of non-compliant user name/password checks in a text file, database, or anywhere you wish.
Note: $PHP _auth_user, $PHP _AUTH_PW, and $php_auth_type global variables are only valid if PHP is installed as a module. If you are using a CGI version of PHP, you will be limited to using htaccess-based authentication or database-based authentication, and let the user enter the user name and password via an HTML form, and then let PHP do the check for validity.
This example shows a confirmation check of two hardware encoded values, which is theoretically identical regardless of where the user name and password are stored.
/* Check the values of variables $PHP _auth_user and $PHP_AUTH_PW */
if ((!isset ($PHP _auth_user)) | | (!isset ($PHP _AUTH_PW))) {
/* Null value: Send the data header that produces the Display text box */
Header (' Www-authenticate:basic realm= ' My Private Stuff ');
Header (' http/1.0 401 Unauthorized ');
Echo ' Authorization Required. ';
Exit
} else if ((Isset ($PHP _auth_user)) && (Isset ($PHP _auth_pw)) {
/* Variable value exists, check that it is correct */
if ($PHP _auth_user! = "Validname") | | ($PHP _AUTH_PW! = "Goodpassword")) {
/* User name input error or password input error, send the data header that produces the Display text box */
Header (' Www-authenticate:basic realm= ' My Private Stuff ');
Header (' http/1.0 401 Unauthorized ');
Echo ' Authorization Required. ';
Exit
} else if (($PHP _auth_user = = "Validname") | | ($PHP _AUTH_PW = = "Goodpassword")) {
/* User name and password are correct, output success information */
echo "
You ' re authorized!
";
}
}
?>
It's important to note that when you are using file-based protection, this approach does not provide a full range of security for your catalog. This is obvious to most people, but if your brain creates a connection between the popup dialog and the protection of the given directory, you should consider this further.
Julie Meloni is the technical director of I2i Interactive and a strong catalyst for the Linux and open source communities. She has authored a number of books on PHP and other technologies and has become an expert on the long-term contribution of CNET Builder.com.