PHP/PAM для изменения пароля пользователя?

Там кто-либо работает пакеты для изменения пользователя Linux пароли с помощью PHP?

Я попытался использовать PECL:PAM, но существует ошибка, когда это пытается изменить пароль.

Править:

Код PHP:

echo pam_chpass($username, $password, $new_pass, &$error) ? 'good' : $error;

PHP (эхо) производят:

Permission denied (in pam_authenticate)

От/var/log/auth (это на самом деле до, журнал, кажется, не работает ATM по некоторым причинам все же, чтобы быть определенным):

Jun 11 15:30:20 veda php: pam_unix(php:chauthtok): conversation failed
Jun 11 15:30:20 veda php: pam_unix(php:chauthtok): password - (old) token not obtained
Jun 11 15:30:20 veda php: pam_winbind(php:chauthtok): valid_user: wbcGetpwnam gave WBC_ERR_DOMAIN_NOT_FOUND

Другое:

Извините за отсутствие деталей прежде, я действительно устал, когда я отправил вопрос, но это - все еще дрянное оправдание.

5
задан wag2639 14 June 2010 в 03:24
поделиться

3 ответа

После нескольких часов поиска в Интернете я не смог найти очень хороший вариант, поэтому я применил этот прием. Он использует эту статью для изменения паролей с помощью PHP.

Я также использую пакет PECL: PAM , чтобы добавить небольшую проверку.

Эта страница находится в защищенной папке HTTPS (автоматическое перенаправление через .htaccess)

<?php

$messages = array();

function change_password ($user, $currpwd, $newpwd) {

    // Open a handle to expect in write mode
    $p = popen('/usr/bin/expect','w');

    // Log conversation for verification
    $log = '/tmp/passwd_' . md5($user . time());
    $cmd .= "log_file -a \"$log\"; ";

    // Spawn a shell as $user
    $cmd .= "spawn /bin/su $user; ";
    $cmd .= "expect \"Password:\"; ";
    $cmd .= "send \"$currpwd\\r\"; ";
    $cmd .= "expect \"$user@\"; ";

    // Change the unix password
    $cmd .= "send \"/usr/bin/passwd\\r\"; ";
    $cmd .= "expect \"(current) UNIX password:\"; ";
    $cmd .= "send \"$currpwd\\r\"; ";
    $cmd .= "expect \"Enter new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\\r\"; ";
    $cmd .= "expect \"Retype new UNIX password:\"; ";
    $cmd .= "send \"$newpwd\\r\"; ";
    $cmd .= "expect \"passwd: password updated successfully\"; ";

    // Commit the command to expect & close
    fwrite($p, $cmd); pclose ($p);

    // Read & delete the log
    $fp = fopen($log,r);
    $output = fread($fp, 2048);
    fclose($fp); unlink($log);
    $output = explode("\n",$output);

    return (trim($output[count($output)-2]) == 'passwd: password updated successfully') ? true : false;
}

function process_post() {

    if ((!isset($_SERVER['HTTP_REFERER'])) 
        || (strpos($_SERVER['HTTP_REFERER'], $_SERVER['SCRIPT_NAME']) === FALSE)) {

        echo "GO AWAY!";
        exit();
        return FALSE;

    }

    global $messages;

    $username           = trim($_POST['username']);
    $password_current   = trim($_POST['password_current']);
    $password_new       = trim($_POST['password_new']);
    $password_confirm   = trim($_POST['password_confirm']);

    // Check for blanks
    if ($username == '' || $password_current == '' || $password_new == '' || $password_confirm == '') {
        array_push(&$messages, "ERROR: You cannot leave any field empty.");
        return FALSE;
    }

    // Check username
    if (!ctype_alnum($username)) {
        array_push(&$messages, "ERROR: You've entered an invalid username.");
        return FALSE;
    }

    // Check to see if new password is correctly typed
    if ($password_new != $password_confirm) {       
        array_push(&$messages, "ERROR: New Password and Confirmation do not match.");
        return FALSE;
    }

    // Check if current password is valid (not really neccessary)
    if (!pam_auth($username, $password_current, &$error, FALSE)) {
        if (trim($error) == "Permission denied (in pam_authenticate)")
            array_push(&$messages, "ERROR: You've username/password was not accepted.");    
        else
            array_push(&$messages, "ERROR: " . $error);
        return FALSE;
    }

    if (change_password ($username, $password_current, $password_new))
        array_push(&$messages, "Password Successfully Changed");
    else 
        array_push(&$messages, "ERROR: Password change failed.");

}

if ($_SERVER['REQUEST_METHOD'] == 'POST') process_post();


?><html>
<head>


<title>Passwords</title>

<style type="text/css">

body {
    font-family: Verdana, Arial, sans-serif;
    font-size: 12px;
}

label {
    width: 150px;
    display: block;
    float: left;
}

input {
    float: left;
}

br {
    clear: both;
}

.message {
    font-size: 11px;
    font-weight: bold;
}

.error {
    color:#C00;
}


</style>

</head>


<body>

<h2>Change Passwords</h2>

<form action="<?= $_SERVER['SCRIPT_NAME'] ?>" method="post">

<fieldset>

<? if (count($messages) != 0) { 

    foreach ($messages as $message) { ?>

<p class="message<?= ((strpos($message, 'ERROR:') === FALSE) ? '' : ' error') ?>"><?= $message ?></p>

<? } } ?>

<label>Username: </label>
<input type="text" name="username" /><br />

<label>Current Password:</label>
<input type="password" name="password_current" /><br />

<label>New Password:</label>
<input type="password" name="password_new" /><br />

<label>Confirm Password:</label>
<input type="password" name="password_confirm" /><br />

<input type="reset" value="Reset" /> <input type="submit" value="Submit" />

</fieldset>


</form>


</body>
</html>

У меня также есть этот вопрос / ответ, размещенный в https://serverfault.com/questions/150306/how-to-let -users-change-linux-password-from-web-browser / 152409 # 152409

2
ответ дан 14 December 2019 в 18:59
поделиться

Существуют ли какие-либо рабочие пакеты для изменения паролей пользователей Linux с помощью PHP?

Это действительно очень опасно. Предполагая, что вы понимаете риски, вы поймете, что вам необходимо создать ряд ограничений, прежде чем применять изменение, которое должно быть реализовано на уровне привилегий, который позволяет изменять пароли, то есть код для его запуска должен быть автономным исполняемым файлом с либо setuid executoin, либо вызывается через sudo из вашего php-кода.

Конечно, нет никаких причин, по которым автономный код нельзя было бы написать на PHP, кроме того факта, что (по крайней мере, в последний раз, когда я смотрел на это) привязки PAM в PHP были довольно незрелыми,

Вы можете взглянуть на программу chpasswd (доступную в Redhat и некоторых других дистрибутивах) или использовать proc_open ('/ usr / bin / passwd' ... и правильно читать и отвечать на запросы.

HTH

] C.

0
ответ дан 14 December 2019 в 18:59
поделиться

Вы можете использовать пароли RSBAC.

$ret = system("echo \"newpass newpass\" | rsbac_password -n");

if ($ret)
    echo "fail.";
else
    echo "done!";

Намного проще.

0
ответ дан 14 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: