このプロジェクトは現在は積極的にメンテナンスされていないことに注意してください。
このプロジェクトは、私が受講していた PHP コースの簡単な学校の課題として始まりました。その後、作成していたウェブサイトにこの種のシステムが必要になり、拡張を開始することにしました。警告: このプロジェクトは非常に独断的なものです。つまり、私自身が開発するのに十分便利または興味深いと考える機能のみを追加します。
password_hash()
関数を使用して、パスワードをハッシュし、ソルト処理します。ユーザー名はプレーンテキストとして保存されます。PASSWORD_DEFAULT
を使用していますが、この記事の執筆時点では BCRYPT を使用しています。別名「なぜファイルがこんなにたくさんあるの?」
管理パネルはここになります。他の多くの Web アプリケーション (WordPress など) と同様に、 [host]/adminと入力すると管理パネルに簡単にアクセスできます。
このフォルダーには、いくつかの構成オプションを設定するために使用される 2 つのファイルが含まれています。詳細については以下をご覧ください。
UI に役立つ CSS をいくつか紹介します。
自動インストーラーはここにあります。
このフォルダーには、ユーザー インターフェイスが機能するために必要なすべての .js ファイルが含まれています。
このフォルダーにはシステムのバックボーンが含まれています。データベースへの接続、ログインとログアウト、新しいアカウントの登録/作成、既存のアカウントの変更を行うための .php ファイルが含まれています。ユーザー インターフェイス用の一般的な JavaScript 機能を備えた scripts.js もあります。データベース情報を credentials.php に挿入する必要があります。ヘルプについては、以下の設定セクションを確認してください。
これを使用する前にこれを読んでください。それは普通の MIT ライセンスです。
このファイル。
こちらはアカウント管理ページです。ユーザーはここでユーザー名とパスワードを変更できます。
このファイルはデモ用にここにあります。ユーザーは、ログインしている場合にのみこのページにアクセスできます。ログインしていない場合は、ログイン ページにリダイレクトされます。
Bootstrap を使用して簡単なログイン フォームを作成することについての私の意見です。ニーズに合わせて自由に変更してください。
Bootstrap を使用して簡単な登録フォームを作成することについての私の意見です。ニーズに合わせて自由に変更してください。
これは、自動インストーラーがインストール完了後にそれ自体を削除するために使用されます。
これは最も一般的な英単語のリストです。ユーザー名提案者によって使用されます。リストを独自の .txt ファイルに置き換えることができます。リスト上のすべての単語の後には改行が必要です。
構成オプションは変更される可能性があることに注意してください。頻繁にチェックしてください。
/config フォルダーを確認すると、そこに 2 つの異なるファイルがあることがわかります。何が与えますか?メインの設定ファイルはconfig.phpです。これには、サーバー レベルで適用される設定が含まれます。主にこのファイルを編集する必要があります。
私が提供するフロントエンド ユーザー インターフェイスも使用している場合は、 config.jsも編集できます (編集する必要があります)。そこで、平均的なユーザーに対してどのように見えるかを管理できます。これらの設定はクライアント側のみであり、ユーザーが編集できるように強制されるものではないことに注意してください。
オプション名 | 説明 | デフォルト値 | サポートされている値 |
---|---|---|---|
$disableUserSelfRegistration | ユーザーが登録できないようにする | 間違い | ブール値 |
$usernameMinLength | 許可される最短のユーザー名 | 3 | 1 -> |
$ユーザー名の最大長 | 許可される最長のユーザー名 | 30 | 1 -> |
$パスワード最小長 | パスワードの最小長 | 8 | 1 -> |
$ユーザー名RegExp | すべてのユーザー名はこの正規表現と一致する必要があります | 任意の正規表現 | |
$passwordRegExp | すべてのパスワードはこの正規表現と一致する必要があります | 任意の正規表現 | |
$newAccountAccessLevel | 最初の管理者アカウントを作成する場合に役立ちます | "ユーザー" | 「ユーザー」、「管理者」 |
$debugMode | データベース接続を無効にできます (デバッグのみ) | "いいえ" | "いいえ" |
$debug管理者ユーザー名 | デバッグモード中にログインできるようにします | 「管理者」 | 任意の文字列 |
$debugAdminパスワード | デバッグモード中にログインできるようにします | 「」 | 任意の文字列 |
$debugスキップインストール | これはデバッグのみを目的としています | 間違い | 間違い |
$タイムアウト | ユーザーをログアウトするために必要な非アクティブな時間 (秒単位) | 900 | 任意の整数 |
$adminPanelTimeout | ユーザーを管理パネルからログアウトするために必要な非アクティブな時間 | 450 | 任意の整数 |
$errorMessages | 詳細なエラー メッセージを表示します。機密情報が漏洩する可能性があります。 | デフォルト | 「デフォルト」、「詳細」 |
$allowUsernameChange | ユーザーはユーザー名を変更できるべきか | 真実 | ブール値 |
$forceHTTPS | すべての非 HTTPS 接続を HTTPS にリダイレクトし、HSTS を送信します | 間違い | ブール値 |
2019 年には、あらゆる種類の機密情報 (パスワードなど) を扱うときに HTTPS を使用しないことは、セキュリティ上の大きなリスクであると考えられています。そのため、これをサポートするホスティング ソリューションのみを使用し、このオプションを true に変更することを強くお勧めします。最近では、Let's Encrypt から SSL 証明書を完全に無料で入手することもできるので、これを使用しない理由はありません。ただし、一部の (不適切に構成された) 環境では、HTTPS が実際に使用されている場合でも、SERVER["HTTPS"] スーパーグローバルが定義されません。その結果、リダイレクトの無限ループが発生します。私自身、それを苦労して学びました。
オプション名 | 説明 | デフォルト値 | サポートされている値 |
---|---|---|---|
ユーザー自己登録を無効にする | 登録に関連するすべての UI 要素を無効にします | 間違い | 真、偽 |
ユーザー名MinLength | UI が受け入れる最短のユーザー名 | 3 | 1 -> |
ユーザー名最大長 | UI が受け入れる最長のユーザー名 | 30 | 1 -> |
パスワード最小長 | UI が受け入れる最短のパスワード | 8 | 1 -> |
ユーザー名ルール | この文字列は、ユーザー名が正規表現と一致しなかった場合に表示されます。 | 任意の文字列 | |
パスワードルール | この文字列は、パスワードが正規表現と一致しない場合に表示されます。 | 任意の文字列 | |
ユーザー名提案を有効にする | ユーザー名の提案を無効または有効にできます | 真実 | ブール値 |
ユーザー名の変更を許可する | ユーザーはユーザー名を変更できるべきか (UI のみ) | 真実 | ブール値 |
ログインメッセージを有効にする | ログインページにメッセージを表示する | 間違い | ブール値 |
ログインメッセージ | EnableLoginMessage が true の場合に表示するメッセージを定義します | 「」 | 任意の文字列 |
前に述べたように、MySQL データベースが必要です。 (大量のユーザーがいない限り) データベースはそれほど多くのスペースを必要とせず、比較的新しいバージョンの MySQl であればどれでも動作します。データベースをセットアップして管理者アカウントを手動で作成することも、自動インストーラーを使用することもできます。
インストールの最初のステップで、インストーラーはホストのドライブにファイルを書き込む必要があります。適切な権限がない場合は、手動でインストールする必要があります。以下の手順を参照してください。
username
、 password
、 accessLevel
、 lastLogin
、およびrememberMeToken
の 5 つの列を持つテーブルusers
を作成します。 CHAR などの文字列データ型を使用します。私は個人的には VARCHAR を使用するのが好きです。 lastLogin
には INT(11) をお勧めします。また、自動インクリメントされる ID フィールドを主キーとして追加しますが、これは厳密には必須ではありません。VARCHAR または最大文字列長が異なるその他のデータ型を使用している場合は、次の表が役に立ちます。
分野 | 必要な長さ(最小) |
---|---|
ユーザー名 | config.php の $usernameMaxLength と同じ |
パスワード | 安全のために 255 を使用することをお勧めします (PHP のデフォルトの暗号化方法は変更される可能性があるため) |
アクセスレベル | 5 |
最終ログイン | 11 |
リメンバーミートークン | 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 )
);
データベースをセットアップした後、最初の管理者アカウントを作成する必要があります。それには 2 つの方法があります。
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()
関数を使用して、そのユーザー用に新しいトークンが作成されます。そのトークンはデータベースに保存され、2 つの Cookie がブラウザに送信されます。最初の Cookie の値は、プレーン テキストとしてのユーザーのユーザー名です。 2 番目の Cookie の方がはるかに重要です。その値は作成されたトークンです。主な問題は、「悪者」が何らかの方法でユーザーのトークンにアクセスできた場合、簡単に Cookie を偽造し、そのユーザーとしてログインできることです。悪者がユーザーのトークンにアクセスするには 2 つの方法があります。何らかの方法 (SQL インジェクションなど) でデータベースからトークンを取得する方法と、ユーザーから Cookie やその値を盗む方法です。
単純すぎるパスワードや同じパスワードを使用する傾向がある人もいるので、これはセキュリティ上のリスクであると私は考えています。ただし、将来のバージョンでは構成オプションを介してこれを許可する可能性があります。