exec()를 사용하여 PHP에서 비밀번호 확인 명령 호출 - 사용자 입력을 피하는 방법은 무엇입니까?

exec()를 사용하여 PHP에서 비밀번호 확인 명령 호출 - 사용자 입력을 피하는 방법은 무엇입니까?

로그인 양식에 PAM을 통한 시스템의 로컬 사용자 인증이 필요한 PHP 기반 웹사이트를 개발 중입니다. 즉, 로컬 사용자 계정에 유효한 사용자 이름과 비밀번호를 입력하면 성공적으로 로그인할 수 있습니다. 서버. 이 웹사이트는 원래 사용되었습니다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. 이 설정은 전반적으로 얼마나 안전합니까? 내가 알아야 할 명백한 허점이 있습니까?

관련 정보