我正在使用登录用户的功能,当他们登录但由于没有发送验证码,验证码失败或登录失败而失败时,它将为IP提供Try
。当他们达到5次尝试时,他们会在登录页面上被阻止大约1小时。我有一个更新MySQL列的函数,以增加尝试计数和最后一次尝试日期。但从查看PHP的文档可以看出:
注意:递增/递减运算符仅影响数字和 字符串。数组,对象和资源不受影响。
我的函数从数据库中获取try count,然后尝试更新它。由于PDO的工作方式,我获取Try计数的SQL结果默认为Array。那么我怎样才能有效地增加数组呢?
我正在考虑执行foreach条件并使用.=
操作符将其保存为字符串并从那里增加。但这真的是最有效的方式吗?
谢谢。
P.S:我没有显示任何示例代码e.t.c,因为这个问题很简单。我在这里搜索过,找不到合适的答案。
答案 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
我们查询这样的数据:
这绝不是建议列表,也不是应该完成的示例..它仅仅是我们在应用程序环境中的决定。
关键是,如果没有单独的表,那么大部分都是不可能的。