Я пишу сценарий PHP, который обновляет файл .htpasswd (да, я знаю, что он не очень безопасен, но у меня есть несколько способов защиты от доступа людей к сценарию).
Прямо сейчас я просто добавляю текущий файл, вот так:
$user = ''; // (Not an empty strings just removed the part that grabs this for security reasons)
$password = ''; // (Not an empty strings just removed the part that grabs this for security reasons)
$password = crypt($password, base64_encode($password));
$line = $user . ':' . $password;
$fh = fopen('path/to/password/file','a');
fwrite($fh,$line);
fclose($fh);
Однако я хотел бы удалить любую текущую запись об этом человеке. Например, если бы я знал их старый пароль pass123
Я бы просто использовал str_replace($user . ':' . 'pass123','',$currentfiledata)
, но я не, и у меня нет возможности хранить его.
Как я смогу сделать это? Я предполагаю, используя preg_replace
или что-то подобное, но я не испытал этого.
Это не вменяемый способ обновления пароля. Но так как вы уже знаете это, я не собираюсь читать вам лекции по вопросам безопасности.
если ты должен сделать это таким образом, вы можете выполнить замену с помощью preg_replace()
как показано ниже:
$currentfiledata = preg_replace('~^'.$user.':.*~m', '', $currentfiledata);
Вышеприведенный оператор ищет любую строку, которая начинается с (утверждается якорем ^
) заданное имя пользователя, затем двоеточие, а затем пароль (обозначенный .*
здесь — означает любой символ, повторяется ноль или более раз). Совпадения заменяются пустой строкой.
Других решений пока нет …