请注意,该项目不再被积极维护。
这个项目最初是我参加的一些 PHP 课程的一个简单的学校作业。然后我正在制作的一些网站需要这种系统,并决定开始扩展。警告:这个项目是/将会非常固执己见,这意味着我只会添加我自己认为有用或足够有趣的功能来开发。
password_hash()
函数对密码进行哈希和加盐处理。用户名保存为纯文本。PASSWORD_DEFAULT
,在撰写本文时它使用 BCRYPT。又名“为什么有这么多文件?”
管理面板将在这里。与许多其他 Web 应用程序(如 WordPress)类似,可以通过输入[host]/admin轻松访问管理面板。
该文件夹包含两个用于设置一些配置选项的文件。更多信息如下。
只是 UI 的一些 CSS 好东西。
自动安装程序位于此处。
此文件夹包含用户界面工作所需的所有 .js 文件。
该文件夹包含系统的主干。它具有用于连接数据库、登录和注销、注册/创建新帐户以及修改现有帐户的 .php 文件。还有scripts.js,它为用户界面提供了一些通用的JavaScript 功能。您需要将数据库信息插入到credentials.php中,请检查下面的设置部分以获取帮助。
在使用它之前您应该阅读本文。这只是一个普通的麻省理工学院许可证。
这个文件。
这是账户管理页面。用户可以在这里更改他们的用户名和密码。
该文件仅用于演示。用户只有登录后才能访问此页面。否则,他们将被重定向到登录页面。
我对使用 Bootstrap 创建简单登录表单的看法。请随意修改它以满足您的需求。
我对使用 Bootstrap 创建简单的注册表单的看法。请随意修改它以满足您的需求。
自动安装程序使用它在安装完成后将其自身删除。
这是最常见的英语单词的列表。它由用户名建议者使用。您可以用您自己的 .txt 文件替换该列表。列表中的每个单词后面都需要换行。
请注意,配置选项可能会发生变化。经常回来查看。
如果您检查 /config 文件夹,您会发现那里有两个不同的文件。什么给?主要配置文件是config.php 。它包括在服务器级别强制执行的设置。您应该主要编辑此文件。
如果您也在使用我提供的前端用户界面,那么您可以/还必须编辑config.js ,您可以在其中管理一般用户的外观。请记住,这些设置仅适用于客户端,不会以任何方式强制执行,因此用户可以对其进行编辑。
选项名称 | 描述 | 默认值 | 支持的值 |
---|---|---|---|
$disableUserSelfRegistration | 阻止用户注册 | 错误的 | 布尔值 |
$用户名最小长度 | 允许的最短用户名 | 3 | 1-> |
$用户名最大长度 | 允许的最长用户名 | 30 | 1-> |
$passwordMinLength | 密码的最小长度 | 8 | 1-> |
$用户名RegExp | 所有用户名必须匹配此正则表达式 | 任何正则表达式 | |
$passwordRegExp | 所有密码必须与此正则表达式匹配 | 任何正则表达式 | |
$newAccountAccessLevel | 对于创建您的第一个管理员帐户很有用 | “用户” | “用户”、“管理员” |
$调试模式 | 允许您禁用数据库连接(仅用于调试) | “不” | “不” |
$debugAdmin用户名 | 允许您在调试模式下登录 | “行政” | 任何字符串 |
$debugAdmin密码 | 允许您在调试模式下登录 | ”” | 任何字符串 |
$debugSkipInstall | 这仅用于调试目的 | 错误的 | 错误的 |
$超时 | 注销用户所需的不活动时间(以秒为单位) | 900 | 任意整数 |
$adminPanel超时 | 从管理面板注销用户所需的不活动时间 | 450 | 任意整数 |
$errorMessages | 显示更详细的错误消息。可能会泄露敏感信息! | 默认 | “默认”、“详细” |
$allow用户名更改 | 用户是否可以更改他们的用户名 | 真的 | 布尔值 |
$forceHTTPS | 将所有非 HTTPS 连接重定向到 HTTPS 并发送 HSTS | 错误的 | 布尔值 |
2019 年,在处理任何类型的敏感信息(如密码)时不使用 HTTPS 被认为是一个巨大的安全风险。这就是为什么强烈建议仅使用支持它的托管解决方案并将此选项更改为 true。如今,您甚至可以从 Let's Encrypt 完全免费获得 SSL 证书,因此没有理由不使用它。然而,在某些(配置错误的)环境中,即使实际上使用了 HTTPS,也未定义 SERVER["HTTPS"] 超级全局。这会导致重定向的无限循环。我自己也是经历了惨痛的教训才知道这一点的。
选项名称 | 描述 | 默认值 | 支持的值 |
---|---|---|---|
禁用用户自行注册 | 禁用与注册相关的任何 UI 元素 | 错误的 | 真,假 |
用户名最小长度 | UI 接受的最短用户名 | 3 | 1-> |
用户名最大长度 | UI 接受的最长用户名 | 30 | 1-> |
密码最小长度 | UI 接受的最短密码 | 8 | 1-> |
用户名规则 | 如果用户名与 regExp 不匹配,则显示此字符串 | 任何字符串 | |
密码规则 | 如果密码与 regExp 不匹配,则显示此字符串 | 任何字符串 | |
启用用户名建议 | 允许您禁用或启用用户名建议 | 真的 | 布尔值 |
允许用户名更改 | 用户是否可以更改他们的用户名(仅限 UI) | 真的 | 布尔值 |
启用登录消息 | 在登录页面上显示任何消息 | 错误的 | 布尔值 |
登录留言 | 定义当enableLoginMessage为true时显示的消息 | ”” | 任何字符串 |
如前所述,您需要一个 MySQL 数据库。该数据库不需要太多空间(除非您有很多用户)并且任何相当新的 MySQl 版本都应该可以工作。您可以手动设置数据库并创建管理员帐户,也可以使用我的自动安装程序。
在安装的第一步中,安装程序需要将文件写入主机的驱动器。如果您没有适当的权限,则必须手动进行安装。请参阅下面的说明。
users
: username
、 password
、 accessLevel
、 lastLogin
和rememberMeToken
。使用 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 )
);
设置数据库后,您需要创建第一个管理员帐户。有两种方法可以做到这一点:
admin
和随机生成的密码创建一个具有管理员权限的新帐户。 (如果您遵循上面的 SQL 示例并将 UNIQUE 约束设置为用户名字段,那么如果该帐户已存在,则不会创建该帐户。您不会收到错误消息)创建管理员帐户后,您必须删除(或重命名)/install 文件夹。最后,登录新创建的帐户并使用帐户管理页面更改密码。或者
$newAccountAccessLevel
更改为“admin”,然后使用正常的注册表单创建一个新帐户。您需要删除 /install 文件夹才能访问登录页面。请记住随后将值更改回“user”。重要的!我再次提醒您,在实际生产环境中使用它之前,您必须删除 /install 文件夹。否则任何人都可以看到您的数据库凭据!
设置后,您可以使用管理面板创建新帐户(管理员或普通帐户)。
这意味着安装程序注意到函数random_bytes(int)
不存在或无法正常工作。如果您使用的 PHP 版本早于 7.0,则必须使用实现该功能的第 3 方库。对于 PHP 5.x,我推荐这个。
MySQL 默认为 3306。
当向导无法自行删除时,就会发生这种情况。这通常是由主机上的某些限制性权限引起的。通过手动删除 /install 文件夹来修复问题。
查看下面一般常见问题解答中的故障排除提示。
管理面板正处于开发的早期阶段。很多东西可能会被破坏。
未来还会添加更多内容。
/行政
更仔细地阅读 config.php。
这意味着尝试连接数据库时发生了PDOException
。您可以在/config/config.php中打开更详细的错误消息。最常见的原因是:
PDO_MYSQL
驱动程序不可用或配置不正确。PDO_MYSQL
。不,事实并非如此,而且这种情况已经持续太久了,我知道。我打算很快就去实现它™。更新:现在正在运行。请注意,它只记住登录信息 30 天(出于安全原因)。
是的,我知道实施类似的措施总是会带来新的安全漏洞。但是,我不会强迫用户使用它或任何东西。如果用户未选中该复选框,则不会创建访问令牌,因此该用户不存在安全风险。
random_bytes()
函数为该用户创建新令牌。该令牌将保存到数据库中,并将两个 cookie 发送到浏览器。第一个 cookie 的值是纯文本形式的用户用户名。第二个 cookie 更为重要。它的价值是创建的令牌。主要问题是,如果“坏人”能够以某种方式访问用户的令牌,他们就可以轻松伪造 cookie 并以该用户身份登录。坏人有两种方法可以访问用户的令牌:通过某种方式(例如 SQL 注入)从数据库获取令牌或窃取用户的 cookie 和/或其值。
我认为这是一个安全风险,因为有些人会倾向于使用过于简单或相同的密码。但是,我可能会在未来的版本中通过配置选项允许这样做。