PHP 양식 기반 비밀번호 인증 및 HTTP 인증 사용 예제_php 기술

WBOY
풀어 주다: 2016-05-16 20:26:16
원래의
1173명이 탐색했습니다.

이 기사의 예에서는 PHP 양식 기반 비밀번호 인증 및 HTTP 인증의 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.

PHP의 HTTP 인증 메커니즘은 PHP가 Apache 모듈로 실행될 때만 작동하므로 이 기능은 CGI 버전에는 적용되지 않습니다. Apache 모듈의 PHP 스크립트에서는 header() 함수를 사용하여 클라이언트 브라우저에 "인증 필요" 정보를 전송하면 사용자 이름/비밀번호 입력 창이 팝업되도록 할 수 있습니다. 사용자가 사용자 이름과 비밀번호를 입력하면 URL이 포함된 PHP 스크립트는 사전 정의된 변수 PHP_AUTH_USER, PHP_AUTH_PW 및 AUTH_TYPE을 추가하고 이 세 가지 변수는 각각 사용자 이름, 비밀번호 및 인증 유형으로 설정됩니다. 사전 정의된 변수는 $_SERVER 또는 $HTTP_SERVER_VARS 배열에 저장됩니다. "기본" 및 "다이제스트"(PHP 5.1.0부터) 인증 방법을 지원합니다. 관심 있는 친구들은 header() 함수 관련 정보를 참고하면 됩니다.

PHP 버전 문제: $_SERVER 등을 포함한 자동 전역 변수는 PHP 4.1.0부터 유효하고, $HTTP_SERVER_VARS는 PHP 3부터 유효합니다.

다음은 페이지에서 클라이언트 인증을 강제하는 예제 스크립트입니다.

예제 34-1. 기본 HTTP 인증 예시

코드 복사 코드는 다음과 같습니다.
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {
헤더( 'WWW-인증: 기본 영역="내 영역"'
헤더( 'HTTP/1.0 401 권한 없음' ); echo '사용자가 취소 버튼을 누르면 보낼 텍스트'
종료
} 다른 {
echo "

안녕하세요 { $_SERVER [ 'PHP_AUTH_USER' ]} .


echo "

비밀번호로 { $_SERVER [ 'PHP_AUTH_PW' ]}를 입력하셨습니다.

" }  
?>

예시 34-2. 다이제스트 HTTP 인증 예시

이 예에서는 간단한 Digest HTTP 인증 스크립트를 구현하는 방법을 보여줍니다. 자세한 내용은 RFC 2617을 참조하세요.


코드 복사 코드는 다음과 같습니다. $realm = '제한 구역'
//사용자 => 비밀번호
$users = array( 'admin' => 'mypass' , 'guest' => 'guest' );
if (!isset( $_SERVER [ 'PHP_AUTH_DIGEST' ])) {
헤더( 'HTTP/1.1 401 권한 없음' ); 헤더( 'WWW-Authenticate: Digest realm="' . $realm .
'" qop="auth" nonce="' . uniqid(). '" opaque="' . md5 ( $realm );
Die( '사용자가 취소 버튼을 누르면 보낼 텍스트' ); }
// PHP_AUTH_DIGEST 변수 분석
preg_match ( '/username="(?P.*)",s*realm="(?P.*)",s*nonce="(?P.*)", s*uri="(?P.*)",s*response="(?P.*)",s*opaque="(?P.*)",s* qop=(?P.*),s*nc=(?P.*),s*cnonce="(?P.*)"/' , $_SERVER [ 'PHP_AUTH_DIGEST' ], $다이제스트 )
if (!isset( $users [ $digest [ '사용자 이름' ]]))
Die( '유효하지 않은 사용자 이름!' );
// 유효한 응답을 생성합니다
$A1 = md5 ( $digest [ '사용자 이름' ] . ':' . $realm . ':' . $users [ $digest [ '사용자 이름' ]]); $A2 = md5 ( $_SERVER [ 'REQUEST_METHOD' ]. ':' . $digest [ 'uri' ]); $valid_response = md5 ( $A1 . ':' . $digest [ 'nonce' ]. ':' . $digest [ 'nc' ]. ':' . $digest [ 'cnonce' ]. ':' . $digest [ 'qop' ]. ':' )
if ( $digest [ '응답' ] != $valid_response )
Die( '잘못된 자격 증명!' ); // 네, 유효한 사용자 이름과 비밀번호입니다
echo '다음 계정으로 로그인되었습니다: ' . $digest [ '사용자 이름' ]; ?>

호환성 문제: HTTP 헤더 코드를 작성할 때 주의하세요. 모든 클라이언트와의 호환성을 보장하려면 키워드 "Basic"의 첫 글자를 구분 문자인 "B"로 대문자로 사용해야 합니다. 문자열을 인용해야 합니다. 큰따옴표(작은따옴표 아님)를 사용하고 헤더 줄 HTTP/1.0 401에는 401 앞에 정확히 공백이 하나 있어야 합니다.

위의 예에서는 PHP_AUTH_USER 및 PHP_AUTH_PW 값만 인쇄되지만 실제 응용 프로그램에서는 사용자 이름과 비밀번호의 유효성을 확인하거나 데이터베이스 튜토리얼을 쿼리하거나 dbm 파일 .

일부 Internet Explorer 브라우저에는 고유한 문제가 있습니다. 헤더 순서가 좀 까다로운 것 같습니다. 현재 HTTP/1.0 401을 보내기 전에 WWW-Authenticate 헤더를 보내면 이 문제를 해결할 수 있는 것으로 보입니다.

PHP 4.3.0부터 기존 외부 메커니즘으로 인증된 페이지에서 누군가가 비밀번호를 얻기 위한 스크립트를 작성하는 것을 방지하기 위해 특정 페이지에 대해 외부 인증이 유효하고 보안 모드가 켜져 있을 때 PHP_AUTH 변수는 설정되지 않으나, REMOTE_USER를 이용하여 외부에서 인증된 사용자를 식별할 수 있으므로 $_SERVER['REMOTE_USER'] 변수를 이용할 수 있습니다.

구성 지침:PHP는 AuthType 지시문을 사용하여 외부 인증 메커니즘이 유효한지 확인합니다.

이렇게 해도 누군가가 인증되지 않은 URL을 사용하여 동일한 서버에 있는 인증된 URL에서 비밀번호를 훔치는 것을 방지할 수는 없습니다.

Netscape Navigator 및 Internet Explorer 브라우저는 401 서버 반환 메시지를 수신할 때 전체 도메인에 대한 모든 로컬 브라우저의 Windows 인증 캐시를 지웁니다. 이렇게 하면 사용자가 효과적으로 로그아웃되고 사용자 이름과 이름을 다시 입력해야 합니다. 어떤 사람들은 로그인 상태를 "만료"하거나 "로그아웃" 버튼의 응답 동작으로 이 방법을 사용합니다.

예 34-3. 사용자 이름과 비밀번호를 강제로 재입력하는 HTTP 인증의 예

코드 복사 코드는 다음과 같습니다.
함수 인증 () {
헤더( 'WWW-Authenticate: Basic realm="테스트 인증 시스템"' ); 헤더( 'HTTP/1.0 401 권한 없음' ); echo "이 리소스에 액세스하려면 유효한 로그인 ID와 비밀번호를 입력해야 합니다."
종료
}
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||
( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {
인증(); }  
그렇지 않으면 {
echo "환영합니다: { $_SERVER [ 'PHP_AUTH_USER' ]}
" echo "기존: { $_REQUEST [ 'OldAuth' ]} "
echo "
n " ; echo "<입력 유형='숨김' 이름='SeenBefore' 값='1' />n"
echo " n " ; echo "<입력 유형='제출' 값='재인증' />n"
echo "

n"
}
?>

이 동작은 HTTP의 기본 인증 표준에는 필요하지 않으므로 이 방법을 신뢰할 수 없습니다. Lynx 브라우저 테스트에 따르면 Lynx는 인증이 유효한 한 401 서버 반환 정보를 수신할 때 인증 파일을 지우지 않습니다. 파일 검사 요구 사항은 변경되지 않았습니다. 사용자가 "뒤로" 버튼을 클릭한 후 "앞으로" 버튼을 클릭하면 원래 리소스에 계속 액세스할 수 있습니다. 그러나 사용자는 "_"를 눌러 인증 정보를 지울 수 있습니다. 키.

다음 예에서는 $PHP_AUTH_USER 및 $PHP_AUTH_PW 두 변수를 사용하여 참가자가 합법적인지 확인하고 입장을 허용합니다. 이 예에서 로그인이 허용된 사용자 이름과 비밀번호 쌍은 tnc와 nature입니다:


코드 복사


코드는 다음과 같습니다.
if(!isset($PHP_AUTH_USER))
{
Header("WWW-인증: 기본 영역="내 영역""); 헤더("HTTP/1.0 401 권한 없음"); echo "사용자가 취소 버튼을 누르면 보낼 텍스트"
종료
}
그렇지 않으면
{
if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="자연") )
{
// 사용자 이름/비밀번호 쌍이 잘못된 경우 강제 재인증
Header("WWW-인증: 기본 영역="내 영역""); 헤더("HTTP/1.0 401 권한 없음"); echo "오류: $PHP_AUTH_USER/$PHP_AUTH_PW가 유효하지 않습니다."; 종료
}
그렇지 않으면
{
echo "TNC에 오신 것을 환영합니다!"; }
?>

실제로 실제 참고 자료에서는 위의 코드 조각에서 명백한 사용자 이름/비밀번호 쌍을 사용할 가능성이 거의 없지만 데이터베이스 또는 암호화된 비밀번호 파일을 사용하여 액세스합니다.


지정된 확인 정보를 기반으로 사용자 신원 확인:

먼저 다음 코드를 사용하여 사용자가 사용자 이름과 비밀번호를 입력했는지 확인하고 사용자가 입력한 정보를 표시할 수 있습니다.

코드 복사


echo "

다음 사용자 이름을 입력하셨습니다: $PHP_AUTH_USER

다음 비밀번호를 입력하셨습니다: $PHP_AUTH_PW
인증 유형은 $PHP_AUTH_TYPE

";
}
?>


설명:


isset() 함수는 변수에 값이 할당되었는지 확인하는 데 사용되며, 변수 값의 존재 여부에 따라 true 또는 false를 반환합니다.

header() 함수는 특정 HTTP 헤더를 보내는 데 사용됩니다. header() 함수를 사용할 때 실제 출력을 생성하는 HTML 또는 PHP 코드 전에 이 함수를 호출해야 합니다.
위 코드는 매우 간단하고 실제 값을 기반으로 사용자가 입력한 사용자 이름과 비밀번호를 효과적으로 검증하지 못하지만 최소한 PHP를 사용하여 클라이언트 측에서 입력 대화 상자를 생성하는 방법은 이해하고 있습니다.
다음으로, 지정된 인증 정보를 기반으로 사용자의 신원을 확인하는 방법을 알아보겠습니다.

코드 복사

코드는 다음과 같습니다.


if (!isset($PHP_AUTH_USER)) { header('WWW-인증: 기본 영역="내 개인 정보"'); header('HTTP/1.0 401 권한 없음'); echo '인증이 필요합니다.'; 종료 } else if (isset($PHP_AUTH_USER)) { if (($PHP_AUTH_USER != "관리자") || ($PHP_AUTH_PW != "123")) { header('WWW-인증: 기본 영역="내 개인 정보"'); header('HTTP/1.0 401 권한 없음'); echo '인증이 필요합니다.'; 종료 } 다른 {

echo "

권한이 있습니다!

"; }

}
?>

여기서는 먼저 사용자가 사용자 이름과 비밀번호를 입력했는지 확인하고, 그렇지 않은 경우에는 사용자에게 신원 정보를 입력하라는 해당 대화 상자가 나타납니다. 그런 다음 사용자가 입력한 정보가 일치하는지 판단하여 권한을 부여합니다. 지정된 사용자 계정 admin/123. 사용자에게 올바른 정보를 다시 입력하라는 메시지를 표시하는 방법은 모든 사용자가 동일한 로그인 계정을 사용하는 웹사이트에 적합합니다.

또 다른 간단한 비밀번호 확인


Windows 98에서 PHP 스크립트를 작성하여 실행하거나, Linux에서 기본 설정에 따라 PHP를 CGI 프로그램으로 설치하는 경우 위의 PHP 프로그램을 사용하여 검증 기능을 구현할 수 없습니다. 이러한 이유로 Wubian에서는 또 다른 간단한 비밀번호 확인 방법을 제공합니다. 비록 실용적이지는 않지만 학습에는 좋습니다.




코드 복사


코드는 다음과 같습니다.
if($_POST[Submit]=="Submit"){ //사용자가 데이터를 제출하면 작업을 수행합니다.
$password=$_POST[password]; //사용자가 입력한 데이터를 가져와 변수 비밀번호에 저장합니다
$cpassword=$_POST[cpassword]; //사용자가 입력한 확인 데이터를 가져와 $cpassord 변수에 저장합니다.
if(emptyempty($password) || 비어 있음($cpassword))
{
Die("비밀번호는 비워둘 수 없습니다!"); }
elseif ( ((strlen($password) < 5) || (strlen($password) > 15)))
{
Die("비밀번호 길이는 5에서 15 사이입니다.")
}
//--- 값 비교
elseif ( !(strlen($password) == strlen($cpassword)) )
{
Die("두번 입력한 비밀번호가 일치하지 않습니다!"); }
elseif( !($password === $cpassword)) //값과 데이터 유형 비교
{
die("두 비밀번호가 일치하지 않습니다!"); }
else //비밀번호를 출력하는 루프입니다. 비밀번호이므로 * 기호가 출력됩니다
{
for ($i=0;$i           {
                에코 "*";         }
}
}
?>
양식 유효성 검사-비밀번호 필드 유효성 검사

비밀번호를 입력하세요:
비밀번호 확인:

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!