maisto / phpauth
PHP网站的安全用户认证类,使用强大的密码哈希系统和攻击拦截,以保护您的网站和用户安全。
Requires
- php: >=5.4.0
- bjeavons/zxcvbn-php: ^0.3
- phpmailer/phpmailer: ^6.0.1
This package is not auto-updated.
Last update: 2024-09-18 21:06:05 UTC
README
PHPAuth
这是什么
PHPAuth 是一个安全的PHP网站用户认证类,使用强大的密码哈希系统和攻击拦截来保护您的网站和用户。
PHPAuth 是一个正在开发中的项目,不适用于编程知识不丰富的人。我们无法帮助每个人,因为他们不理解这个类。
这不是初学者的项目!
功能
- 通过电子邮件和密码组合进行认证
- 使用 bcrypt 对密码进行哈希,这是一种安全的算法,它使用一个昂贵的密钥设置阶段
- 为每个用户使用一个独特的128位盐值,从 /dev/urandom 中获取,使得彩虹表变得无用
- 使用PHP的 PDO 数据库接口,并使用预处理语句,这意味着一个高效的系统,对SQL注入具有抵抗力
- 根据门户上的失败操作次数和任何定义的时间后,通过IP阻止(或验证)攻击者
- 系统不会发送或存储明文密码
- 可以轻松集成到大多数现有网站中,并可以作为新项目的良好起点
- 轻松配置多个系统参数
- 允许通过SMTP或sendmail发送电子邮件
- 阻止注册时使用一次性电子邮件地址
用户行为
- 登录
- 注册
- 激活账户
- 重新发送激活邮件
- 重置密码
- 更改密码
- 更改电子邮件地址
- 删除账户
- 登出
要求
- PHP 5.4
- MySQL / MariaDB 数据库或PostGreSQL数据库
Composer 支持
PHPAuth 现在可以使用以下命令安装
composer require phpauth/phpauth
然后: require 'vendor/autoload.php';
配置
数据库表 config
包含多个参数,允许您配置类的某些功能。
site_name
:在激活和密码重置电子邮件中显示的网站名称site_url
:Auth根的URL,您在其中安装了系统,不带尾随斜杠,用于电子邮件。site_email
:用于发送激活和密码重置电子邮件的电子邮件地址site_key
:一个随机字符串,您应该修改,用于验证cookie以确保它们未被篡改site_timezone
:正确的日期和时间值的时区site_activation_page
:在激活电子邮件中附加到site_url
的激活页面名称site_password_reset_page
:在密码重置电子邮件中附加到site_url
的密码重置页面名称cookie_name
:包含会话信息的cookie的名称,除非必要,否则不要更改cookie_path
:会话cookie的路径,除非必要,否则不要更改cookie_domain
:会话cookie的域名,除非必要,否则不要更改cookie_secure
:会话cookie的HTTPS仅设置,除非必要,否则不要更改cookie_http
:会话cookie的HTTP only协议设置,除非必要,否则不要更改cookie_remember
:用户在登录时勾选“记住我”时,用户将保持登录状态的时间。必须遵守PHP的strtotime格式。cookie_forget
:用户在登录时未勾选“记住我”时,用户将保持登录状态的时间。必须遵守PHP的strtotime格式。bcrypt_cost
:bcrypt散列函数的算法成本,可以根据硬件能力进行更改。smtp
:0
表示使用sendmail发送邮件,1
表示使用SMTP。smtp_host
:SMTP服务器的主机名。smtp_auth
:0
表示SMTP服务器不需要认证,1
表示需要认证。smtp_username
:SMTP服务器的用户名。smtp_password
:SMTP服务器的密码。smtp_port
:SMTP服务器的端口。smtp_security
:NULL
表示不加密,tls
表示TLS加密,ssl
表示SSL加密。verify_password_min_length
:最小密码长度,默认为3
。verify_email_min_length
:最小电子邮件长度,默认为5
。verify_email_max_length
:最大电子邮件长度,默认为100
。verify_email_use_banlist
:在检查允许的电子邮件时使用黑名单(见/files/domains.json
),默认为1
(true
)。attack_mitigation_time
:滚动尝试超时的使用时间,默认为+30分钟
。必须遵守PHP的strtotime格式。attempts_before_verify
:在要求验证码之前,在attack_mitigation_time
内可尝试的最大次数。默认为5
。attempt_before_ban
:在attack_mitigation_time
内可尝试的最大次数,在临时阻止IP地址之前。默认为30
。password_min_score
:允许的zxcvbn的最小评分。默认为3
。
其余参数通常无需更改。
验证码实现
如果isBlocked()
返回verify
,则应显示验证码。调用checkCaptcha($captcha)
方法验证验证码。默认情况下此方法返回true
,但应覆盖以验证验证码。
例如,如果您使用Google的ReCaptcha NoCaptcha,请使用以下代码
private function checkCaptcha($captcha) { try { $url = 'https://www.google.com/recaptcha/api/siteverify'; $data = ['secret' => 'your_secret_here', 'response' => $captcha, 'remoteip' => $this->getIp()]; $options = [ 'http' => [ 'header' => "Content-type: application/x-www-form-urlencoded\r\n", 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return json_decode($result)->success; } catch (\Exception $e) { return false; } }
如果不需要使用验证码,请确保将attempt_before_block
设置为与attempts_before_verify
相同的值。
如何保护页面
使页面仅对认证用户可访问既快又简单,只需在页面顶部添加几行代码即可。
<?php include("Config.php"); include("Auth.php"); $dbh = new PDO("mysql:host=localhost;dbname=phpauth", "username", "password"); $config = new PHPAuth\Config($dbh); $auth = new PHPAuth\Auth($dbh, $config); if (!$auth->isLogged()) { header('HTTP/1.0 403 Forbidden'); echo "Forbidden"; exit(); } ?>
消息语言
可以通过将可用的语言之一作为Auth构造函数的第三个参数传递来配置PHPAuth返回的错误和成功消息的语言。如果没有提供语言参数,则默认使用en_GB
语言。
示例:$auth = new PHPAuth\Auth($dbh, $config, "fr_FR");
可用语言
ar-TN
cs_CZ
da_DK
de_DE
en_GB
(默认)es_MX
fa_IR
fr_FR
gr_GR
hu_HU
id_ID
it_IT
nl_BE
nl_NL
no_NB
pl_PL
ps_AF
pt_BR
ru_RU
se_SE
sr_RS
th_TH
uk_UA
vi_VN
文档
所有类方法在Wiki中有文档说明。
系统错误代码在此处列出并解释。
贡献
任何人都可以为改进或修复PHPAuth做出贡献,您可以通过报告问题(一个错误、一个想法等)或者复制仓库,对您的复制版进行修改,然后请求合并。
致谢
- password_compat - @ircmaxell
- disposable - @lavab
- PHPMailer - @PHPMailer
- zxcvbn-php - @bjeavons