как редактировать.помощью пароля через htpasswd с помощью PHP?

У меня есть защищенный каталог, где единственным пользователем .htpasswd может получить доступ, но иногда это требует от пользователя изменить пароль или имя пользователя, изменить пароль конкретного имени пользователя к его имени пользователя его

sample users
kevien : kka
mike : mike

и скажем, я хочу изменить kevien на XYZ

и то же самое происходит с паролем

5 ответов


Ofc это просто образец, который будет читать ваш текущий файл, найти данное имя пользователя и изменить либо это пароль имени пользователя.

пожалуйста, имейте в виду, что этот код небезопасен, и вам все равно нужно будет разобрать имя пользователя и пароль, чтобы он не сломал ваш файл.

    $username = $_POST['user'];
    $password = $_POST['pass'];
    $new_username = $_POST['newuser'];
    $new_password = $_POST['newpass'];
    $action = $_POST['action'];
    //read the file into an array
    $lines = explode("\n", file_get_contents('.htpasswd'));

    //read the array and change the data if found
    $new_file = "";
    foreach($lines as $line)
    {
        $line = preg_replace('/\s+/','',$line); // remove spaces
        if ($line) {
            list($user, $pass) = split(":", $line, 2);
            if ($user == $username) {
                if ($action == "password") {
                    $new_file .= $user.':'.$new_password."\n";
                } else {
                    $new_file .= $new_username.':'.$pass."\n";
                }
            } else {
                $new_file .= $user.':'.$pass."\n";
            }
        }
    }

    //save the information
    $f=fopen(".htpasswd","w") or die("couldn't open the file");
    fwrite($f,$new_file);
    fclose($f);

Я изменил функцию, чтобы использовать все типы склеп alghoritms. Кто-то может найти это полезным:

/*
Function change password in htpasswd.
Arguments:
$user    > User name we want to change password to.
$newpass > New password
$type    > Type of cryptogrphy: DES, SHA, MD5. 
$salt    > Option: Add your custom salt (hashing string). 
           Salt is applied to DES and MD5 and must be in range 0-9A-Za-z
$oldpass > Option: Add more security, user must known old password to change it. 
           This option is not supported for DES and MD5 without salt!!!
$path    > Path to .htaccess file which contain the password protection. 
           Path to password file is obtained from this .htaccess file. 
*/  

function changePass($user,$newpass,$type="SHA",$salt="",$oldpass="",$path=".htaccess") {
  switch ($type) {
    case "DES" :
    $salt = substr($salt,0,2);  //Salt must be 2 char range 0-9A-Za-z
    $newpass = crypt($newpass,$salt);
    if ($oldpass != null) $oldpass = crypt($oldpass,$salt);
    break;

    case "SHA" :
    $newpass = '{SHA}'.base64_encode(sha1($newpass, TRUE));
    if ($oldpass != null) $oldpass = '{SHA}'.base64_encode(sha1($oldpass, TRUE));
    break;

    case "MD5" :
    $salt = substr($salt,0,8);  //Salt must be max 8 char range 0-9A-Za-z
    $newpass = crypt_apr1_md5($newpass, $salt);
    if ($oldpass != null) $oldpass = crypt_apr1_md5($oldpass, $salt);
    break;

    default :
    return false;
    break;
  }

  $hta_arr = explode("\n", file_get_contents($path));

  foreach($hta_arr as $line) {
    $line = preg_replace('/\s+/','',$line); // remove spaces
    if ($line) {
      $line_arr = explode('"', $line);
      if (strcmp($line_arr[0],"AuthUserFile") == 0) {
        $path_htaccess = $line_arr[1];
      }   
    }
  }  
  $htp_arr = explode("\n", file_get_contents($path_htaccess));

  $new_file = "";
  foreach($htp_arr as $line) {
    $line = preg_replace('/\s+/','',$line); // remove spaces
    if ($line) {
      list($usr, $pass) = explode(":", $line, 2);
      if (strcmp($user,$usr) == 0) {
        if ($oldpass != null) {
          if ($oldpass == $pass) {
            $new_file .= $user.':'.$newpass."\n";
          } else {
            return false;
          }
        } else {
          $new_file .= $user.':'.$newpass."\n";
        }
      } else {
        $new_file .= $user.':'.$pass."\n";
      }   
    }
  } 
  $f=fopen($path_htaccess,"w") or die("couldn't open the file");
  fwrite($f,$new_file);
  fclose($f);
  return true;
}

функция для генерации Apache, как MD5:

function crypt_apr1_md5($plainpasswd,$salt=null) {  
  $tmp = "";
  if ($salt == null) $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);
  $len = strlen($plainpasswd);
  $text = $plainpasswd.'$apr1$'.$salt;
  $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));
  for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }
  for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }
  $bin = pack("H32", md5($text));
  for($i = 0; $i < 1000; $i++) {
      $new = ($i & 1) ? $plainpasswd : $bin;
      if ($i % 3) $new .= $salt;
      if ($i % 7) $new .= $plainpasswd;
      $new .= ($i & 1) ? $bin : $plainpasswd;
      $bin = pack("H32", md5($new));
  }
  for ($i = 0; $i < 5; $i++) {
      $k = $i + 6;
      $j = $i + 12;
      if ($j == 16) $j = 5;
      $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;
  }
  $tmp = chr(0).chr(0).$bin[11].$tmp;
  $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
  "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
  return "$"."apr1"."$".$salt."$".$tmp;
}

Не надо. Вместо этого храните authdb в базе данных, например, через mod_auth_mysql.


Googled "php generate htpasswd", получил эту статью:как создать пароль для .файл htpasswd с использованием PHP.

ключевой строкой кажется:

$password = crypt($clearTextPassword, base64_encode($clearTextPassword));

поэтому я предполагаю, что вы прочитаете содержимое файла с file_get_contents, разберите его в ассоциативный массив, измените соответствующие записи (шифрование пароля, как показано выше), запишите массив обратно в строку и используйте file_put_contents записать файл обратно.

Это определенно не однако это стандартная практика. Похоже на работу для базы данных. Если вы чувствуете себя странно при настройке всего сервера базы данных, и ваш хост поддерживает его, SQLite может быть хорошим выбором.


на всякий случай, если кто-то просто ищет рабочий скрипт, вот решение.

это сценарий, опубликованный здесь Kavoir с небольшим изменением: http://www.kavoir.com/backyard/showthread.php?28-Use-PHP-to-generate-edit-and-update-htpasswd-and-htgroup-authentication-files

<?php
/*
 $pairs = array(
  'username' = 'password',
 );
*/

// Algorithm: SHA1

class Htpasswd {

private $file = '';

public function __construct($file) {
    if (file_exists($file)) {
        $this -> file = $file;
    } else {
        return false;
    }
}

private function write($pairs = array()) {
    $str = '';
    foreach ($pairs as $username => $password) {
        $str .= "$username:{SHA}$password\n";
    }
    file_put_contents($this -> file, $str);
}

private function read() {
    $pairs = array();
    $fh = fopen($this -> file, 'r');
    while (!feof($fh)) {
        $pair_str = str_replace("\n", '', fgets($fh));
        $pair_array = explode(':{SHA}', $pair_str);
        if (count($pair_array) == 2) {
            $pairs[$pair_array[0]] = $pair_array[1];
        }
    }
    return $pairs;
}

public function addUser($username = '', $clear_password = '') {
    if (!empty($username) && !empty($clear_password)) {
        $all = $this -> read();
      //  if (!array_key_exists($username, $all)) {
            $all[$username] = $this -> getHash($clear_password);
            $this -> write($all);
     //   }
    } else {
        return false;
    }
}

public function deleteUser($username = '') {
    $all = $this -> read();
    if (array_key_exists($username, $all)) {
        unset($all[$username]);
        $this -> write($all);
    } else {
        return false;
    }
}

public function doesUserExist($username = '') {
    $all = $this -> read();
    if (array_key_exists($username, $all)) {
        return true;
    } else {
        return false;
    }
}

private function getHash($clear_password = '') {
    if (!empty($clear_password)) {
        return base64_encode(sha1($clear_password, true));
    } else {
        return false;
    }
}

}  

Вы можете использовать этот скрипт как:

$htp = new Htpasswd('.htpasswd');
$htp -> addUser('username1', 'clearpassword1');  // this will add or edit the user
$htp -> deleteUser('username1');  
// check if a certain username exists
if ($htp -> doesUserExist('username1')) {
 // user exists
}