exec()を使用してPHPでパスワードを確認するコマンドを呼び出す - ユーザー入力を避けるには?

exec()を使用してPHPでパスワードを確認するコマンドを呼び出す - ユーザー入力を避けるには?

ログインフォームにPAMを介したシステムのローカルユーザー認証を必要とするPHPベースのWebサイトを開発しています。つまり、ローカルユーザーアカウントに有効なユーザー名とパスワードを入力すると、正常にログインできます。サーバー。このウェブサイトはもともと使用されていましたPHP - 認証 - ファームモジュールですが使用されなくなったため、現在代替ソリューションを見つける必要があります。

ついに会ったこの回答PAM認証に役立つCスクリプトが付属しています。chkpasswd実行したばかりのユーザー名/パスワードの組み合わせを確認するために、andという実行可能ファイルに正常にコンパイルしました。

./chkpasswd username password

資格情報が有効な場合は「確認済み」が出力され、有効でない場合は「未確認」が出力されます。この部分は問題なく魅力のように動作します。

しかしすぐに私は明らかな問題があることに気づきました。パスワードに特殊文字が含まれていると、この設定が正しく機能しないということです!資格情報が正しい場合でも、ユーザーは認証されていないと表示されます。私はchkpasswdPHPのexec()関数呼び出しを使用しており、これを使用してescapeshellarg()ユーザー入力をエスケープしています。これはPHPコードです:

function pam_auth2($username, $password){
    $result = exec("/usr/local/sbin/chkpasswd ".escapeshellarg($username)." ".escapeshellarg($password));

    if ($result == "Authenticated"){
        return true;
    }
    else{
        return false;
    }

}

私の主な質問は次のとおりです。

  1. システムが特殊文字を含むパスワードを正しく処理するようにCスクリプトまたはそれを呼び出すPHPコードを変更できますか?
  2. この設定は全体的にどれくらい安全ですか?私が知る必要がある明らかな抜け穴はありますか?

ベストアンサー1

おすすめ記事