이 프로젝트는 더 이상 적극적으로 유지 관리되지 않습니다.
이 프로젝트는 제가 다니던 PHP 강좌에 대한 간단한 학교 과제로 시작되었습니다. 그러다가 내가 만들고 있던 어떤 웹사이트에 이런 종류의 시스템이 필요했고 확장을 시작하기로 결정했습니다. 경고: 이 프로젝트는 매우 독선적입니다. 즉, 제가 개발하기에 충분히 유용하거나 흥미롭다고 생각하는 기능만 추가할 것임을 의미합니다.
password_hash()
함수를 사용하여 비밀번호를 해시하고 솔트합니다. 사용자 이름은 일반 텍스트로 저장됩니다.PASSWORD_DEFAULT
사용하고 있습니다.일명 '왜 파일이 이렇게 많아?'
관리자 패널이 여기에 있습니다. 다른 많은 웹 애플리케이션(예: WordPress)과 마찬가지로 관리자 패널은 [host]/admin 을 입력하여 쉽게 액세스할 수 있습니다.
이 폴더에는 일부 구성 옵션을 설정하는 데 사용되는 두 개의 파일이 포함되어 있습니다. 자세한 내용은 아래를 참조하세요.
UI를 위한 CSS 기능이 몇 가지 있습니다.
자동 설치 프로그램은 여기에 있습니다.
이 폴더에는 사용자 인터페이스가 작동하는 데 필요한 모든 .js 파일이 있습니다.
이 폴더에는 시스템의 백본이 포함되어 있습니다. 데이터베이스 연결, 로그인 및 로그아웃, 새 계정 등록/생성 및 기존 계정 수정을 위한 .php 파일이 있습니다. 사용자 인터페이스에 대한 몇 가지 일반적인 JavaScript 기능이 포함된 scripts.js도 있습니다. 자격 증명.php에 데이터베이스 정보를 삽입해야 합니다. 도움이 필요하면 아래 설정 섹션을 확인하세요.
이것을 사용하기 전에 이것을 읽어야 합니다. 그냥 일반 MIT 라이센스 입니다.
이 파일.
계정관리 페이지입니다. 사용자는 여기에서 사용자 이름과 비밀번호를 변경할 수 있습니다.
이 파일은 데모용으로 여기에 있습니다. 사용자는 로그인한 경우에만 이 페이지에 액세스할 수 있습니다. 그렇지 않으면 로그인 페이지로 리디렉션됩니다.
Bootstrap을 사용하여 간단한 로그인 양식을 만드는 방법에 대해 설명합니다. 필요에 맞게 자유롭게 수정해 보세요.
Bootstrap을 사용하여 간단한 등록 양식을 만드는 방법에 대해 설명합니다. 필요에 맞게 자유롭게 수정해 보세요.
이는 설치가 완료된 후 자동 설치 프로그램이 자신을 제거하는 데 사용됩니다.
이것은 가장 일반적인 영어 단어 목록입니다. 사용자 이름 제안자가 사용합니다. 목록을 자신의 .txt 파일로 바꿀 수 있습니다. 목록의 모든 단어 뒤에는 줄 바꿈이 와야 합니다.
구성 옵션은 변경될 수 있습니다. 자주 다시 확인하세요.
/config 폴더를 확인하면 거기에 두 개의 서로 다른 파일이 있음을 알 수 있습니다. 무엇을 제공합니까? 주요 구성 파일은 config.php 입니다. 여기에는 서버 수준에서 적용되는 설정이 포함됩니다. 주로 이 파일을 편집해야 합니다.
내가 제공하는 프런트엔드 사용자 인터페이스도 사용하고 있다면 config.js 도 편집할 수 있거나 편집해야 합니다. 여기에서 평균 사용자가 어떻게 보이는지 관리할 수 있습니다. 이러한 설정은 클라이언트 측에서만 적용되며 어떤 방식으로도 강제 적용 되지 않으므로 사용자가 편집할 수 있습니다.
옵션 이름 | 설명 | 기본값 | 지원되는 값 |
---|---|---|---|
$disableUserSelfRegistration | 사용자 등록 방지 | 거짓 | 부울 |
$usernameMinLength | 허용되는 가장 짧은 사용자 이름 | 3 | 1 -> |
$usernameMaxLength | 허용되는 가장 긴 사용자 이름 | 30 | 1 -> |
$passwordMinLength | 비밀번호의 최소 길이 | 8 | 1 -> |
$usernameRegExp | 모든 사용자 이름은 이 정규식과 일치해야 합니다. | 모든 정규식 | |
$passwordRegExp | 모든 비밀번호는 이 정규식과 일치해야 합니다. | 모든 정규 표현식 | |
$newAccountAccessLevel | 첫 번째 관리자 계정을 만드는 데 유용합니다. | "사용자" | "사용자", "관리자" |
$debugMode | 데이터베이스 연결을 비활성화할 수 있습니다(디버깅 전용). | "아니요" | "아니요" |
$debugAdmin사용자 이름 | 디버그 모드에서 로그인할 수 있습니다. | "관리자" | 임의의 문자열 |
$debugAdminPassword | 디버그 모드에서 로그인할 수 있습니다. | "" | 임의의 문자열 |
$debugSkip설치 | 이는 디버그 목적으로만 사용됩니다. | 거짓 | 거짓 |
$timeout | 사용자를 로그아웃하는 데 필요한 비활성 시간(초) | 900 | 임의의 정수 |
$adminPanelTimeout | 관리자 패널에서 사용자를 로그아웃하는 데 필요한 비활성 시간 | 450 | 임의의 정수 |
$errorMessages | 더 자세한 오류 메시지를 표시합니다.민감한 정보가 유출될 수 있습니다! | 기본 | "기본값","자세한 내용" |
$allowUsernameChange | 사용자가 자신의 사용자 이름을 변경할 수 있어야 합니까? | 진실 | 부울 |
$forceHTTPS | HTTPS가 아닌 모든 연결을 HTTPS로 리디렉션하고 HSTS를 보냅니다. | 거짓 | 부울 |
2019년에는 비밀번호와 같은 민감한 정보를 처리할 때 HTTPS를 사용하지 않는 것이 큰 보안 위험으로 간주되었습니다. 그렇기 때문에 이를 지원하는 호스팅 솔루션만 사용하고 이 옵션을 true로 변경하는 것이 매우 권장됩니다. 요즘에는 Let's Encrypt에서 SSL 인증서를 완전히 무료로 얻을 수도 있으므로 사용하지 않을 이유가 없습니다. 그러나 일부(잘못 구성된) 환경에서는 실제로 HTTPS가 사용되는 경우에도 SERVER["HTTPS"] superglobal이 정의되지 않습니다. 이로 인해 끝없는 리디렉션 루프가 발생합니다. 나는 그것을 어려운 방법으로 배웠습니다.
옵션 이름 | 설명 | 기본값 | 지원되는 값 |
---|---|---|---|
비활성화사용자자기등록 | 등록과 관련된 모든 UI 요소를 비활성화합니다. | 거짓 | 사실, 거짓 |
사용자 이름최소 길이 | UI에서 허용하는 가장 짧은 사용자 이름 | 3 | 1 -> |
사용자 이름최대 길이 | UI에서 허용하는 가장 긴 사용자 이름 | 30 | 1 -> |
비밀번호최소길이 | UI가 허용하는 가장 짧은 비밀번호 | 8 | 1 -> |
사용자 이름규칙 | 이 문자열은 사용자 이름이 regExp와 일치하지 않는 경우 표시됩니다. | 임의의 문자열 | |
비밀번호규칙 | 이 문자열은 비밀번호가 regExp와 일치하지 않는 경우 표시됩니다. | 임의의 문자열 | |
활성화사용자 이름 제안 | 사용자 이름 제안을 비활성화하거나 활성화할 수 있습니다. | 진실 | 부울 |
허용사용자 이름변경 | 사용자가 자신의 사용자 이름을 변경할 수 있는지 여부(UI에만 해당) | 진실 | 부울 |
활성화로그인메시지 | 로그인 페이지에 메시지 표시 | 거짓 | 부울 |
로그인 메시지 | 활성화LoginMessage가 true일 때 표시할 메시지를 정의합니다. | "" | 임의의 문자열 |
앞서 설명한 대로 MySQL 데이터베이스가 필요합니다. 사용자가 많지 않은 한 데이터베이스는 많은 공간을 필요로 하지 않으며 비교적 최신 버전의 MySQl이 작동해야 합니다. 데이터베이스를 설정하고 관리자 계정을 수동으로 생성하거나 자동 설치 프로그램을 사용할 수 있습니다.
설치의 첫 번째 단계에서 설치 프로그램은 호스트 드라이브에 파일을 작성해야 합니다. 이에 대한 적절한 권한이 없으면 수동으로 설치해야 합니다. 아래 지침을 참조하세요.
username
, password
, accessLevel
, lastLogin
및 rememberMeToken
의 5개 열을 사용하여 테이블 users
생성합니다. CHAR와 같은 문자열 데이터 유형을 사용하십시오. 저는 개인적으로 VARCHAR을 사용하는 것을 좋아합니다. lastLogin
의 경우 INT(11)를 권장합니다. 또한 자동 증가 ID 필드를 기본 키로 추가하지만 꼭 필요한 것은 아닙니다.최대 문자열 길이가 다양한 VARCHAR 또는 기타 데이터 유형을 사용하는 경우 아래 표가 유용합니다.
필드 | 필요한 길이(최소) |
---|---|
사용자 이름 | config.php의 $usernameMaxLength와 동일 |
비밀번호 | 안전을 위해 255를 사용하는 것이 좋습니다(PHP의 기본 암호화 방법은 변경될 수 있으므로). |
접근레벨 | 5 |
마지막로그인 | 11 |
RememberMeToken | 255 |
걱정하지 마십시오. 다음과 같은 내용이 적용됩니다.
CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VARCHAR ( 64 ) NOT NULL UNIQUE,
password VARCHAR ( 255 ) NOT NULL ,
accessLevel VARCHAR ( 10 ) NOT NULL ,
lastLogin INT ( 11 ),
rememberMeToken VARCHAR ( 255 )
);
데이터베이스를 설정한 후 첫 번째 관리자 계정을 만들어야 합니다. 이를 수행하는 방법에는 두 가지가 있습니다.
admin
과 무작위로 생성된 비밀번호를 사용하여 관리자 권한이 있는 새 계정이 생성됩니다. (위의 SQL 샘플을 따르고 사용자 이름 필드에 UNIQUE 제약 조건을 설정한 경우 계정이 이미 존재하면 생성되지 않습니다. 오류 메시지가 표시되지 않습니다.) 관리자 계정을 생성한 후에는 제거해야 합니다. (또는 이름을 바꿉니다) /install 폴더. 마지막으로 새로 생성된 계정에 로그인한 후 계정 관리 페이지에서 비밀번호를 변경하세요.또는
$newAccountAccessLevel
일시적으로 "admin"으로 변경한 다음 일반 등록 양식을 사용하여 새 계정을 만들 수도 있습니다. 로그인 페이지에 접근하려면 /install 폴더를 제거해야 합니다. 나중에 값을 다시 "user"로 변경하는 것을 잊지 마세요.중요한! 라이브 프로덕션 환경에서 이 폴더를 사용하기 전에 반드시 /install 폴더를 삭제 해야 한다는 점을 다시 한 번 상기시켜 드립니다. 그렇지 않으면 누구나 귀하의 데이터베이스 자격 증명을 볼 수 있습니다!
설정 후 관리자 패널을 사용하여 새 계정(관리자 또는 일반)을 만들 수 있습니다.
이는 설치 프로그램이 random_bytes(int)
함수가 존재하지 않거나 제대로 작동하지 않음을 발견했음을 의미합니다. 7.0 이전 버전의 PHP를 사용하는 경우 해당 기능을 구현하는 타사 라이브러리를 사용해야 합니다. PHP 5.x의 경우 이것을 권장합니다.
MySQL 기본값은 3306입니다.
이는 마법사가 자체 제거에 실패할 때 발생합니다. 이는 일반적으로 호스트에 대한 일부 제한적인 권한으로 인해 발생합니다. /install 폴더를 수동으로 제거하여 문제를 해결하십시오.
아래 일반 FAQ에서 문제 해결 팁을 확인하세요.
관리자 패널은 개발 초기 단계에 있습니다. 많은 것들이 깨질 수 있습니다.
앞으로 더 많은 것이 추가될 예정입니다.
/관리자
config.php를 더 주의 깊게 읽어보세요.
이는 데이터베이스에 연결을 시도하는 동안 PDOException
이 발생했음을 의미합니다. /config/config.php 에서 더 자세한 오류 메시지를 표시할 수 있습니다. 가장 일반적인 원인은 다음과 같습니다.
PDO_MYSQL
드라이버를 사용할 수 없거나 제대로 구성되지 않았습니다.PDO_MYSQL
활성화했는지 확인하십시오. 아니, 그렇지 않고 너무 오랜 시간이 걸렸다는 것도 알아요. 곧 도착할 예정이에요™. 업데이트: 현재 작동 중입니다. (보안상의 이유로) 로그인 정보는 30일 동안만 기억됩니다.
예, 그런 것을 구현하면 항상 새로운 보안 허점이 생긴다는 것을 알고 있습니다. 그러나 나는 사용자에게 그것을 사용하도록 강요하지 않습니다. 사용자가 확인란을 선택하지 않으면 액세스 토큰이 생성되지 않으므로 해당 사용자에 대한 보안 위험이 없습니다.
random_bytes()
함수를 사용하여 해당 사용자에 대한 새 토큰이 생성됩니다. 해당 토큰은 데이터베이스에 저장되고 두 개의 쿠키가 브라우저로 전송됩니다. 첫 번째 쿠키의 값은 일반 텍스트인 사용자 이름입니다. 두 번째 쿠키가 훨씬 더 중요합니다. 그 값은 생성된 토큰입니다.가장 큰 문제는 "나쁜 사람"이 어떻게든 사용자의 토큰에 액세스할 수 있으면 쉽게 쿠키를 위조하고 해당 사용자로 로그인할 수 있다는 것입니다. 악의적인 사람이 사용자 토큰에 액세스하는 방법에는 두 가지가 있습니다. 어떻게든(예: SQL 삽입) 데이터베이스에서 토큰을 가져오거나 사용자로부터 쿠키 및/또는 해당 값을 훔치는 것입니다.
어떤 사람들은 너무 단순하거나 동일한 비밀번호를 사용하는 경향이 있기 때문에 보안 위험이 있다고 생각합니다. 그러나 향후 버전에서는 구성 옵션을 통해 이를 허용할 수도 있습니다.