ログインフォームにPAMを介したシステムのローカルユーザー認証を必要とするPHPベースのWebサイトを開発しています。つまり、ローカルユーザーアカウントに有効なユーザー名とパスワードを入力すると、正常にログインできます。サーバー。このウェブサイトはもともと使用されていましたPHP - 認証 - ファームモジュールですが使用されなくなったため、現在代替ソリューションを見つける必要があります。
ついに会ったこの回答PAM認証に役立つCスクリプトが付属しています。chkpasswd
実行したばかりのユーザー名/パスワードの組み合わせを確認するために、andという実行可能ファイルに正常にコンパイルしました。
./chkpasswd username password
資格情報が有効な場合は「確認済み」が出力され、有効でない場合は「未確認」が出力されます。この部分は問題なく魅力のように動作します。
しかしすぐに私は明らかな問題があることに気づきました。パスワードに特殊文字が含まれていると、この設定が正しく機能しないということです!資格情報が正しい場合でも、ユーザーは認証されていないと表示されます。私はchkpasswd
PHPの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;
}
}
私の主な質問は次のとおりです。
- システムが特殊文字を含むパスワードを正しく処理するようにCスクリプトまたはそれを呼び出すPHPコードを変更できますか?
- この設定は全体的にどれくらい安全ですか?私が知る必要がある明らかな抜け穴はありますか?