Just nu i M3-nätverket
Gå till innehåll

HTTP User Authentification i PHP


Nevon

Rekommendera Poster

Jag har använt ett HTTP user authentification script i PHP för att lösenordsskydda delar av min sida. Allt funkade fint när jag använde Apache och PHP, men jag vill ha MySQL också, men det funkade aldrig, så jag laddade ned Wamp istället. Wamp är ett program som samordnar ett antal andra program (apache, phpmyadmin, PHP, MySQL, SQLite) och installerar dem. Så jag installerade det, och allt funkade jättebra. MEN när jag kollade sidan så såg jag ett felmeddelande längst upp på varje sida, nämligen: "Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at D:\Webbdesign\common.php:1) in D:\Webbdesign\common.php on line 3"

common.php är själva user authentification scriptet, på rad tre står det: "session_start();"

 

Jag har läst någonting om att vissa versioner av PHP har problem med HTTP user authentification, men jag använder PHP 5.2.1 som jag tror är den nyaste, och förut funkade det ju, och då använde jag också den nyaste versionen.

 

Mitt problem är alltså att just nu så visas det ett varningsmeddelande längst upp på varje sida som använder scriptet: "function checkUser(){

if ((!isset($_SESSION['validUser']))

|| ($_SESSION['validUser'] != true)){

header('Location: ../index.php');" som kollar så att användaren är inloggad.

Just nu är alltså alla sidor fullkomligt oskyddade, och jag får ett fult varningsmeddelande. Någon som vet vad som måste göras?

 

Länk till kommentar
Dela på andra webbplatser

Från manualen ( http://php.net/header ):

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

 

Just nu är alltså alla sidor fullkomligt oskyddade
I så fall har du inte ställt in http-autenticeringen rätt. Du måste nånstans i Apache-konfigurationen ange t ex Require valid-user för de filer/kataloger du vill ska skyddas.

 

Länk till kommentar
Dela på andra webbplatser

Vi går så här. Jag postar helt enkelt hela koden, så får du se om det är någonting som är fel:

 

index.php

<?php
require_once('common.php');

$error = '0';

if (isset($_POST['submitBtn'])){
   // Get user input
   $username = isset($_POST['username']) ? $_POST['username'] : '';
   $password = isset($_POST['password']) ? $_POST['password'] : '';

   // Try to login the user
   $error = loginUser($username,$password);
}

?>
<html>
<head>
<title>-------------</title>
<link rel="shortcut icon" type="image/ico" href="images/favicon.ico" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
body {
background-color: #424542;
}
body,td,th {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 10px;
color: #000000;
}
a {
font-size: 10px;
color: #000000;
}
a:link {
text-decoration: none;
}
a:visited {
text-decoration: none;
color: #000000;
}
a:hover {
text-decoration: underline;
color: #000000;
}
a:active {
text-decoration: none;
color: #000000;
}
-->
</style></head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<center>
<table id="Table_01" width="650" height="600" border="0" cellpadding="0" cellspacing="0">
<tr>
	<td colspan="3">
		<img src="images/welcome_01.gif" width="650" height="147" alt=""></td>
</tr>
<tr>
	<td rowspan="2">
		<img src="images/welcome_02.gif" width="30" height="453" alt=""></td>
	<td height="428" background="images/welcome_03.gif"><p>#

	  ------- and its webhosts / webmaster / owner / staff will not be liable for your actions or actions taken towards you.
	  </p>
	  <p>#

	    Any and all damages done to your computer is entirely your responsibility, we cannot be held liable for it	      </p>
	  <p># None of the content on this site has been ripped by me, all credits go to the person that ripped the media.</p>
	  <p># If you are not a member of <a href="---------------" target="_blank">---------</a>  you may not enter. </p>
	  <p>#

	    For controversial reasons, if you are affiliated with any government, ANTI-Piracy group or any other related group, or were formally a worker of one you CANNOT enter this web site, cannot access any of its files and you cannot view any of the HTML files. If you enter this site you are not agreeing to these terms and you are violating code 431.322.12 of the Internet Privacy Act signed by Bill Clinton in 1995 and that means that you CANNOT threaten our ISP(s) or any person(s) or company storing these files, and cannot prosecute any person(s) affiliated with this page which includes family, friends or individuals who run or enter this web site.	      </p>
	  <p>#

	    We reserve the right to change this policy any time.	      </p>
	  <p>#

	    If and only if you agree to all of the above then you may enter.
	    <?php if ($error != '') {?>
        </p>
	  <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="loginform">
       <table width="100%">
         <tr><td>Username:</td><td> <input name="username" type="text"  /></td></tr>
         <tr><td>Password:</td><td> <input name="password" type="password" /></td></tr>
         <tr><td colspan="2" align="center"><input type="submit" name="submitBtn" value="Login" /></td></tr>
       </table>
     </form>
<?php
}
   if (isset($_POST['submitBtn'])){
?>
       <table width="100%"><tr><td><br/>
<?php
   if ($error == '') {
       echo "Welcome $username! <br/>You are logged in!<br/><br/>";
       echo '<a href="EmuGlx%20the%20stash/index.php">Now you can visit the index page!</a>';
   }
   else echo $error;

?>
       <br/><br/><br/></td></tr></table>
<?php
   }
?>&nbsp;</td>
	<td rowspan="2">
		<img src="images/welcome_04.gif" width="33" height="453" alt=""></td>
</tr>
<tr>
	<td>
		<img src="images/welcome_05.gif" width="587" height="25" alt=""></td>
</tr>
</table>
</center>
</body>
</html>

 

common.php

 <?php

session_start();

function registerUser($user,$pass1,$pass2){
   $errorText = '';

   // Check passwords
   if ($pass1 != $pass2) 
       $errorText = "Passwords are not identical!";
   elseif (strlen($pass1) < 6) 
       $errorText = "Password is to short!";

   // Check user existance    
   $pfile = fopen("userpwd.txt","a+");
   rewind($pfile);

   while (!feof($pfile)) {
       $line = fgets($pfile);
       $tmp = explode(':', $line);
       if ($tmp[0] == $user) {
         $errorText = "The selected user name is taken!";
         break;
       }
   }

   // If everything is OK -> store user data
   if ($errorText == ''){
       // Secure password string
       $userpass = md5($pass1);

       fwrite($pfile, "rn$user:$userpass");
   }

   fclose($pfile);


   return $errorText;
}

function loginUser($user,$pass){
   $errorText = '';
   $validUser = false;

   // Check user existance    
   $pfile = fopen("userpwd.txt","r");
   rewind($pfile);

   while (!feof($pfile)) {
       $line = fgets($pfile);
       $tmp = explode(':', $line);
       if ($tmp[0] == $user) {
           // User exists, check password
           if (trim($tmp[1]) == trim(md5($pass))){
               $validUser= true;
               $_SESSION['userName'] = $user;
           }
           break;
       }
   }
   fclose($pfile);

   if ($validUser != true) 
      $errorText = "Invalid username or password!";

   if ($validUser == true) $_SESSION['validUser'] = true;
   else $_SESSION['validUser'] = false;

   return $errorText;    
}

function logoutUser(){
   unset($_SESSION['validUser']);
   unset($_SESSION['userName']);
}

function checkUser(){
   if ((!isset($_SESSION['validUser'])) 
        || ($_SESSION['validUser'] != true)){
       header('Location: ../index.php');
   }
}

?>

 

På toppen av varje skyddad sida

<?php
   require_once('../common.php');
   checkUser();
?>

 

 

Ser du nåt fel?

 

Länk till kommentar
Dela på andra webbplatser

Som sagt:

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
Se till att du inte har nån tom rad i början av common.php:
Cannot send session cache limiter - headers already sent (output started at D:\Webbdesign\common.php:1) in D:\Webbdesign\common.php on line 3

 

Länk till kommentar
Dela på andra webbplatser

Japp. Jag läste igenom dokumentationen och provade att ta bort mellanslaget innan <?php och den blanka raden mellan <?php och session_start();, och då funkade det.

 

Tack för hjälpen :)

 

Länk till kommentar
Dela på andra webbplatser

Fan...

Nu får jag inget felmeddelande, men istället så kan man inte komma in på någon sida överhuvudtaget. Så fort man har skrivit in lösenordet och tryckt på länken för att komma till nästa sida så blir man redirected tillbaka till den första sidan.

Vad är det som är fel nudå? (scripten ser precis ut som där uppe, fast utan den tomma raden och mellanslaget.

 

Länk till kommentar
Dela på andra webbplatser

Tja, du kan ju testa att skriva ut $_SESSION och se om relevanta fält (validUser, userName) är satta: print_r($_SESSION);

 

Länk till kommentar
Dela på andra webbplatser

Det slutade med att jag blev så jävla less, så jag tog bort all php som fanns på sidan, och sedan använde jag Dreamweaver för att koppla ihop en databas med ett inloggningscript som fanns inbyggt i DW. Funkar skitbra. Det enda jag har problem med är MD5 kryptering.

<?php require_once('Connections/connectiondb.php'); ?>
<?php
// *** Validate request to login to this site.
if (!isset($_SESSION)) {
 session_start();
}

$loginFormAction = $_SERVER['PHP_SELF'];
if (isset($_GET['accesscheck'])) {
 $_SESSION['PrevUrl'] = $_GET['accesscheck'];
}

if (isset($_POST['username'])) {
 $loginUsername=$_POST['username'];
 $password=$_POST['password'];
 $MM_fldUserAuthorization = "";
 $MM_redirectLoginSuccess = "main.php";
 $MM_redirectLoginFailed = "index.php";
 $MM_redirecttoReferrer = false;
 mysql_select_db($database_connectiondb, $connectiondb);

 $LoginRS__query=sprintf("SELECT username, password FROM users WHERE username='%s' AND password='%s'",
   get_magic_quotes_gpc() ? $loginUsername : addslashes($loginUsername), get_magic_quotes_gpc() ? $password : addslashes($password)); 

 $LoginRS = mysql_query($LoginRS__query, $connectiondb) or die(mysql_error());
 $loginFoundUser = mysql_num_rows($LoginRS);
 if ($loginFoundUser) {
    $loginStrGroup = "";

   //declare two session variables and assign them
   $_SESSION['MM_Username'] = $loginUsername;
   $_SESSION['MM_UserGroup'] = $loginStrGroup;	      

   if (isset($_SESSION['PrevUrl']) && false) {
     $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];	
   }
   header("Location: " . $MM_redirectLoginSuccess );
 }
 else {
   header("Location: ". $MM_redirectLoginFailed );
 }
}
?>

 

Så ser det ut just nu, hur ska jag ändra för att det ska gå att skriva in sitt vanliga lösenord, men att det ska fungera att ha det krypterat i databasen?

För att klargöra. Säg att i databasen står det:

username: användarnamn

password: c50b3c64feb18359ae0b09758f0b6eda <-MD5 hash för "lösenord"

 

Hur får jag till det så att användaren kan skriva in "användarnamn" som användarnamn och "lösenord" som lösenord?

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...