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-TNcs_CZda_DKde_DEen_GB(默认)es_MXfa_IRfr_FRgr_GRhu_HUid_IDit_ITnl_BEnl_NLno_NBpl_PLps_AFpt_BRru_RUse_SEsr_RSth_THuk_UAvi_VN
文档
所有类方法在Wiki中有文档说明。
系统错误代码在此处列出并解释。
贡献
任何人都可以为改进或修复PHPAuth做出贡献,您可以通过报告问题(一个错误、一个想法等)或者复制仓库,对您的复制版进行修改,然后请求合并。
致谢
- password_compat - @ircmaxell
- disposable - @lavab
- PHPMailer - @PHPMailer
- zxcvbn-php - @bjeavons