PHP - 有效地增加变量

时间:2015-10-14 11:41:01

标签: php mysql arrays pdo

我正在使用登录用户的功能,当他们登录但由于没有发送验证码,验证码失败或登录失败而失败时,它将为IP提供Try。当他们达到5次尝试时,他们会在登录页面上被阻止大约1小时。我有一个更新MySQL列的函数,以增加尝试计数和最后一次尝试日期。但从查看PHP的文档可以看出:

  

注意:递增/递减运算符仅影响数字和   字符串。数组,对象和资源不受影响。

我的函数从数据库中获取try count,然后尝试更新它。由于PDO的工作方式,我获取Try计数的SQL结果默认为Array。那么我怎样才能有效地增加数组呢?

我正在考虑执行foreach条件并使用.=操作符将其保存为字符串并从那里增加。但这真的是最有效的方式吗?

谢谢。

P.S:我没有显示任何示例代码e.t.c,因为这个问题很简单。我在这里搜索过,找不到合适的答案。

3 个答案:

答案 0 :(得分:2)

要理解为什么你的问题是错误的,你必须要了解数组是什么。

数组只是一个包含其他变量的“包”。所以,你的问题听起来像“我怎么能用口袋买两瓶啤酒?”。问题是,你不能用口袋付钱。你必须从口袋里拿出现金,然后用现金。

与数组完全相同:您必须从数组中提取返回的数据,然后您可以自由地对其内容执行任何操作。关于内容,记住,不要放在包里。

但是对于有效的解决方案,请选择其他答案,以正确的方式解决您的初始问题 - 而无需选择任何阵列。

只是旁注

  

由于PDO的工作方式,获取Try计数的MySQL结果默认为Array。

事实上,PDO可以以多种不同的方式工作。例如,它可以返回标量值。

答案 1 :(得分:1)

您可以直接在更新查询中递增它。如果您想添加一个尝试,只需:

<?php
$url = 'https://feedback.push.apple.com:2196';
$cert = 'Cert.pem';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSLCERT, $cert);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, "passphrase");
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"device_tokens": ["XXXX"], "aps": {"alert": "test message one!"}}');
$curl_scraped_page = curl_exec($ch);
?>

只需用实际IP替换IP。

答案 2 :(得分:1)

只是添加..

IMO您应该使用单独的表进行错误的登录尝试。造成这种情况的原因有很多,但其中一个重要原因是,任何攻击都可能会使用户名旋转,而不仅仅是尝试使用密码。

拥有一个记录所有不正确登录的单独表格,您可以更轻松地在xx时间内查询大量不正确的登录信息。附加到用户的不正确登录限制了您检测来自脚本源的DoS和暴力攻击的能力,因为您只能查看首先实际存在的用户名。

但是,您可以将表中的字段与用户ID相关联,以便您可以单独跟踪用户,然后在成功登录后,可以删除与该用户相关的记录。

给你一个有效的例子。我已经将以下功能内置到我每天工作的商业Symfony项目中。

表格示例

userID    --- foreign key (not mandatory)
IP        --- mandatory
timestamp --- mandatory

我们查询这样的数据:

  • 特定子域的总体失败尝试(我们使用相同的系统使用了很多子域)
    • 系统在学校使用,所以我们必须迎合顽皮的学生!
  • 最后一分钟尝试失败
    • 系统根据基础值x的数量休眠一段随机时间。 (尝试绊倒脚本攻击的一种hacky方式)
  • 特定用户的整体尝试
    • 与您的示例相似..与预配置的数量进行比较,然后相应地警告/禁用用户。如果它阻止向服务台团队发送电子邮件。

这绝不是建议列表,也不是应该完成的示例..它仅仅是我们在应用程序环境中的决定。

关键是,如果没有单独的表,那么大部分都是不可能的。