불쌍한 회원 등록 PHP. PHP와 MySQL로 놀라울 정도로 간단한 등록 시스템 구축하기

회원 기반 사이트를 만드는 것은 처음에는 어려운 작업처럼 보입니다. 혼자서 이 작업을 수행하고 싶었지만 PHP 기술을 사용하여 어떻게 조합할지 생각하기 시작했을 때 포기했다면 이 기사가 도움이 될 것입니다. 우리는 비밀번호로 보호되는 안전한 회원 영역을 갖춘 회원 기반 사이트를 만드는 모든 측면을 안내해 드립니다.

전체 프로세스는 사용자 등록과 사용자 인증이라는 두 가지 큰 부분으로 구성됩니다. 첫 번째 부분에서는 등록 양식을 생성하고 MySQL 데이터베이스에 데이터를 저장하는 방법을 다룰 것입니다. 두 번째 부분에서는 로그인 양식을 생성하고 이를 사용하여 사용자가 보안 영역에 액세스할 수 있도록 하겠습니다.

코드 다운로드

아래 링크에서 등록/로그인 시스템의 전체 소스 코드를 다운로드할 수 있습니다.

구성 및 업로드
ReadMe 파일에는 자세한 지침이 포함되어 있습니다.

열기 소스\include\membersite_config.php텍스트 편집기에서 파일을 작성하고 구성을 업데이트하십시오. (데이터베이스 로그인, 웹사이트 이름, 이메일 주소 등).

전체 디렉터리 내용을 업로드합니다. 양식을 제출하여 Register.php를 테스트하십시오.

등록 양식

사용자 계정을 생성하려면 사용자로부터 최소한의 정보를 수집해야 합니다. 그의 이름, 이메일 주소, 원하는 사용자 이름과 비밀번호가 필요합니다. 물론 이 시점에서 더 많은 정보를 요청할 수 있지만 긴 형식은 항상 꺼려집니다. 따라서 해당 필드에만 국한해 보겠습니다.

등록 양식은 다음과 같습니다.

등록하다

따라서 이름, 이메일, 비밀번호를 입력하는 텍스트 필드가 있습니다. 우리는 더 나은 사용성을 위해 를 사용하고 있습니다.

양식 유효성 검사

이 시점에서는 일부 양식 확인 코드를 제자리에 배치하여 사용자 계정을 만드는 데 필요한 모든 데이터가 있는지 확인하는 것이 좋습니다. 이름, 이메일, 비밀번호가 제대로 입력되었는지, 이메일 형식이 올바른지 확인해야 합니다.

양식 제출 처리

이제 제출된 양식 데이터를 처리해야 합니다.

다음은 순서입니다(다운로드한 소스의 fg_membersite.php 파일 참조).

function RegisterUser() ( if(!isset($_POST["submitted"])) ( return false; ) $formvars = array(); if(!$this->ValidateRegistrationSubmission()) ( return false; ) $this- >CollectRegistrationSubmission($formvars); if(!$this->SaveToDatabase($formvars)) ( false 반환; ) if(!$this->SendUserConfirmationEmail($formvars)) ( false 반환; ) $this->SendAdminIntimationEmail($ formvars); true를 반환합니다. )

먼저 양식 제출을 확인합니다. 그런 다음 양식 제출 데이터를 수집하고 '위생'합니다(이메일을 보내기 전에, 데이터베이스에 저장하기 전에 항상 이 작업을 수행합니다). 그러면 양식 제출이 데이터베이스 테이블에 저장됩니다. 사용자에게 확인을 요청하는 이메일을 보냅니다. 그런 다음 사용자가 등록한 관리자에게 정보를 제공합니다.

데이터베이스에 데이터 저장

이제 모든 데이터를 수집했으므로 이를 데이터베이스에 저장해야 합니다.
다음은 양식 제출을 데이터베이스에 저장하는 방법입니다.

function SaveToDatabase(&$formvars) ( if(!$this->DBLogin()) ( $this->HandleError("데이터베이스 로그인 실패!"); return false; ) if(!$this->Ensuretable()) ( return false; ) if(!$this->IsFieldUnique($formvars,"email")) ( $this->HandleError("이 이메일은 이미 등록되었습니다."); return false; ) if(!$this->IsFieldUnique( $formvars,"username")) ( $this->HandleError("이 UserName은(는) 이미 사용되었습니다. 다른 사용자 이름을 시도하십시오."); return false; ) if(!$this->InsertIntoDB($formvars)) ( $this- >HandleError("데이터베이스에 삽입하지 못했습니다!"); false 반환; ) true 반환; )

membersite_config.php 파일에서 데이터베이스 로그인 세부 정보를 구성했습니다. 대부분의 경우 데이터베이스 호스트로 "localhost"를 사용할 수 있습니다.
로그인 후 테이블이 존재하는지 확인합니다. (그렇지 않으면 스크립트가 필요한 테이블을 생성합니다.)
그런 다음 사용자 이름과 이메일이 고유한지 확인합니다. 고유하지 않은 경우 사용자에게 오류를 반환합니다.

데이터베이스 테이블 구조

테이블 구조입니다. fg_membersite.php 파일의 CreateTable() 함수는 테이블을 생성합니다. 코드는 다음과 같습니다.

function CreateTable() ( $qry = "테이블 만들기 $this->tablename (". "id_user INT NOT NULL AUTO_INCREMENT ," "name VARCHAR(128) NOT NULL ," "email VARCHAR(64) NOT NULL ," " "phone_number VARCHAR(16) NOT NULL ," "사용자 이름 VARCHAR(16) NOT NULL ," "비밀번호 VARCHAR(32) NOT NULL ," "확인 코드 VARCHAR(32) ," "PRIMARY KEY(id_user)." ")"; if( !mysql_query($qry,$this->connection)) ( $this->HandleDBError("\nquery was\n $qry 테이블 생성 오류"); return false; ) return true; )

id_user 필드에는 사용자의 고유 ID가 포함되며 테이블의 기본 키이기도 합니다. 비밀번호 필드에는 32자를 허용합니다. 추가 보안 조치로 MD5를 사용하여 암호화된 데이터베이스에 비밀번호를 저장하기 때문에 이렇게 합니다. MD5는 단방향 암호화 방식이므로 사용자가 비밀번호를 잊어버린 경우에는 비밀번호를 복구할 수 없습니다.

테이블에 등록 삽입

다음은 데이터베이스에 데이터를 삽입하는 데 사용하는 코드입니다. $formvars 배열에서 모든 데이터를 사용할 수 있습니다.

function InsertIntoDB(&$formvars) ( $confirmcode = $this->MakeConfirmationMd5($formvars["email"]); $insert_query = "".$this->tablename에 삽입합니다."(이름, 이메일, 사용자 이름, 비밀번호, 확인 코드) 값 ​​("" . $this->SanitizeForSQL($formvars["name"]) . "", "" . $this->SanitizeForSQL($formvars["email"]) . "", "" . $ this->SanitizeForSQL($formvars["username"]) . "", "" . md5($formvars["password"]) . "", "" . $confirmcode . "")"; if(! mysql_query( $insert_query ,$this->connection)) ( $this->HandleDBError("테이블에 데이터를 삽입하는 중 오류 발생\nquery:$insert_query"); return false; ) return true; )

비밀번호를 데이터베이스에 삽입하기 전에 PHP 함수 md5()를 사용하여 비밀번호를 암호화합니다.
또한, 당사는 사용자의 이메일 주소로부터 고유한 확인 코드를 생성합니다.

이메일 보내기

이제 데이터베이스에 등록이 완료되었으므로 사용자에게 확인 이메일을 보내겠습니다. 사용자는 등록 절차를 완료하려면 확인 이메일에 있는 링크를 클릭해야 합니다.

function SendUserConfirmationEmail(&$formvars) ( $mailer = new PHPMailer(); $mailer->CharSet = "utf-8"; $mailer->AddAddress($formvars["email"],$formvars["name"]) ; $mailer->Subject = "".$this->sitename으로 등록; $mailer->From = $this->GetFromAddress(); $confirmcode = urlencode($this->MakeConfirmationMd5($formvars["email") ])); $confirm_url = $this->GetAbsoluteURLFolder()."/confirmreg.php?code=".$confirmcode; $mailer->Body ="안녕하세요 ".$formvars["name"]."\r\ n\r\n". "".$this->sitename."\r\n으로 등록해 주셔서 감사합니다.". "등록을 확인하려면 아래 링크를 클릭하십시오.\r\n." "$confirm_url\r \n". "\r\n". "감사합니다,\r\n". "웹마스터\r\n". $this->sitename; if(!$mailer->Send()) ( $this-> HandleError("등록 확인 이메일 전송에 실패했습니다."); false 반환; ) true 반환; )

업데이트

2012년 1월 9일
비밀번호 재설정/비밀번호 변경 기능이 추가되었습니다.
이제 코드가 GitHub에서 공유됩니다.

돌아온 것을 환영합니다사용자전체이름(); ?>!

특허


코드는 LGPL 라이센스에 따라 공유됩니다. 상업용 또는 비상업적 웹사이트에서 자유롭게 사용할 수 있습니다.

연관된 포스트가 없습니다.

이 항목에 대한 댓글이 닫혀 있습니다.

이 기사에서 당신은 배울 것입니다 등록 및 승인 양식을 만드는 방법 HTML, JavaScript, PHP 및 MySql을 사용합니다. 이러한 양식은 유형에 관계없이 거의 모든 웹사이트에서 사용됩니다. 포럼, 온라인 상점, 소셜 네트워크(예: Facebook, Twitter, Odnoklassniki) 및 기타 여러 유형의 사이트용으로 만들어졌습니다.

로컬 컴퓨터에 웹사이트가 있다면 이미 갖고 있기를 바랍니다. 로컬 서버가 설치되어 실행 중입니다.. 그것 없이는 아무것도 작동하지 않습니다.

데이터베이스에 테이블 생성

사용자 등록을 구현하려면 먼저 데이터베이스가 필요합니다. 이미 가지고 있다면 좋습니다. 그렇지 않으면 만들어야 합니다. 기사에서는 이를 수행하는 방법을 자세히 설명합니다.

이제 데이터베이스(DB로 약칭)가 생겼으니 이제 테이블을 생성해야 합니다. 사용자여기에 등록된 사용자를 추가하겠습니다.

또한 기사에서는 데이터베이스에 테이블을 만드는 방법도 설명했습니다. 테이블을 만들기 전에 테이블에 포함될 필드를 결정해야 합니다. 이 필드는 등록 양식의 필드에 해당합니다.

그래서 우리는 양식에 어떤 필드가 포함될지 상상하고 테이블을 만들었습니다. 사용자다음 필드로:

  • ID- 식별자. 필드 ID데이터베이스의 모든 테이블에 이 항목이 있어야 합니다.
  • 이름- 이름을 저장하려면.
  • - 성을 보존하기 위해.
  • 이메일- 우편주소를 저장합니다. 이메일을 로그인으로 사용할 것이므로 이 필드는 고유해야 합니다. 즉, UNIQUE 인덱스를 가져야 합니다.
  • 이메일_상태- 메일의 확인 여부를 나타내는 필드입니다. 메일이 확인되면 값은 1이 되고, 그렇지 않으면 값이 0이 됩니다.
  • 비밀번호- 비밀번호를 저장하려면.


등록 양식에 다른 필드를 추가하려면 여기에 추가할 수도 있습니다.

바로 그거야, 우리 테이블 사용자준비가 된. 다음 단계로 넘어 갑시다.

데이터베이스 연결

데이터베이스를 만들었으니 이제 연결해야 합니다. PHP 확장 MySQLi를 사용하여 연결하겠습니다.

우리 사이트의 폴더에 다음과 같은 이름의 파일을 만듭니다. dbconnect.php을 입력하고 그 안에 다음 스크립트를 작성합니다.

DB 연결 오류. 오류 설명: ".mysqli_connect_error()."

";exit(); ) // 연결 인코딩 설정 $mysqli->set_charset("utf8"); // 편의상 여기에 사이트 이름을 포함하는 변수를 추가합니다. $address_site = "http://testsite .로컬" ; ?>

이 파일 dbconnect.php양식 처리기를 사용하려면 연결해야 합니다.

변수에 주목하세요 $address_site, 여기에 제가 작업할 테스트 사이트의 이름을 표시했습니다. 이에 따라 귀하의 사이트 이름을 표시하십시오.

사이트 구조

이제 우리 사이트의 HTML 구조를 살펴보겠습니다.

사이트의 머리글과 바닥글을 별도의 파일로 옮겨보겠습니다. 헤더.php그리고 바닥글.php. 모든 페이지에 포함하겠습니다. 즉, 메인 페이지(파일 index.php), 등록 양식(파일)이 있는 페이지로 form_register.php) 및 승인 양식(파일)이 있는 페이지로 이동합니다. form_auth.php).

우리의 링크로 차단하세요. 등록그리고 권한 부여, 모든 페이지에 표시되도록 사이트 헤더에 추가하세요. 하나의 링크가 다음 위치에 입력됩니다. 등록 양식 페이지(파일 form_register.php) 다른 하나는 다음 페이지로 이동합니다. 승인 양식(파일 form_auth.php).

header.php 파일의 내용:

우리 사이트의 이름

결과적으로 우리의 메인 페이지는 다음과 같습니다:


물론 귀하의 사이트는 완전히 다른 구조를 가질 수 있지만 이는 현재 우리에게 중요하지 않습니다. 가장 중요한 것은 등록 및 승인을 위한 링크(버튼)가 있다는 것입니다.

이제 등록 양식으로 넘어 갑시다. 이미 이해하셨듯이 파일에 보관되어 있습니다. form_register.php.

데이터베이스(phpMyAdmin)로 이동하여 테이블 구조를 엽니다. 사용자어떤 분야가 필요한지 살펴보세요. 즉, 이름과 성을 입력하는 필드, 우편 주소(이메일)를 입력하는 필드, 비밀번호를 입력하는 필드가 필요합니다. 그리고 보안을 위해 보안문자 입력 필드를 추가하겠습니다.

서버에서는 등록 양식을 처리한 결과 다양한 오류가 발생하여 사용자가 등록할 수 없게 될 수 있습니다. 따라서 사용자가 등록 실패 이유를 이해할 수 있도록 이러한 오류에 대한 메시지를 표시해야 합니다.

양식을 표시하기 전에 세션의 오류 메시지를 표시하는 블록을 추가하세요.

그리고 한 가지 더, 사용자가 이미 인증을 받은 상태에서 호기심에 브라우저 주소 표시줄에 직접 입력하여 등록 페이지로 이동하는 경우 site_address/form_register.php, 이 경우 등록 양식 대신 이미 등록되었다는 헤더가 표시됩니다.

일반적으로 파일 코드는 form_register.php우리는 이것을 얻었습니다:

너는 이미 등록 되었어

브라우저에서 등록 양식이 포함된 페이지는 다음과 같습니다.


사용하여 필수 속성, 모든 필드를 필수로 설정했습니다.

등록 양식 코드에 주의하세요. 보안 문자가 표시됩니다:


이미지의 src 속성 값에 파일 경로를 지정했습니다. 보안 문자.php, 이 보안 문자를 생성합니다.

파일코드를 살펴보자 보안 문자.php:

코드에 주석이 잘 달려 있으므로 한 가지 사항에만 집중하겠습니다.

함수 내부 이미지Ttf텍스트(), 글꼴 경로가 지정됩니다 verdana.ttf. 따라서 보안 문자가 올바르게 작동하려면 폴더를 만들어야 합니다. 글꼴, 거기에 글꼴 파일을 배치합니다. verdana.ttf. 인터넷에서 찾아 다운로드하거나 이 기사의 자료와 함께 아카이브에서 가져올 수 있습니다.

우리는 HTML 구조를 마쳤습니다. 이제 다음 단계로 넘어갈 시간입니다.

jQuery를 사용하여 이메일 유효성 확인

모든 양식은 클라이언트 측(JavaScript, jQuery 사용)과 서버 측 모두에서 입력된 데이터의 유효성을 확인해야 합니다.

이메일 필드에 특별한 주의를 기울여야 합니다. 입력한 우편 주소가 유효한지 확인하는 것이 매우 중요합니다.

이 입력 필드에 대해 이메일 유형(type="email")을 설정했는데 이는 잘못된 형식에 대해 약간의 경고를 제공합니다. 하지만 이것만으로는 충분하지 않습니다. 왜냐하면 브라우저가 제공하는 코드 검사기를 통해 속성 값을 쉽게 변경할 수 있기 때문입니다. 유형와 함께 이메일~에 텍스트, 그게 다입니다. 수표는 더 이상 유효하지 않습니다.


그리고 이 경우에는 좀 더 확실한 확인을 해야 합니다. 이를 위해 JavaScript의 jQuery 라이브러리를 사용합니다.

jQuery 라이브러리를 연결하려면 파일에서 헤더.php태그 사이 , 닫는 태그 앞 , 다음 줄을 추가하세요.

이 줄 바로 뒤에 이메일 확인 코드가 추가됩니다. 여기서는 입력된 비밀번호의 길이를 확인하는 코드를 추가하겠습니다. 길이는 6자 이상이어야 합니다.

이 스크립트를 사용하여 입력된 이메일 주소의 유효성을 확인합니다. 사용자가 잘못된 이메일을 입력한 경우 이에 대한 오류 메시지가 표시되고 양식 제출 버튼이 비활성화됩니다. 모든 것이 정상이면 오류를 제거하고 양식 제출 버튼을 활성화합니다.

이제 클라이언트 측에서 양식 유효성 검사가 완료되었습니다. 이제 이를 서버로 보낼 수 있으며, 여기서 몇 가지 검사를 수행하고 데이터베이스에 데이터를 추가할 수도 있습니다.

사용자 등록

처리를 위해 양식을 파일로 보냅니다. 레지스터.php, POST 메서드를 통해. 이 핸들러 파일의 이름은 속성 값에 지정됩니다. 행동. 그리고 전송 방법은 속성 값에 지정됩니다. 방법.

이 파일 열기 레지스터.php가장 먼저 해야 할 일은 세션 시작 함수를 작성하고 앞서 만든 파일을 연결하는 것입니다. dbconnect.php(이 파일에서는 데이터베이스에 연결했습니다). 그리고 바로 셀을 선언해보자 오류 메시지그리고 성공_메시지전역 세션 배열에서. 안에 오류_메시지양식 처리 중에 발생하는 모든 오류 메시지를 기록하고 성공_메시지, 즐거운 메시지를 녹음해 드립니다.

계속하기 전에 확인해야 할 사항 양식이 제출되었나요?. 공격자는 속성 값을 볼 수 있습니다 행동양식에서 어떤 파일이 이 양식을 처리하고 있는지 알아보세요. 그리고 브라우저의 주소 표시줄에 다음 주소를 입력하여 이 파일로 직접 이동하려는 아이디어가 있을 수도 있습니다. http://site_address/register.php

따라서 이름이 양식의 "등록" 버튼 이름과 일치하는 전역 POST 배열의 셀을 확인해야 합니다. 이렇게 하면 "등록" 버튼이 클릭되었는지 여부를 확인할 수 있습니다.

공격자가 이 파일로 직접 이동하려고 하면 오류 메시지를 받게 됩니다. $address_site 변수에는 사이트 이름이 포함되어 있으며 파일에 선언되어 있음을 상기시켜 드리겠습니다. dbconnect.php.

오류!메인 페이지.

"); } ?>

세션의 보안 문자 값은 생성 시 파일에 추가되었습니다. 보안 문자.php. 다시 한 번 말씀드리자면, 파일의 이 코드 부분을 다시 보여드리겠습니다. 보안 문자.php, 보안 문자 값이 세션에 추가됩니다.

이제 검증 자체를 진행하겠습니다. 파일에 있음 레지스터.php, if 블록 내에서 "등록" 버튼이 클릭되었는지 또는 "주석이 표시된" 위치를 확인합니다. // (1) 다음 코드를 위한 공간"우리는 쓴다:

//수신된 보안문자 확인 //줄의 시작과 끝에서 공백을 제거합니다. $captcha = Trim($_POST["captcha"]); if(isset($_POST["captcha"]) && !empty($captcha))( //수신된 값을 세션의 값과 비교합니다. if(($_SESSION["rand"] != $captcha) && ($_SESSION ["rand"] != ""))( // 보안 문자가 올바르지 않으면 사용자를 등록 페이지로 돌아가서 잘못된 보안 문자를 입력했다는 오류 메시지가 표시됩니다. . $error_message = "

오류!잘못된 보안 문자를 입력했습니다

"; // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] = $error_message; // 사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: " .$address_site ."/form_register.php"); //스크립트를 중지합니다.exit(); ) // (2) 다음 코드 조각을 위한 장소 )else( //보안 문자가 전달되지 않거나 비어 있는 경우 종료 ("

오류!인증코드, 즉 보안문자 코드가 없습니다. 메인페이지로 이동하실 수 있습니다.

"); }

다음으로 POST 배열에서 수신된 데이터를 처리해야 합니다. 우선, 전역 POST 배열의 내용, 즉 양식의 입력 필드 이름과 일치하는 이름을 가진 셀이 있는지 확인해야 합니다.

셀이 존재하는 경우 이 셀에서 줄의 시작과 끝에서 공백을 잘라냅니다. 그렇지 않으면 사용자를 등록 양식이 있는 페이지로 다시 리디렉션합니다.

다음으로, 공백을 잘라낸 후 변수에 줄을 추가하고 이 변수가 비어 있는지 확인합니다. 비어 있지 않으면 계속 진행하고, 그렇지 않으면 사용자를 등록 양식이 있는 페이지로 다시 리디렉션합니다.

이 코드를 지정된 위치에 붙여넣으세요." // (2) 다음 코드를 위한 공간".

/* 전역 배열 $_POST에 폼에서 보낸 데이터가 있는지 확인하고 제출된 데이터를 일반 변수에 래핑합니다.*/ if(isset($_POST["first_name"]))( //처음부터 공백을 잘라냅니다. 및 문자열 끝 $first_name = Trim($_POST["first_name"]); //변수가 비어 있는지 확인합니다. if(!empty($first_name))( // 안전을 위해 특수 문자를 HTML 엔터티로 변환합니다. $first_name = htmlspecialchars($first_name, ENT_QUOTES) ; )else( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

당신의 이름을 입력

이름 필드가 누락되었습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) if( isset($_POST["last_name"]))( //줄의 시작과 끝에서 공백 제거 $last_name = Trim($_POST["last_name"]); if(!empty($last_name)) ( // 보안을 위해 특수 문자를 HTML 엔터티로 변환합니다. $last_name = htmlspecialchars($last_name, ENT_QUOTES); )else( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

당신의 성을 입력하세요

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

성 필드가 누락되었습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) if( isset($_POST["email"]))( //줄의 시작과 끝에서 공백 제거 $email = Trim($_POST["email"]); if(!empty($email)) ( $email = htmlspecialchars ($email, ENT_QUOTES); // (3) 이메일 주소 형식 및 고유성을 확인하기 위한 코드 위치 )else( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

이메일을 입력하세요

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) if( isset($_POST["password"]))( //문자열의 시작과 끝에서 공백 제거 $password = Trim($_POST["password"]); if(!empty($password)) ( $password = htmlspecialchars ($password, ENT_QUOTES); //비밀번호를 암호화합니다 $password = md5($password."top_secret"); )else( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

비밀번호를 입력하세요

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) // (4) 데이터베이스에 사용자를 추가하는 코드를 입력하는 위치

특히 중요한 분야는 이메일. 수신된 우편 주소의 형식과 데이터베이스의 고유성을 확인해야 합니다. 즉, 이미 등록된 동일한 이메일 주소를 가진 사용자가 있습니까?

지정된 위치에서" // (3) 우편 주소의 형식과 고유성을 확인하는 코드 위치" 다음 코드를 추가하세요.

//정규 표현식을 사용하여 받은 이메일 주소의 형식을 확인합니다. $reg_email = "/^**@(+(*+)*\.)++/i"; //수신된 이메일 주소의 형식이 정규식과 일치하지 않는 경우 if(!preg_match($reg_email, $email))( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

잘못된 이메일을 입력하셨습니다

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) // 해당 주소가 이미 데이터베이스에 있는지 확인합니다. $result_query = $mysqli->query("SELECT `email` FROM `users` WHERE `email`="".$email."""); / /수신된 개수가 정확히 하나의 행인 경우, 이는 이 이메일 주소를 가진 사용자가 이미 등록되었음을 의미합니다. if($result_query->num_rows == 1)( //얻은 결과가 false가 아닌 경우 if(($row = $result_query->fetch_assoc()) != false) ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

이 이메일 주소를 가진 사용자는 이미 등록되어 있습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); )else( // 오류 메시지 저장 세션에 . $_SESSION["error_messages"] .= "

데이터베이스 쿼리 오류

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); ) /* 선택 닫기 */ $ result_query-> close(); //스크립트 중지exit(); ) /* 선택 닫기 */ $result_query->close();

이제 모든 확인이 완료되었으므로 이제 사용자를 데이터베이스에 추가할 차례입니다. 지정된 위치에서" // (4) 데이터베이스에 사용자를 추가하는 코드를 입력하는 위치" 다음 코드를 추가하세요.

//데이터베이스에 사용자를 추가하는 쿼리 $result_query_insert = $mysqli->query("INSERT INTO `users` (first_name, last_name, email,password) VALUES ("".$first_name."", "".$last_name ." ", "".$email.", "".$password."")"); if(!$result_query_insert)( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

데이터베이스에 사용자를 추가하는 요청 중 오류가 발생했습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); )else( $_SESSION["success_messages"] = "

등록이 성공적으로 완료되었습니다!!!
이제 사용자 이름과 비밀번호를 사용하여 로그인할 수 있습니다.

"; //사용자를 인증 페이지로 보냅니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); ) /* 요청 완료 */ $ result_query_insert-> close(); //데이터베이스에 대한 연결을 닫습니다. $mysqli->close();

데이터베이스에 사용자를 추가하는 요청에서 오류가 발생한 경우 이 오류에 대한 메시지를 세션에 추가하고 사용자를 등록 페이지로 되돌립니다.

그렇지 않고 모든 것이 잘 되었다면 세션에 메시지도 추가하지만 이번에는 사용자에게 등록이 성공했음을 알리는 것이 더 즐겁습니다. 그리고 승인 양식이 있는 페이지로 리디렉션됩니다.

이메일 주소 형식과 비밀번호 길이를 확인하는 스크립트가 파일에 있습니다. 헤더.php이므로 이 양식의 필드에도 적용됩니다.

세션은 파일에서도 시작됩니다. 헤더.php, 그래서 파일에서 form_auth.php오류가 발생하므로 세션을 시작할 필요가 없습니다.


이미 말했듯이 이메일 주소 형식과 비밀번호 길이를 확인하는 스크립트도 여기서 작동합니다. 따라서 사용자가 잘못된 이메일 주소나 짧은 비밀번호를 입력하면 즉시 오류 메시지가 표시됩니다. 단추 안으로비활성화됩니다.

오류를 수정한 후 버튼을 안으로활성화되고 사용자는 양식을 서버에 제출하여 처리될 수 있습니다.

사용자 인증

값을 속성화하려면 행동인증 핸디캡에 지정된 파일이 있습니다 인증.php, 이는 양식이 이 파일에서 처리된다는 의미입니다.

그럼 파일을 열어보세요 인증.php승인 양식을 처리하는 코드를 작성합니다. 가장 먼저 해야 할 일은 세션을 시작하고 파일을 연결하는 것입니다. dbconnect.php데이터베이스에 연결합니다.

//폼 처리 시 발생할 수 있는 오류를 추가하기 위해 셀을 선언합니다. $_SESSION["error_messages"] = ""; //성공 메시지 추가를 위한 셀 선언 $_SESSION["success_messages"] = "";

/* 양식이 제출되었는지, 즉 로그인 버튼이 클릭되었는지 확인합니다. 그렇다면 계속 진행하고, 그렇지 않다면 사용자가 이 페이지에 직접 액세스했음을 나타내는 오류 메시지를 표시합니다. */ if(isset($_POST["btn_submit_auth"]) && !empty($_POST["btn_submit_auth"]))( //(1) 다음 코드 조각을 위한 공간 )else(exit("

오류!이 페이지에 직접 액세스했으므로 처리할 데이터가 없습니다. 메인페이지로 이동하실 수 있습니다.

"); }

//수신된 보안 문자 확인 if(isset($_POST["captcha"]))( //줄의 시작과 끝에서 공백을 제거합니다. $captcha = Trim($_POST["captcha"]); if(! empty($captcha ))( //받은 값을 세션의 값과 비교합니다. if(($_SESSION["rand"] != $captcha) && ($_SESSION["rand"] != "")) ( // 보안 문자가 잘못된 경우 사용자를 인증 페이지로 되돌리면 잘못된 보안 문자를 입력했다는 오류 메시지가 표시됩니다. $error_message = "

오류!잘못된 보안 문자를 입력했습니다

"; // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] = $error_message; // 사용자를 인증 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: " .$address_site ."/form_auth.php"); //스크립트 중지exit(); ) )else( $error_message = "

오류!보안 문자 입력 필드는 비워둘 수 없습니다.

"; // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] = $error_message; // 사용자를 인증 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: " .$address_site ."/form_auth.php"); //스크립트를 중지합니다.exit(); ) //(2) 이메일 주소를 처리하는 장소 //(3) 비밀번호를 처리하는 장소 //(4) 데이터베이스에 대한 쿼리 작성 )else ( //보안 문자가 전달되지 않은 경우 종료("

오류!인증코드, 즉 보안문자 코드가 없습니다. 메인페이지로 이동하실 수 있습니다.

"); }

사용자가 인증 코드를 올바르게 입력했다면 계속 진행하고, 그렇지 않으면 인증 페이지로 돌아갑니다.

우편주소 확인 중

//줄의 시작과 끝에서 공백을 자릅니다. $email = Trim($_POST["email"]); if(isset($_POST["email"]))( if(!empty($email))( $email = htmlspecialchars($email, ENT_QUOTES); //정규식을 사용하여 수신된 이메일 주소의 형식을 확인합니다. $ reg_email = " /^**@(+(*+)*\.)++/i"; //수신된 이메일 주소의 형식이 정규식과 일치하지 않는 경우 if(!preg_match($reg_email, $email) ))( // 세션 오류 메시지에 저장합니다. $_SESSION["error_messages"] .= "

잘못된 이메일을 입력하셨습니다

"; //사용자를 인증 페이지로 되돌립니다. header("HTTP/1.1 301 영구적으로 이동됨"); header("위치: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

우편 주소(이메일) 입력 필드는 비워둘 수 없습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_register.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

이메일 입력란이 누락되었습니다

"; //사용자를 인증 페이지로 되돌립니다. header("HTTP/1.1 301 영구적으로 이동됨"); header("위치: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); ) // (3) 비밀번호 처리 영역

사용자가 잘못된 형식으로 이메일 주소를 입력했거나 이메일 주소 필드의 값이 비어 있는 경우 이에 대한 메시지를 표시하는 인증 페이지로 사용자를 돌려보냅니다.

비밀번호 확인

처리할 다음 필드는 비밀번호 필드입니다. 지정된 장소로" //(3) 비밀번호 처리 장소", 우리는 쓴다:

If(isset($_POST["password"]))( //문자열의 시작과 끝에서 공백 제거 $password = Trim($_POST["password"]); if(!empty($password))( $password = htmlspecialchars($password, ENT_QUOTES); //비밀번호 암호화 $password = md5($password."top_secret"); )else( //오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] . = "

비밀번호를 입력하세요

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); ) )else ( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

비밀번호 입력란이 누락되었습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); )

여기서는 암호가 데이터베이스에 암호화된 형식이므로 md5() 함수를 사용하여 수신된 암호를 암호화합니다. 우리의 경우 암호화에 추가 비밀 단어 " 일급비밀"는 사용자 등록 시 사용한 이름이어야 합니다.

이제 이메일 주소가 수신된 이메일 주소와 동일하고 비밀번호가 수신된 비밀번호와 동일한 사용자를 선택하기 위해 데이터베이스에 쿼리를 작성해야 합니다.

//사용자 선택에 따라 데이터베이스에 쿼리합니다. $result_query_select = $mysqli->query("SELECT * FROM `users` WHERE email = "".$email."" AND 비밀번호 = "".$password."""); if(!$result_query_select)( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

데이터베이스에서 사용자를 선택할 때 쿼리 오류가 발생했습니다.

"; //사용자를 등록 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); )else( //데이터베이스에 해당 데이터를 가진 사용자가 없는지 확인한 후 오류 메시지를 표시합니다. if($result_query_select->num_rows == 1)( // 입력한 데이터가 데이터베이스의 데이터와 일치하면 저장합니다. 세션 배열에 대한 로그인 및 비밀번호 $_SESSION["email"] = $email; $_SESSION["password"] = $password; //사용자를 메인 페이지 헤더로 되돌립니다("HTTP/1.1 301 Moved Permanently" ); header("Location: ".$address_site ."/index.php"); )else( // 오류 메시지를 세션에 저장합니다. $_SESSION["error_messages"] .= "

잘못된 로그인 및/또는 비밀번호

"; //사용자를 인증 페이지로 되돌립니다. header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."/form_auth.php"); //스크립트 중지 Exit(); ) )

사이트에서 나가기

그리고 우리가 마지막으로 구현하는 것은 사이트 탈퇴 절차. 현재 헤더에는 인증 페이지와 등록 페이지에 대한 링크가 표시됩니다.

사이트 헤더(파일 헤더.php), 세션을 사용하여 사용자가 이미 인증되었는지 확인합니다. 그렇지 않은 경우 등록 및 인증 링크를 표시하고, 그렇지 않은 경우(인증된 경우) 등록 및 인증 링크 대신 링크를 표시합니다. 출구.

파일에서 수정된 코드 조각 헤더.php:

등록

출구

사이트에서 종료 링크를 클릭하면 파일로 이동됩니다. 로그아웃.php, 여기서는 세션의 이메일 주소와 비밀번호가 포함된 셀을 간단히 삭제합니다. 그런 다음 사용자가 링크를 클릭한 페이지로 다시 돌아갑니다. 출구.

파일 코드 로그아웃.php:

그게 다야. 이제 방법을 아시겠죠? 등록 및 승인 양식을 구현하고 처리합니다.귀하의 웹사이트에 있는 사용자입니다. 이러한 양식은 거의 모든 웹사이트에서 찾을 수 있으므로 모든 프로그래머는 양식을 만드는 방법을 알아야 합니다.

또한 클라이언트 측(브라우저에서 JavaScript, jQuery 사용)과 서버 측(PHP 사용)에서 입력 데이터의 유효성을 검사하는 방법도 배웠습니다. 우리도 배웠다 사이트를 떠나는 절차를 구현하십시오..

모든 스크립트가 테스트되었으며 작동 중입니다. 이 링크에서 이 작은 사이트의 파일이 포함된 아카이브를 다운로드할 수 있습니다.

앞으로 나는 설명 할 기사를 쓸 것입니다. 그리고 (페이지를 다시 로드하지 않고) 설명할 기사도 작성할 계획입니다. 따라서 새 기사 발표에 대한 최신 정보를 받으려면 내 웹사이트를 구독하세요.

궁금하신 점은 저에게 연락주시고, 글에 오류가 있으면 알려주세요.

수업 계획(5부):

  1. 승인 양식에 대한 HTML 구조 만들기
  2. 수신된 데이터를 처리합니다.
  3. 사이트 헤더에 사용자 인사말을 표시합니다.

기사가 마음에 드셨나요?

최종 업데이트: 2006년 9월 19일 화요일

세션_등록

(PHP 4, PHP 5)session_register -- 현재 세션에 하나 이상의 전역 변수를 등록합니다.

설명

부울 세션_등록(혼합 이름 [, 혼합 ...])
세션_등록()다양한 수의 인수를 허용하며, 그 중 하나는 변수 이름을 포함하는 문자열이거나 변수 이름으로 구성된 배열이거나 다른 배열일 수 있습니다. 각 이름에 대해, 세션_등록()현재 세션에 해당 이름으로 전역 변수를 등록합니다.
주의Register_globals에 관계없이 스크립트가 작동하도록 하려면 $_SESSION 항목이 자동으로 등록되므로 대신 $_SESSION 배열을 사용해야 합니다. 스크립트가 사용하는 경우 세션_등록(), PHP 지시문 Register_globals가 비활성화된 환경에서는 작동하지 않습니다.
Register_globals: 중요 참고 사항: PHP 4.2.0부터 PHP 지시어 Register_globals의 기본값은 다음과 같습니다. 끄다이며 PHP 6.0.0부터 완전히 제거되었습니다. PHP 커뮤니티는 모든 사람이 이 지시문에 의존하지 않고 대신 superglobals와 같은 다른 방법을 사용하도록 권장합니다.
주의이것은 글로벌변하기 쉬운. 함수 내에서 세션 변수를 등록하려면 다음을 사용하여 전역 변수로 만들어야 합니다. 글로벌키워드 또는 $GLOBALS 배열을 사용하거나 아래 설명된 특수 세션 배열을 사용하세요.
이 함수는 모든 변수가 세션에 성공적으로 등록되면 TRUE를 반환합니다. 만약에 세션_시작()이 함수가 호출되기 전에 호출되지 않았습니다. 세션_시작()매개변수 없이 만들어집니다. $_SESSION은 이 동작을 모방하지 않으며 다음을 요구합니다. 세션_시작()사용하기 전에. $_SESSION 또는 $HTTP_SESSION_VARS(PHP)의 적절한 멤버를 설정하여 세션 변수를 생성할 수도 있습니다.
참고: 현재 세션에 리소스 변수를 등록하는 것은 불가능합니다. 예를 들어, 데이터베이스에 대한 연결을 생성하고 연결 ID를 세션 변수로 저장한 다음 다음에 세션이 복원될 때 연결이 여전히 유효할 것이라고 기대할 수는 없습니다. 리소스를 반환하는 PHP 함수는 함수 정의에 리소스 반환 유형이 있는 것으로 식별됩니다. 리소스를 반환하는 함수 목록은

오늘은 10월 말 인터넷에서 폭발적으로 발생한 인기 CMS Joomla의 심각한 1일 취약점 악용 사례를 살펴보겠습니다. 숫자로 취약점에 대해 이야기하겠습니다. CVE-2016-8869, CVE-2016-8870그리고 CVE-2016-9081. 세 가지 모두 5년 동안 프레임워크 깊숙한 곳에서 맴돌며 날개를 기다리다가 풀려나 혼돈, 해킹된 사이트 및 이 Joomla의 무고한 사용자의 눈물을 가져온 하나의 코드 조각에서 나왔습니다. 모니터의 빛 때문에 눈이 붉어지고 키보드에 빵가루가 흩어져 있는 가장 용감하고 용감한 개발자들만이 성난 악령에 도전하고 수정의 제단에 머리를 얹을 수 있었습니다.

경고

모든 정보는 정보 제공의 목적으로만 제공됩니다. 편집자나 저자 모두 이 기사의 자료로 인해 발생할 수 있는 피해에 대해 책임을 지지 않습니다.

모든 것이 시작된 곳

2016년 10월 6일, Demis Palma는 Stack Exchange에 다음과 같은 주제를 만들었습니다. 실제로 Joomla 버전 3.6에 동일한 이름의 사용자를 등록()하는 두 가지 방법이 있는 이유는 무엇입니까? 첫 번째는 UsersControllerRegistration 컨트롤러에 있고 두 번째는 UsersControllerUser 컨트롤러에 있습니다. Damis는 UsersControllerUser::register() 메소드가 어딘가에 사용되었는지, 아니면 단지 기존 논리에서 남겨진 진화적 시대착오인지 알고 싶었습니다. 그의 우려는 이 메서드가 어떤 뷰에서도 사용되지 않더라도 조작된 쿼리에 의해 호출될 수 있다는 것이었습니다. 이에 대해 itoctopus라는 별명을 가진 개발자로부터 응답을 받았는데, 그는 문제가 실제로 존재한다는 것을 확인했습니다. 그리고 Joomla 개발자에게 보고서를 보냈습니다.

그런 다음 사건이 가장 빠르게 발전했습니다. 10월 18일, Joomla 개발자는 당시 사용자 등록을 허용하는 PoC 초안을 작성한 Damis의 보고서를 수락했습니다. 그는 자신의 웹사이트에 자신이 발견한 문제와 이 문제에 대한 자신의 생각에 대해 일반적인 용어로 설명하는 메모를 게시했습니다. 같은 날, 여전히 취약한 코드가 포함된 Joomla 3.6.3의 새 버전이 출시되었습니다.

그 후 Davide Tampellini는 버그를 단순 사용자가 아닌 관리자로 등록하는 지점으로 돌렸습니다. 그리고 10월 21일, Joomla 보안팀에 새로운 사건이 도착했습니다. 이미 권한 증가에 대해 이야기하고 있습니다. 같은 날 Joomla 웹사이트에는 10월 25일 화요일에 시스템 커널의 심각한 취약점을 수정하는 일련 번호 3.6.3의 다음 버전이 출시될 것이라는 발표가 나왔습니다.

10월 25일 Joomla Security Strike Team은 Damis가 발견한 코드 조각으로 인해 발생한 최신 문제를 발견했습니다. 그런 다음 눈에 띄지 않는 이름인 Ready 3.6.4 Stable Release를 가진 10월 21일자 커밋이 공식 Joomla 저장소의 메인 브랜치로 푸시되어 불행한 버그를 수정합니다.

이 내용이 나온 후 많은 관심 있는 개인이 개발자 커뮤니티에 참여하여 취약점을 홍보하고 공격을 준비하기 시작합니다.

10월 27일, Harry Roberts 연구원은 취약한 CMS가 있는 서버에 PHP 파일을 업로드할 수 있는 기성 익스플로잇을 Xiphos Research 저장소에 업로드했습니다.

세부

자, 배경은 끝났습니다. 가장 흥미로운 부분인 취약점 분석으로 넘어가겠습니다. Joomla 3.6.3을 테스트 버전으로 설치했으므로 모든 줄 번호는 이 버전과 관련이 있습니다. 그리고 아래에 표시되는 파일의 모든 경로는 설치된 CMS의 루트를 기준으로 표시됩니다.

Damis Palma의 발견 덕분에 우리는 시스템에 사용자 등록을 수행하는 두 가지 방법이 있다는 것을 알게 되었습니다. 첫 번째 항목은 CMS에서 사용되며 /comComponents/com_users/controllers/registration.php:108 파일에 있습니다. 두 번째 것(우리가 호출해야 할 것)은 /comComponents/com_users/controllers/user.php:293에 있습니다. 좀 더 자세히 살펴보겠습니다.

286: /** 287: * 사용자를 등록하는 방법입니다. 288: * 289: * @return 부울 290: * 291: * @since 1.6 292: */ 293: 공용 함수 Register() 294: ( 295: JSession::checkToken("post") 또는 jexit(JText::_ ("JINVALID_TOKEN")); ... 300: // 양식 데이터를 가져옵니다. 301: $data = $this->input->post->get("user", array(), "array"); . .. 315: $return = $model->validate($form, $data); 316: 317: // 오류를 확인합니다. 318: if ($return === false) 319: ( ... 345: / / 등록을 완료한다 346: $return = $model->register($data);

여기서는 흥미로운 대사만 남겼습니다. 취약한 방법의 전체 버전은 Joomla 저장소에서 볼 수 있습니다.

일반 사용자 등록 중에 어떤 일이 발생하는지, 즉 어떤 데이터가 전송되고 어떻게 처리되는지 알아봅시다. 설정에서 사용자 등록이 활성화된 경우 http://joomla.local/index.php/comComponent/users/?view=registration에서 양식을 찾을 수 있습니다.


합법적인 사용자 등록 요청은 다음 스크린샷과 같습니다.


com_users 구성 요소는 사용자 작업을 담당합니다. 요청의 작업 매개변수에 주의하세요. $controller.$method 형식을 갖습니다. 파일구조를 살펴보겠습니다.

폴더에 있는 스크립트 이름 컨트롤러호출된 컨트롤러의 이름에 해당합니다. 이제 요청에 $controller = "registration"이 포함되어 있으므로 파일이 호출됩니다. 등록.php및 해당 Register() 메서드입니다.

주의, 질문: 등록 처리를 코드의 취약한 위치로 전송하는 방법은 무엇입니까? 아마 이미 짐작하셨을 겁니다. 취약한 메소드와 실제 메소드의 이름(레지스터)이 동일하므로 호출되는 컨트롤러의 이름만 변경하면 됩니다. 취약한 컨트롤러는 어디에 있습니까? 그렇군요 파일에 user.php. $controller = "user" 로 나타납니다. 모든 것을 합치면 task = user.register 가 됩니다. 이제 등록 요청이 필요한 방법으로 처리됩니다.


두 번째로 해야 할 일은 데이터를 올바른 형식으로 보내는 것입니다. 여기에서는 모든 것이 간단합니다. 합법적인 Register()는 이름, 로그인, 비밀번호, 이메일과 같은 등록 데이터를 전달하는 jform이라는 배열을 기대합니다(요청 스크린샷 참조).

  • /comComponents/com_users/controllers/registration.php: 124: // 사용자 데이터를 가져옵니다. 125: $requestData = $this->input->post->get("jform", array(), "array");

우리 클라이언트는 user라는 배열에서 이 데이터를 가져옵니다.

  • /comComponents/com_users/controllers/user.php: 301: // 양식 데이터를 가져옵니다. 302: $data = $this->input->post->get("user", array(), "array");

따라서 요청의 모든 매개변수 이름을 jfrom에서 user로 변경합니다.

세 번째 단계는 유효한 CSRF 토큰을 찾는 것입니다. 왜냐하면 그것이 없으면 등록이 불가능하기 때문입니다.

  • /comComponents/com_users/controllers/user.php: 296: JSession::checkToken("post") 또는 jexit(JText::_("JINVALID_TOKEN"));

이는 MD5 해시처럼 보이며 예를 들어 /index.php/comComponent/users/?view=login 사이트의 승인 양식에서 가져올 수 있습니다.


이제 원하는 방법을 사용하여 사용자를 생성할 수 있습니다. 모든 것이 해결되었다면 축하합니다. 방금 취약점을 악용했습니다. CVE-2016-8870"새 사용자 등록을 위한 권한 확인이 누락되었습니다."

다음은 UsersControllerRegistration 컨트롤러의 "작동하는" Register() 메서드의 모습입니다.

  • /comComponents/com_users/controllers/registration.php: 113: // 등록이 비활성화된 경우 - 로그인 페이지로 리디렉션됩니다. 114: if (JComponentHelper::getParams("com_users")->get("allowUserRegistration") == 0) 115: ( 116: $this->setRedirect(JRoute::_("index.php?option=com_users&view= 로그인", false)); 117: 118: false 반환; 119: )

취약한 경우도 마찬가지입니다.

  • /구성 요소/com_users/controllers/user.php:

응, 절대 안돼.

훨씬 더 심각한 두 번째 문제를 이해하기 위해 우리가 만든 요청을 보내고 코드의 다양한 부분에서 어떻게 실행되는지 살펴보겠습니다. 다음은 작업자 메서드에서 사용자가 제출한 데이터의 유효성을 검사하는 부분입니다.

계속 이용은 회원만 가능합니다

옵션 1. "사이트" 커뮤니티에 가입하여 사이트의 모든 자료를 읽으세요.

지정된 기간 내에 커뮤니티에 가입하면 모든 Hacker 자료에 액세스할 수 있고 개인 누적 할인이 증가하며 전문적인 Xakep 점수 등급을 누적할 수 있습니다!

아주 초보자를 위한 튜토리얼입니다! 인터넷 어디를 가든 거의 모든 곳에서 찾을 수 있는 필수 사항인 사용자 등록이 있습니다. 보안을 위해 사용자를 등록해야 하는지 아니면 추가 기능을 위해 사용자를 등록해야 하는지 여부에 관계없이 이 간단한 튜토리얼을 사용하지 않을 이유가 없습니다. 이 튜토리얼에서는 사용자 관리의 기본 사항을 살펴보고 자신의 웹사이트에 구현할 수 있는 간단한 회원 영역으로 마무리하겠습니다.

추가 도움이 필요하거나 바로가기를 원하는 경우 Envato Studio에서 다양한 PHP 서비스 제공업체를 확인하세요. 이러한 숙련된 개발자는 빠른 버그 수정부터 처음부터 전체 앱 개발에 이르기까지 모든 것을 도와줄 수 있습니다. 따라서 제공업체를 찾아보고 리뷰와 평점을 읽고 귀하에게 적합한 제공업체를 선택하세요.

소개

이 튜토리얼에서는 사용자 간 개인 메시징 시스템과 함께 사용자 관리 시스템을 만드는 각 단계를 살펴보겠습니다. 우리는 모든 사용자 정보를 저장하기 위한 MySQL 데이터베이스와 함께 PHP를 사용하여 이 작업을 수행할 것입니다. 이 튜토리얼은 PHP 초보자를 대상으로 하므로 사전 지식이 전혀 필요하지 않습니다. 실제로 숙련된 PHP 사용자라면 약간 지루할 수 있습니다!

이 튜토리얼은 세션 및 PHP에서 데이터베이스 사용에 대한 기본 소개로 작성되었습니다. 비록 이 튜토리얼의 최종 결과가 당장은 유용하지 않을 수도 있지만, 이 튜토리얼에서 얻은 기술을 사용하면 계속해서 자신만의 멤버십 시스템을 만들 수 있습니다. 자신의 필요에 맞게.

이 튜토리얼을 시작하기 전에 다음 정보를 가지고 있는지 확인하십시오.

  • 데이터베이스 호스트 이름- 이는 데이터베이스가 호스팅되는 서버이며, 대부분의 경우 단순히 "localhost"입니다.
  • 데이터베이스 이름, 데이터베이스 사용자 이름, 데이터베이스 비밀번호- 이 튜토리얼을 시작하기 전에, 기존 데이터베이스에 연결할 수 있는 능력이 있거나 정보를 갖고 있다면 MySQL 데이터베이스를 생성해야 합니다. 이 정보는 튜토리얼 전체에서 필요합니다.

이 정보가 없는 경우 호스팅 제공업체에서 이 정보를 제공할 수 있습니다.

이제 형식적인 절차를 마쳤으므로 튜토리얼을 시작하겠습니다!

1단계 - 초기 구성

데이터베이스 설정

소개에서 설명한 대로 자습서의 이 지점을 지나 계속하려면 데이터베이스가 필요합니다. 우선 이 데이터베이스에 사용자 정보를 저장하기 위한 테이블을 만들겠습니다.

필요한 테이블은 사용자 정보를 저장합니다. 우리의 목적을 위해 간단한 테이블을 사용할 것이지만, 필요한 경우 추가 열에 더 많은 정보를 저장하는 것이 쉬울 것입니다. 우리 시스템에는 다음 네 개의 열이 필요합니다.

  • 사용자ID (기본 키)
  • 사용자 이름
  • 비밀번호
  • 이메일 주소

데이터베이스 용어로, 기본 키행을 고유하게 식별하는 필드입니다. 이 경우 UserID가 기본 키가 됩니다. 사용자가 등록할 때마다 이 값이 증가하도록 하기 위해 특별한 MySQL 옵션인 auto_increment를 사용합니다.

테이블을 생성하는 SQL 쿼리는 아래에 포함되어 있으며 일반적으로 phpMyAdmin의 "SQL" 탭에서 실행됩니다.

CREATE TABLE `users` (`UserID` INT(25) NOT NULL AUTO_INCREMENT PRIMARY KEY , `Username` VARCHAR(65) NOT NULL , `Password` VARCHAR(32) NOT NULL , `EmailAddress` VARCHAR(255) NOT NULL );

기본 파일 생성

프로젝트 생성을 단순화하기 위해 우리가 생성하는 각 파일에 포함할 수 있는 기본 파일을 만들겠습니다. 이 파일에는 우리에게 도움이 될 특정 구성 변수와 함께 데이터베이스 연결 정보가 포함됩니다.

새 파일인 base.php를 만들어 시작하고 다음 코드를 입력하세요.

"그 라인 중 몇 가지를 살펴보겠습니다. 여기에는 우리가 사용했지만 아직 설명하지 않은 몇 가지 기능이 있습니다. 따라서 빠르게 살펴보고 이해해 봅시다. 이미 PHP의 기본 사항을 이해하고 있다면 이 설명을 건너뛰고 싶을 수도 있습니다.

세션_시작();

이 함수는 새 사용자에 대한 세션을 시작하며, 이 자습서의 뒷부분에서는 이미 로그인한 사용자를 인식할 수 있도록 이 세션에 정보를 저장합니다. 세션이 이미 생성된 경우 이 기능은 이를 인식하고 해당 세션을 다음 페이지로 전달합니다.

Mysql_connect($dbhost, $dbuser, $dbpass) 또는 die("MySQL 오류: " . mysql_error()); mysql_select_db($dbname) 또는 die("MySQL 오류: " . mysql_error());

이러한 각 기능은 별도이지만 연결된 작업을 수행합니다. mysql_connect 함수는 위에서 제공한 정보를 사용하여 스크립트를 데이터베이스 서버에 연결하고 mysql_select_db 함수는 스크립트와 함께 사용할 데이터베이스를 선택합니다. 기능 중 하나라도 완료되지 않으면 다이 기능이 자동으로 개입하여 스크립트 처리를 중지합니다. 그러면 모든 사용자에게 MySQL 오류가 발생했다는 메시지가 표시됩니다.

2단계 - 프런트엔드로 돌아가기

먼저 무엇을 해야 합니까?

우리 페이지에서 가장 중요한 항목은 PHP의 첫 번째 줄입니다. 이 줄에는 위에서 만든 파일(base.php)이 포함되며 기본적으로 현재 파일에 있는 해당 파일의 모든 항목에 액세스할 수 있습니다. 다음 PHP 코드 줄을 사용하여 이 작업을 수행합니다. index.php라는 파일을 만들고 이 코드를 맨 위에 배치하세요.

HTML 페이지 시작

프런트엔드에서 가장 먼저 할 일은 사용자가 세부 정보를 입력하여 로그인할 수 있는 페이지를 만드는 것입니다. 또는 이미 로그인한 경우 원하는 작업을 선택할 수 있는 페이지를 만드는 것입니다. 이 튜토리얼에서는 사용자가 HTML/CSS 작동 방식에 대한 기본 지식을 갖고 있다고 가정하므로 이 코드를 자세히 설명하지는 않습니다. 지금은 이러한 요소의 스타일이 지정되지 않지만 나중에 CSS 스타일시트를 만들 때 이를 변경할 수 있습니다.

방금 생성한 파일(index.php)을 사용하여 이미 생성한 PHP 줄 아래에 다음 HTML 코드를 입력합니다.

그들에게 무엇을 보여줄까요?

페이지의 나머지 부분을 출력하기 전에 스스로에게 물어볼 몇 가지 질문이 있습니다.

  1. 사용자가 이미 로그인되어 있습니까?
  • - 우리는 그들이 선택할 수 있는 옵션이 있는 페이지를 보여줘야 합니다.
  • 아니요
  • 사용자가 이미 로그인 세부 정보를 제출했습니까?
    • - 세부정보를 확인해야 하며, 정확하다면 사이트에 로그인해 드리겠습니다.
    • 아니요- 다음 질문으로 넘어갑니다.
  • 위의 두 가지 사항에 모두 답변했다면 아니요, 이제 사용자에게 로그인 양식을 표시해야 한다고 가정할 수 있습니다.
  • 사실 이러한 질문은 PHP 코드에 구현하려는 질문과 동일합니다. if 문의 형태로 이를 수행하겠습니다. 새 파일에 아무것도 입력하지 않고 먼저 사용할 논리를 살펴보겠습니다.

    혼란스러워 보이죠? 더 작은 섹션으로 나누어 한 번에 하나씩 살펴보겠습니다.

    If(!empty($_SESSION["LoggedIn"]) && !empty($_SESSION["Username"])) ( // 사용자가 메인 페이지에 액세스하도록 허용 )

    사용자가 웹사이트에 로그인하면 해당 정보를 세션에 저장하게 됩니다. 이후 언제든지 특별한 글로벌 PHP 배열인 $_SESSION에서 해당 정보에 액세스할 수 있습니다. 변수가 비어 있는지 확인하기 위해 ! 연산자를 사용하여 빈 함수를 사용하고 있습니다. 그 앞에. 그러므로 우리는 이렇게 말합니다:

    $_SESSION["LoggedIn"] 변수가 비어 있지 않고 $_SESSION["Username"]이 비어 있지 않으면 이 코드 조각을 실행하십시오.

    다음 줄은 동일한 방식으로 작동하지만 이번에는 $_POST 전역 배열을 사용합니다. 이 배열에는 이 튜토리얼의 뒷부분에서 생성할 로그인 양식에서 전송된 모든 데이터가 포함됩니다. 마지막 줄은 이전 문 중 어느 것도 충족되지 않는 경우에만 실행됩니다. 이 경우 사용자에게 로그인 양식을 표시합니다.

    이제 논리를 이해했으므로 해당 섹션 사이에 일부 콘텐츠를 가져오겠습니다. index.php 파일에서 이미 가지고 있는 내용 아래에 다음을 입력하세요.

    회원 영역

    귀하의 이메일 주소는 다음과 같습니다 .

    성공"; 에코 "

    이제 귀하를 회원 영역으로 리디렉션하고 있습니다.

    "; 에코 " "; ) else ( 에코 "

    오류

    "; 에코 "

    죄송합니다. 귀하의 계정을 찾을 수 없습니다. 제발 다시 시도하려면 여기를 클릭하세요.

    "; ) ) 다른 ( ?>

    회원 로그인

    방문해 주셔서 감사합니다! 아래에서 로그인하거나 여기를 클릭하여 등록하세요.



    바라건대, 첫 번째와 마지막 코드 블록이 여러분을 너무 혼란스럽게 하지 않을 것입니다. 지금 우리가 정말로 알아야 할 것은 여러분 모두가 이 튜토리얼에 온 목적인 PHP 코드입니다. 이제 두 번째 섹션을 한 번에 한 줄씩 살펴보고 여기에 있는 각 코드의 용도를 설명하겠습니다.

    $username = mysql_real_escape_string($_POST["username"]); $password = md5(mysql_real_escape_string($_POST["password"]));

    이에 대해 설명이 필요한 두 가지 기능이 있습니다. 첫째, mysql_real_escape_string - 데이터베이스 입력을 정리하는 데 매우 유용한 함수입니다. 이는 안전한 조치는 아니지만 로그인 양식에 입력된 모든 내용 중 원치 않는 부분을 제거하여 대다수의 악의적인 해커를 차단할 수 있습니다. 둘째, md5입니다. 여기서 자세히 설명하는 것은 불가능하지만 이 기능은 전달되는 내용(이 경우 사용자의 비밀번호)을 암호화하여 엿보는 눈이 이를 읽지 못하도록 합니다.

    $checklogin = mysql_query("SELECT * FROM users WHERE 사용자 이름 = "".$username."" AND Password = "".$password."""); if(mysql_num_rows($checklogin) == 1) ( $row = mysql_fetch_array($checklogin); $email = $row["EmailAddress"]; $_SESSION["Username"] = $username; $_SESSION["EmailAddress"] = $email; $_SESSION["LoggedIn"] = 1;

    여기에 로그인 코드의 핵심이 있습니다. 먼저 데이터베이스에서 쿼리를 실행합니다. 이 쿼리에서 우리는 사용자 이름과 비밀번호가 사용자가 제공한 $username 및 $password 값과 일치하는 회원과 관련된 모든 것을 검색합니다. 다음 줄에는 우리가 받은 결과 수를 확인하는 if 문이 있습니다. 결과가 없으면 이 섹션은 처리되지 않습니다. 하지만 결과가 있으면 사용자가 존재한다는 것을 알고 로그인하게 됩니다.

    다음 두 줄은 사용자의 이메일 주소를 가져오는 것입니다. 이미 실행한 쿼리에서 이 정보를 얻었으므로 이 정보에 쉽게 액세스할 수 있습니다. 먼저 데이터베이스에서 검색된 데이터 배열을 가져옵니다. - 이 경우에는 PHP 함수 mysql_fetch_array를 사용하고 있으며 나중에 사용할 수 있도록 EmailAddress 필드의 값을 변수에 할당했습니다.

    이제 세션을 설정합니다. 우리는 사용자의 사용자 이름과 이메일 주소를 세션에 저장하고 있으며, 이 양식을 사용하여 로그인했음을 알 수 있는 특별한 값을 제공합니다. 이 모든 작업이 완료되면 사용자는 다음을 사용하여 회원 영역으로 리디렉션됩니다. 코드의 META REFRESH.

    그렇다면 현재 우리 프로젝트는 사용자에게 어떤 모습일까요?

    엄청난! 이제 사람들이 실제로 귀하의 사이트에 들어갈 수 있는지 확인해야 할 때입니다.

    사람들이 가입하게 하세요

    귀하의 사이트에 로그인 양식이 있으면 모든 것이 훌륭하지만 이제 사용자가 이를 사용할 수 있도록 해야 합니다. 로그인 양식을 만들어야 합니다. Register.php라는 파일을 만들고 다음 코드를 입력하세요.

    사용자 관리 시스템(NetTuts용 Tom Cameron)

    오류"; 에코 "

    죄송합니다. 이미 사용 중인 사용자 이름입니다. 돌아가서 다시 시도해 주세요.

    "; ) else ( $registerquery = mysql_query("INSERT INTO 사용자(사용자 이름, 비밀번호, 이메일 주소) VALUES("".$username."", "".$password.", "".$email."") " ); if($registerquery) ( 에코 "

    성공

    "; 에코 "

    귀하의 계정이 성공적으로 생성되었습니다. 제발 로그인하려면 여기를 클릭하세요.

    "; ) else ( 에코 "

    오류

    "; 에코 "

    죄송합니다. 등록에 실패했습니다. 돌아가서 다시 시도해 주세요.

    "; ) ) ) 다른 ( ?>

    등록하다

    등록을 위해 아래에 귀하의 정보를 입력해주세요.




    따라서 해당 섹션에서는 아직 "우리가 배우지 않은 새로운 PHP"가 많지 않습니다. 하지만 해당 SQL 쿼리를 간단히 살펴보고 그것이 수행하는 작업을 알아낼 수 있는지 살펴보겠습니다.

    $registerquery = mysql_query("INSERT INTO 사용자(사용자 이름, 비밀번호, 이메일 주소) VALUES("".$username.", "".$password.", "".$email."")");

    이제 데이터베이스에 사용자를 추가하겠습니다. 이번에는 데이터를 검색하는 대신 데이터를 삽입하므로 먼저 데이터를 입력할 열을 지정합니다(사용자 ID가 자동으로 올라간다는 점을 잊지 마세요). VALUES() 영역에서 각 열에 무엇을 넣을지 알려줍니다. 이 경우에는 사용자의 입력에서 나온 변수입니다. 따라서 한번 시도해 보겠습니다. 새로운 등록 양식에 계정을 만든 후에는 회원 영역에 대해 다음과 같은 내용을 볼 수 있습니다.

    로그아웃할 수 있는지 확인

    이 섹션을 거의 다 마쳤지만, 여기를 마치기 전에 필요한 것이 한 가지 더 있습니다. 즉, 사용자가 자신의 계정에서 로그아웃하는 방법입니다. 이것은 매우 쉽습니다(다행히도 우리에게는). logout.php라는 새 파일을 만들고 다음을 입력합니다.

    여기서는 먼저 전역 $_SESSION 배열을 재설정한 다음 세션을 완전히 삭제합니다.

    이것이 해당 섹션의 끝이고 PHP 코드의 끝입니다. 이제 마지막 섹션으로 이동하겠습니다.

    3단계 - 스타일을 갖추세요

    이 섹션에서는 많은 것을 설명하지 않을 것입니다. HTML/CSS를 이해하지 못한다면 시작하기 위해 이 웹 사이트에 있는 많은 훌륭한 튜토리얼을 적극 권장합니다. style.css라는 새 파일을 만들고 다음을 입력합니다. 그러면 지금까지 만든 모든 페이지의 스타일이 지정됩니다.

    * ( 여백: 0; 패딩: 0; ) 본문 ( 글꼴 계열: Trebuchet MS; ) a ( 색상: #000; ) a:hover, a:active, a:visited ( 텍스트 장식: 없음; ) #main ( width: 780px; margin: 0 auto; margin-top: 50px; padding: 10px; border: 1px solid #CCC; background-color: #EEE; ) form fieldset ( border: 0; ) form fieldset p br ( 지우기: 왼쪽; ) 라벨( 여백 상단: 5px; 디스플레이: 블록; 너비: 100px; 패딩: 0; 부동: 왼쪽; ) 입력( 글꼴 계열: Trebuchet MS; 테두리: 1px 솔리드 #CCC; 여백 하단: 5px; 배경색: #FFF; 패딩: 2px; ) 입력: 호버( 테두리: 1px 단색 #222; 배경색: #EEE; )

    이제 최종 프로젝트의 모습을 보여주는 몇 가지 스크린샷을 살펴보겠습니다.

    로그인 양식입니다.

    회원 영역입니다.

    등록 양식.

    그리고 마지막으로...

    그리고 그게 다입니다! 이제 귀하의 사이트에서 사용할 수 있는 회원 영역이 생겼습니다. 많은 사람들이 머리를 흔들고 모니터를 향해 그것이 소용없다고 소리치는 것을 볼 수 있습니다. 귀하의 말이 맞습니다. 그러나 PHP를 처음 접하는 사람들이 배웠으면 하는 것은 데이터베이스 사용 방법과 세션을 사용하여 정보를 저장하는 방법에 대한 기본 사항입니다. 웹 애플리케이션을 만드는 데 필수적인 기술입니다.

    • 더 많은 일일 웹 개발 관련 소식과 기사를 보려면 NETTUTS RSS 피드를 구독하세요.
    공유하다