如何限制登录尝试 - PHP & MySQL & CodeIgniter

2024-04-25

我希望能够根据失败的尝试来限制登录尝试,但我有一些问题。

我应该使用 MySQL 吗? (读到它可能会给数据库带来压力)
我应该在每个用户和系统范围内进行限制还是仅在系统范围内进行限制? (这样可以防止普通人猜测密码)
我应该如何计算我的阈值? (因此它会自动适应变化/增长)
我应该如何检索这个阈值?每次失败时查询/计算还是存储在缓存中?
我应该用什么来节流? (阅读 sleep() 可能最终导致服务器紧张的响应)

有人有一些示例代码吗?

我对此很陌生,所以我很感谢您的帮助! 谢谢


我实现了一个穷人的节流机制 https://github.com/alixaxel/phunction/blob/23682aca0adaed23c676623ca1acfb82bb5f71a6/_.php#L501 in 漏音 https://github.com/alixaxel/phunction/blob/master/_.php单独使用APC,这就是我的使用方式:

// allow 60 requests every 30 seconds
// each request counts as 1 (expensive operations can use higher values)
// keep track of IPs by REMOTE_ADDR (ignore others)

$throttle = ph()->Throttle($ttl = 30, $exit = 60, $count = 1, $proxy = false);

if ($throttle === true)
{
    // IP exceded 30 requests in the last 60 seconds, die() here
}

else
{
    // $throttle is a float
    // number of requests in the last 30 seconds / 30 seconds

    /*
     1 req / 30 = 0,033 sec
     5 req / 30 = 0,166 sec
    10 req / 30 = 0,333 sec
    15 req / 30 = 0,5   sec
    20 req / 30 = 0,666 sec
    25 req / 30 = 0,833 sec
    30 req / 30 = 1     sec
    */

    usleep(intval(floatval($throttle) * 1000000));
}

我在我的前端控制器上使用它并将值传递给我的路由方法,但那是另一个故事了。

最重要的是,如果您使用 APC,您可以在内存中保持非常快的速度,并且几乎不消耗内存,因为 APC 遵循 FILO 方法。如果您需要更高的超时,您可以考虑使用不基于内存的东西。

顺便说一句:MySQL 支持带有 MEMORY 引擎的表。


问题在于sleep():

作为模块安装 PHP 的典型 Apache Web 服务器每个实例将占用大约 10 MB 的 RAM,为了避免超出可用 RAM,您可以配置一些 Apache 设置来限制 Apache 能够启动的最大实例数量。

问题是当你sleep(),该实例仍然处于活动状态,并且有足够的请求可能最终会耗尽所有可用插槽来启动新服务器,从而使您的网站无法访问,直到某些待处理的请求完成。

PHP AFAIK 没有办法克服这个问题,所以最终取决于你。


系统范围的节流原理是相同的:

function systemWide($ttl = 86400, $exit = 360)
{
    if (extension_loaded('apc') === true)
    {
        $key = array(__FUNCTION__);

        if (apc_exists(__FUNCTION__) !== true)
        {
            apc_store(__FUNCTION__, 0, $ttl);
        }

        $result = apc_inc(__FUNCTION__, 1);

        if ($result < $exit)
        {
            return ($result / $ttl);
        }

        return true;
    }

    return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何限制登录尝试 - PHP & MySQL & CodeIgniter 的相关文章

  • 如何翻译 Sonata Admin Bundle 中的标签

    我正在使用 Symfony 2 3 和 Sonata Admin Bundle 我知道我可以用这种方式翻译标签 gt add shortDescription null array label gt shortDescriptionTran
  • php中UCS2/HexEncoded字符转UTF8

    我之前问过一个问题 从 UTF 8 获取 UCS 2 HexEncoded 字符串 我在以下链接中得到了一些人的帮助 UCS2 HexEncoded 字符 https stackoverflow com questions 1872773
  • vcruntime140.dll 14.0 与 PHP 版本不兼容

    我已经下载了PHP 7 4 1 NTS vc15 x86在 Windows Server 2016 计算机上 我也下载并安装了vc redist x86 exe 当我尝试跑步时php cgi从命令提示符我收到以下错误 PHP 警告 vcru
  • Doctrine/Symfony 如何使用数组中的特定数据更新实体

    我环顾四周太久了 但没有运气 我的情况是 我有一个有点大的表 60 列 在 Doctrine Entity 中表示 在 FosREST 上工作 我想要实现的是 我想发送带有特定数据的 JSON 例如 phone gt new phone n
  • Laravel,2 个域中的 2 个项目同一会话

    我正在 2 个不同的域 domain1 tld 和域 2 tld 中创建 2 个项目 domain1 tld 是主要事件生成器页面 domain2 tld 是其事件之一 我想共享相同的会话 它们实际上共享相同的数据库和相同的 apache
  • 限制用户角色仅更改 Woocommerce 中的某些订单状态 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想限制按角色访问 woocommerce 下拉列表中的某些订单状态 我已经在functions php子主题中尝试过代码按角色限制
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • 从同一mysql服务器的不同数据库复制表

    我有一台带有 2 个数据库的服务器 我想将多个表从一个数据库复制到另一个数据库 目的是我们使用项目中使用的相同用户表 正如在另一个表中使用 InnoDB 和用户表的外键一样 我选择了一种复制方式 为此我对 my cnf 进行了更改 mast
  • 如何使用xampp连接sql服务器和php?

    我正在尝试使用 Xampp 将我的 SQL 服务器与 PHP 连接 我已经在ext文件夹中上传了dll文件 但无法连接它 我的PHP版本是7 2 6 上传的dll文件是 php pdo sqlsrv 72 ts dll php sqlsrv
  • Yii2:ActiveController 中的 REST API 操作

    在文档指南中有示例 namespace app controllers use yii rest ActiveController class UserController extends ActiveController public m
  • 使用 PHP 简单 DOM 解析器的递归

    由于某种原因 我在使用简单 DOM 解析器库时遇到了递归 我的 HTML 是这样的 div div class some div some text div div class field 1 misc1 a href Some text
  • 如何在 PHP 中验证小数

    如何在 PHP 中验证十进制数字 我查看了 is numeric 但这对我不起作用 bool is numeric 混合变量 查找给定变量是否为 数字 数字字符串包括 可选符号 任意数量的数字 可选的小数部分和可选的 指数部分 因此 012
  • MySQL 将前导数字添加到列中的现有 ID

    我有一个名为country id的mysql数据库列 例如 country id 1 2 59 435 2714 我现在想要完成的是将前导零添加到每个 ID 因此结果将是 country id 0001 0002 0059 0435 271
  • 在 htaccess 中设置内存限制 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在使用 WordPress 我需要增加内存 因此我将以下行添加到我的 htaccess 文件中 BEGIN WordPress
  • 从MySQL php中的特定列获取最大ID和最小ID

    我是新来的php现在尝试从中检索数据MySQL到安卓 这是我的工作细节 table In 检索总小时数函数 我想检索最短 ID 时间 and 最大 ID 超时 from MySQL到安卓通过php最后使用下面的代码来获取总小时数 假设 ID
  • 可重复的随机数系列

    如何在 PHP 中获得一系列可重复的伪随机数 在旧版本的 PHP 中 我只需在RNG http en wikipedia org wiki Random number generation 但它不再起作用了 因为 PHP 改变了 rand
  • 如何通过 JQuery Post 传递 Javascript 数组,以便可以通过 PHP $_POST 数组访问其所有内容?

    如何通过 JQuery Post 传递 Javascript 数组 以便可以通过 PHP POST 数组访问其所有内容 请展示一个可以实现此目的的代码示例 Thanks 如果你想传递一个 JavaScript 对象 哈希 即 PHP 中的关
  • 使用 PHP 的 HTML 中的选项字段

    我想根据从下拉列表中选择的区域名称搜索员工列表 我可以将数据库中的区域名称检索到 PHP HTML 的下拉列表中 但现在我很困惑如何将下拉列表中的选定选项传递给 PHP 中的 SQL 查询 我还想要索引号 选定的选项 我的代码如下
  • php 中是否可以使用正则表达式替换短语后面的单词?

    输入文本 工程学院 医学院 所需产出 教育学院 教育学院 规则 school of 后面的任何单词都需要替换为 education inputext school of engineering school of medicine rule
  • 将一段文本保存到mysql

    我正在使用 php 和 mysql 做一个项目 我对此很陌生 现在我必须将一段文本存储到我的数据库中 在表中 对于列 I tried varchar 5000 创建表时但它不允许我 所以请给我一个解决方案 你的 mysql 字段类型应该 T

随机推荐

  • 如何使用 boost::spirit::qi 解析行尾?

    不应该是一个简单的eol http www boost org doc libs 1 42 0 libs spirit doc html spirit qi quick reference qi parsers auxiliary html
  • ASP NET Core 2 找不到包“Projectname.Model”的编译库位置

    在我的解决方案中 我有两个项目 其中之一是web项目 另一个是Model项目 您可以在下面看到我的解决方案结构 现在 当我运行应用程序时 出现以下错误 InvalidOperationException 找不到包 ContosoUniver
  • 如何在 GWT 中取消转义字符串

    我使用了 SafeHtmlUtils htmlEscape text 并且我想使用相反的功能 你能告诉我 gwt 中是否有像 unescapeHtml 这样的函数 如果 并且仅当 您可以相信文本不包含恶意内容 您可以使用 import co
  • 客户端验证后 RegisterOnSubmitStatement

    我需要在提交 Web 表单时但在客户端验证发生之后在流程中插入一些 Javascript RegisterOnSubmitStatement 似乎将 JavaScript 放在验证之前 有人知道如何让它渲染后吗 找到解决方案 在网络控件中
  • declarative_authorization 和命名空间

    您知道 declarative authorization 是否可以控制对命名空间资源的访问吗 我尝试过类似的东西 has permission on admin users to gt index show new create edit
  • R和matlab中的qr函数

    我有一个关于将 matlab 函数转换为 R 的问题 我希望有人能提供帮助 matlab 和 R 中使用的标准 QR 分解称为 qr 据我了解 用两种语言执行 qr 分解的标准方法是 Matlab Q R qr A 满足QR A R z l
  • PDOStatement 到 JSON [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我将如何转换PDOStatement到 JSON 我需要 jsonifyPDO FETCH OBJ json encode没有能力 j
  • 如何创建 Delphi Android 应用程序 APK 来包含文件

    如何将文件和 或包含 Android 应用程序 APK 文件的文件的文件夹包含在内 Delphi 运行过程会擦除 Assets 目录的内容 并且我放置在那里的文件 文件夹不包含在 APK 包中 我假设您必须手动将 System Startu
  • 如何在 Python 中使用 tkinter 选择目录并存储位置

    我正在创建一个带有浏览按钮的 GUI 我只想返回路径 我一直在寻找使用如下代码的解决方案 Tkinter Button subframe text Browse command self loadtemplate width 10 pack
  • 使用candlestick_ohlc显示csv

    我尝试用熊猫做第一步 经过几个成功的步骤后 我坚持执行以下任务 使用 OHLC 条显示数据 我从 Google Finance 下载了 Apple 股票的数据并将其存储到 csv 文件中 经过大量搜索 我编写了以下代码 import pan
  • 与 Socket.io 保持连接

    我正在尝试使用 asterisk websocket 连接socket io 客户端 https github com socketio socket io client socket io connect url transports w
  • 根据laravel中选定的省份获取城市列表

    如何获取基于所选省份的城市列表 我的控制器 public function index province RajaOngkir Provinsi gt all city RajaOngkir kota gt all return view
  • Intl.DateTimeFormat 给出 1847 年或以下年份的奇怪结果

    为什么我选择1848以下的年份 这种格式的结果是May 10 我有一种感觉 这可能与时区有关 如果是这样 我怎样才能避免这种情况 因为我将从 ISO 日期字符串 没有时间 创建一个日期对象 如下所示 YYYY MM DD 在 Chrome
  • 是否可以以编程方式指定

    有什么方法可以在活动 l 中以编程方式指定 in 的意思吗 因为在 Google Play 中 当用户尝试安装该应用程序时 它表示 Android 应用程序与您的 Kindle Fire 平板电脑设备不兼容 在我的应用程序中 我们使用的是地
  • 将 AutoFac 设置为默认使用 PropertiesAutowired(true) 吗?

    有没有办法我可以将 AutoFac 设置为使用 PropertiesAutowired true 作为所有注册类型的默认值 即我不想一直使用 Properties Autowired true var builder new Contain
  • 如何将数据从 C# 推送到 ZeroMQ 并从 Node.JS 拉取,反之亦然?

    Scenario 我正在尝试发送数据 例如String类型 通过 ZeroMQ 从 C 控制台应用程序到 Node JS 服务器 信息 分别对 C 使用 clrzmq 对 C 和 Node JS 使用 ZeroMQ 库 我有能力执行推拉 h
  • Python - PIP 安装故障排除 - PermissionError: [WinError 5] 访问被拒绝

    使用 PIP 安装新软件包甚至将 pip 本身升级到最新版本时出现以下错误 我正在 Windows 8 1 机器上使用 Python 3 4 运行 pip 该消息告诉我我没有文件的管理权限 我的帐户是管理员帐户 我很感激任何关于如何解决这个
  • createElement() 与innerHTML 何时使用?

    我在sql表中有一些数据 我通过 JSON 将其发送到我的 JavaScript 从那里我需要将其组成 HTML 以便通过两种方式之一向用户显示 通过编写 html 字符串并插入到持有元素的 innerHTML 属性中 通过对我需要的每个元
  • 使用 PHP GD 将文本置于图像中心

    所以我正在创建一个横幅生成器 我将在中间添加文本 但希望它正好位于中心 我知道imagettftext可以用来在横幅上书写 但这不会使其居中 一个可能的解决方案可能是找到文本的宽度 然后使用从横幅宽度的一半中取出的一半 但我不知道如何做到这
  • 如何限制登录尝试 - PHP & MySQL & CodeIgniter

    我希望能够根据失败的尝试来限制登录尝试 但我有一些问题 我应该使用 MySQL 吗 读到它可能会给数据库带来压力 我应该在每个用户和系统范围内进行限制还是仅在系统范围内进行限制 这样可以防止普通人猜测密码 我应该如何计算我的阈值 因此它会自