Per php htpasswd ändern

raccoon

Mitglied
Schönen guten morgen,

ich habe folgendes auf dem Herzen, da ich mit php halt noch nicht ganz so wirklich klar komme hier erstmal die beschreibung meines Standpunktes.

Beschreibung:
Ich habe eine Datei namens htpasswd (ja ohne punkt) und eine index.php.
Ich möchte jetzt per php function das htpasswd in der datei ändern.

PHP:
<?php

$HTPASSWD = "htpasswd";
$loginuser = "{$_SERVER['REMOTE_USER']}";


function changepw()
	{
	
	global $loginuser, $HTPASSWD, $passw;

	$changed = false;

	if (file_exists($HTPASSWD))
		{
		
		$buffer = file($HTPASSWD);
		$buffer = str_replace(chr(13), "", $buffer);
		$buffer = str_replace(chr(10), "", $buffer);

		for ($i = 0; $i < count($buffer); $i++)
			{

			if (strpos($buffer[$i], $loginuser) !== false)
				{
			$buffer[$i] = $loginuser . ":" . crypt($passw, "$a");
			$changed = true;
			break;

				}
			}

		$file=fopen($HTPASSWD, "wb");
		flock($file, 2);
		fwrite($file, implode(chr(10), $buffer));
		flock($file, 3);
		fclose($file);
		}

	return $changed;
	}

?>

So sieht also die Funktion aus die ich habe, nun weiß ich aber nicht wir ich auf den html code in der php datei, bzw. auf die inputfelder den befehl lege das er die funktion changepw() ausführt.

Ich dachte mir das es so evtl. aussehen sollte,
HTML:
<form method="POST" action="index.php">
<p style="margin-top: 0; margin-bottom: 0"><font face="Tahoma">
<font size="1"><span style="font-size: 9pt">
<input type="password" name="passw" size="20"></span></font>
<font style="font-size: 9pt">&nbsp;&nbsp;&nbsp; Neues Password</font></font></p>
<p style="margin-top: 0; margin-bottom: 0"><font size="1" face="Tahoma">
<span style="font-size: 9pt">
<input type="password" name="passw" size="20"></span></font>
<font face="Tahoma" style="font-size: 9pt">&nbsp;&nbsp;&nbsp; Eingabe wiederholen</font></p>
<p><font size="1" face="Tahoma">
<input type="submit" value="Ändern" name="B1"></font></p>
</form>


nun die frage, wie bekomme ich es hin das er bei dem klick auf den Button (B1) die changepw function ausführt.

mfg
sebastian
 
PHP:
<?php
$HTPASSWD = "htpasswd";
$loginuser = "{$_SERVER['REMOTE_USER']}";

function changepw()
	{
	
	global $loginuser, $HTPASSWD, $passw;

	$changed = false;

	if (file_exists($HTPASSWD))
		{
		
		$buffer = file($HTPASSWD);
		$buffer = str_replace(chr(13), "", $buffer);
		$buffer = str_replace(chr(10), "", $buffer);

		for ($i = 0; $i < count($buffer); $i++)
			{

			if (strpos($buffer[$i], $loginuser) !== false)
				{
			$buffer[$i] = $loginuser . ":" . crypt($passw, "$a");
			$changed = true;
			break;

				}
			}

		$file=fopen($HTPASSWD, "wb");
		flock($file, 2);
		fwrite($file, implode(chr(10), $buffer));
		flock($file, 3);
		fclose($file);
		}

	return $changed;
	}
if($_GET['action'] == 'do'){
 changepw()
}else{ ?>
<form method="POST" action="index.php?action=do">
<p style="margin-top: 0; margin-bottom: 0"><font face="Tahoma">
<font size="1"><span style="font-size: 9pt">
<input type="password" name="passw" size="20"></span></font>
<font style="font-size: 9pt">&nbsp;&nbsp;&nbsp; Neues Password</font></font></p>
<p style="margin-top: 0; margin-bottom: 0"><font size="1" face="Tahoma">
<span style="font-size: 9pt">
<input type="password" name="passw" size="20"></span></font>
<font face="Tahoma" style="font-size: 9pt">&nbsp;&nbsp;&nbsp; Eingabe wiederholen</font></p>
<p><font size="1" face="Tahoma">
<input type="submit" value="Ändern" name="B1"></font></p>
</form>
<?php 
}
?>

Könnte so funktionieren. Ist aber nicht die schönste Lösung!
 
danke für die antwort, es hat zwar alles geklappt mit ein wenig ummodeln aber es funktioniert immer noch nichts, er schreibt einfach nix in die datei hinein.

PHP:
<?php 
$HTPASSWD = "htpasswd"; 
$loginuser = "{$_SERVER['REMOTE_USER']}"; 

function changepw() 
    { 
     
    global $loginuser, $HTPASSWD, $passw; 

    $changed = false; 

    if (file_exists($HTPASSWD)) 
        { 
         
        $buffer = file($HTPASSWD); 
        $buffer = str_replace(chr(13), "", $buffer); 
        $buffer = str_replace(chr(10), "", $buffer); 

        for ($i = 0; $i < count($buffer); $i++) 
            { 

            if (strpos($buffer[$i], $loginuser) !== false) 
                { 
            $buffer[$i] = $loginuser . ":" . crypt($passw, "$a"); 
            $changed = true; 
            break; 

                } 
            } 

        $file=fopen($HTPASSWD, "wb"); 
        flock($file, 2); 
        fwrite($file, implode(chr(10), $buffer)); 
        flock($file, 3); 
        fclose($file); 
        } 

    return $changed; 
    } 
if($_GET['action'] == 'do'){ 
 changepw();
}
else{  

	echo "	<form method=\"POST\" action=\"index.php?action=do\">";
	echo "	<p style=\"margin-top: 0; margin-bottom: 0\"><font face=\"Tahoma\">";
	echo "	<font size=\"1\"><span style=\"font-size: 9pt\">";
	echo "	<input type=\"password\" name=\"passw\" size=\"20\"></span></font>";
	echo "	<font style=\"font-size: 9pt\">&nbsp;&nbsp;&nbsp; Neues Password</font></font></p>";
	echo "	<p style=\"margin-top: 0; margin-bottom: 0\"><font size=\"1\" face=\"Tahoma\">";
	echo "	<span style=\"font-size: 9pt\">";
	echo "	<input type=\"password\" name=\"passw\" size=\"20\"></span></font>";
	echo "	<font face=\"Tahoma\" style=\"font-size: 9pt\">&nbsp;&nbsp;&nbsp; Eingabe wiederholen</font></p>";
	echo "	<p><font size=\"1\" face=\"Tahoma\">";
	echo "	<input type=\"submit\" value=\"Ändern\" name=\"B1\"></font></p>";
	echo "	</form>";


}
?>
 
Neues Problem dazu

Also ich habe jetzt alles soweit das es die .htpasswd öffnet und des weiteren, nun habe ich bei dem push auf den knopf password ändern diese fehlermeldung:

Code:
Warning: strpos() [function.strpos]: Empty delimiter. in /opt/lampp/htdocs/picklist/test2.php on line 45

mein Code sieht jetzt so aus:

PHP:
<?php
$HTPASSWD = "/sec/.htpasswd";

$loginuser = "{$_SERVER['REMOTE_USER']}";



if (!isset($loginuser)) { $loginuser = ""; }
if (!isset($action)) { $action = ""; }
if (!isset($passrep)) { $passrep = ""; }
if (!isset($pass)) { $pass = ""; }
switch ($action) {
case "change":
ShowHeader();
if ($loginuser == "") { ShowForm("Das Passwort konnte leider nicht geändert werden!"); }
elseif ($pass == "") { ShowForm("Ein leeres Passwort ist nicht zulässig!"); }
elseif ($pass != $passrep) { ShowForm("Passwort und Wiederholung waren nicht identisch!"); }
elseif (Changepw() == true) { ShowForm("Das Passwort wurde geändert!"); }
else { ShowForm("Das Passwort konnte leider nicht geändert werden!"); }
break;
default:
ShowHeader();
ShowForm();
break;
}


function changepw()
	{
	
	global $loginuser, $HTPASSWD, $pass;

	$changed = false;

	if (file_exists($HTPASSWD))
		{
		
		$buffer = file($HTPASSWD);
		$buffer = str_replace(chr(13), "", $buffer);
		$buffer = str_replace(chr(10), "", $buffer);

		for ($i = 0; $i < count($buffer); $i++)
			{

-->>> Line 45		if (strpos($buffer[$i], $loginuser) !== false)
				{
			$buffer[$i] = $loginuser . ":" . crypt($pass, "$a");
			$changed = true;
			break;

				}
			}

		$file=fopen($HTPASSWD, "wb");
		flock($file, 2);
		fwrite($file, implode(chr(10), $buffer));
		flock($file, 3);
		fclose($file);
		}

	return $changed;
	}
if($_GET['action'] == 'do'){ 
 changepw();
}
 
Guten morgen,

also da meine Zeit knapp wird hab ich ein vorgefertigtes script genommen womit ich das password aus der htpasswd changen wollte, dieses script sieht so aus:

PHP:
<?

if(!include('File/Passwd/Authbasic.php')) {
   echo "Error, you must install some files into your pear configuration before continuing.<br>";
   echo "At the commandline (you might want to be root, or anyone with access to pear)<br>";
   echo "Run the following commands<br>";
   echo "pear install Auth<br>";
   echo "pear install File_Passwd<br>";
   exit();
}
 
$HTPASSWD_PATH = "/sec/.htpasswd";
$REDIRECT_URL = "/";
$MIN_PASSLEN = 6;
$MAX_PASSLEN = -1;
 
if(strlen($_SERVER["REMOTE_USER"])==0) {
   echo "Failed reading username from enviroment!<br>";
   echo "This program must be run from within a protected HTTP directory!";
   exit(0);
}
$user=$_SERVER["REMOTE_USER"];
$save_changes=false;
 
echo "<html><head><title>Change Password Script</title></head><body>";
$passfile = new File_Passwd_Authbasic($HTPASSWD_PATH);
$ret = $passfile->load();
if(!PEAR::isError($ret)) {
 
   echo "Hello $user, welcome to the password change script.<br>";
 
   $verified=false;
   if(strlen($_REQUEST["currpass"])) {
      if($passfile->verifyPasswd($user,$_REQUEST["currpass"])) {
         $verified=true;
      } else {
         echo "Failed current password validation!<br>";
      }
   }
   $confirmed=false;
   if(strlen($_REQUEST["newpass"])) {
      if(strcmp($_REQUEST["newpass"],$_REQUEST["newpass2"])==0) {
         $confirmed=true;
      } else {
         echo "Failed new password and confirmed password don't match!";
      }
   } else if($verified) {
      echo "Failed you must supply a new password!";
   }
 
   if($verified = $confirmed) {
      $passfile->changePasswd($_SERVER["REMOTE_USER"], $_REQUEST["newpass"]);
      $save_changes=true;
   } else {
      echo "<table border=0>";
      echo "<tr><td colspan=2 bgcolor=cccccc>Change your password</td></tr>";
      echo "<form method=\"post\" action=\"$PHP_SELF\">";
      echo "<tr><td>Verify Current Password: </td>";
      echo "<td><input type=\"password\" name=\"currpass\"></td></tr>";
      echo "<tr><td>New Password: </td>";
      echo "<td><input type=\"password\" name=\"newpass\"></td></tr>";
      echo "<tr><td>New Password Again(to confirm): </td>";
      echo "<td><input type=\"password\" name=\"newpass2\"></td></tr>";
      echo "<tr><td colspan=2>";
      echo "<input type=\"submit\" name=\"submit\" value=\"Change Pass\">";
      echo "<input type=\"hidden\" name=\"redirect\" value=\"true\">";
      echo "</td></tr>";
      echo "</form>";
      echo "</table>";
   }
 

   if(strlen($_REQUEST["newuser"]) !=  $confirmed) {
      $newuser=$_REQUEST["newuser"];
      $newpass=$_REQUEST["newpass"];
      echo "Adding user $newuser with password $newpass...<br>";
      $ret=$passfile->addUser($newuser,$newpass);
      if(!PEAR::isError($ret)) {
         echo "Added user successfully!<br>";
         $save_changes=true;
      } else {
         echo "Failed to add user to password file!<br>";
         echo "(".$ret->getMessage().")<br>";
      }
   } else {
      echo "<table border=0>";
      echo "<tr><td colspan=2 bgcolor=cccccc>Add new user</td></tr>";
      echo "<form method=\"post\" action=\"$PHP_SELF\">";
      echo "<tr><td>New Username: </td>";
      echo "<td><input type=\"text\" name=\"newuser\"></td></tr>";
      echo "<tr><td>New Password: </td>";
      echo "<td><input type=\"password\" name=\"newpass\"></td></tr>";
      echo "<tr><td>New Password Again(to confirm): </td>";
      echo "<td><input type=\"password\" name=\"newpass2\"></td></tr>";
      echo "<tr><td colspan=2>";
      echo "<input type=\"submit\" name=\"submit\" value=\"Add User\">";
      echo "</td></tr>";
      echo "</form>";
      echo "</table>";
   }
 
   if($save_changes) {
      echo "Saving password file...<br>";
      $ret=$passfile->save();
      if(!PEAR::isError($ret)) {
         echo "Password file successfully updated!<br>";
         if(isset($_REQUEST["redirect"])) {
            echo "The browser will request your new username/password in 5 seconds....<br>";
            echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"5; URL=$REDIRECT_URL\">";
         }
      } else {
         echo "Failed to write password file!<br>";
         echo "(".$ret->getMessage().")<br>";
      }
   }
 
} else {
   echo "Failed to open password file!<br>";
   echo "(".$ret->getMessage().")<br>";
}
echo "</body></html>";
   //$users=$passfile->listUser();
   //print_r($users);
?>

Das Problem nun liegt darin das er mir bei betätigung des Change buttons angibt das er den Usernamen nicht lesen konnte. wenn ich allerdings her gehe und in zeile 51 das so änder (siehe unten), würde er es sofort abspeichern und mein password auf ein anderes setzen, in dem fall auf nix weil ja nix in den input boxen steht.


PHP:
if($verified = $confirmed) {

Geändert: if($verified == $confirmed) {

Weiß einer wodran es liegen könnte das er beim betätigen des change buttons vergisst wer eingeloggt ist?
 
Zuletzt bearbeitet:
Zurück