Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 跟踪失败的登录尝试_Php_Security_Session_Passwords_Brute Force - Fatal编程技术网

Php 跟踪失败的登录尝试

Php 跟踪失败的登录尝试,php,security,session,passwords,brute-force,Php,Security,Session,Passwords,Brute Force,这个问题本质上是语言不可知论,但在我的例子中,我是为任何想知道的人使用的 我想记录用户尝试登录失败的次数,以便在X尝试失败后显示。这样做的唯一目的是防止暴力攻击。这不一定是一种非常安全的方式,只是让人恼火到足以延迟野蛮强迫的人 我正在考虑创建一个会话变量$\u session['failedLoginatTests'],并在每次检测到失败的登录尝试时增加它。攻击者仍然可以替换浏览器或删除Cookie以继续,但这会使他(即,无论他使用什么工具来执行暴力)每次尝试都多浪费几秒钟的时间,因此尝试次数会

这个问题本质上是语言不可知论,但在我的例子中,我是为任何想知道的人使用的

我想记录用户尝试登录失败的次数,以便在
X
尝试失败后显示。这样做的唯一目的是防止暴力攻击。这不一定是一种非常安全的方式,只是让人恼火到足以延迟野蛮强迫的人

我正在考虑创建一个会话变量
$\u session['failedLoginatTests']
,并在每次检测到失败的登录尝试时增加它。攻击者仍然可以替换浏览器或删除Cookie以继续,但这会使他(即,无论他使用什么工具来执行暴力)每次尝试都多浪费几秒钟的时间,因此尝试次数会大大减少

从每秒几次攻击到每分钟几次攻击是理想的,那么攻击可以忽略不计


这个方法是正确的还是我遗漏了什么?此外,在这些情况下,最佳做法是什么?

您最好将此记录在附加到用户ID的数据库中。这是因为确定的攻击者不会使用web浏览器进行暴力攻击;用大多数语言构建一个脚本非常简单,可以重复登录尝试并完全忽略cookies,或者在每次尝试后重置cookies。

如果您在数据库中存储加密的密码,请记住

PHP或MySQL应该接受用户输入并对其进行加密

例如(非真实且不安全的代码)


如果您的服务器在post请求中最多可以占用8MB的数据,该怎么办。该攻击者可以发布1 Mb的密码,试图在加密上进行DDOS攻击,以保持服务器的CPU处于高负载状态。

他们可能也会跳过不同的用户名。也可以通过IP登录?没错。。。但是,每次重置cookies都会花费足够的时间(甚至不到一秒钟)来阻止攻击吗?如果不是,那么记录攻击者的IP并在几小时内阻止该IP的任何登录尝试可能会更有效。如果他们使用自定义脚本,则重置Cookie所需的时间可以忽略不计(微秒)。您可以通过IP或用户名进行跟踪,但用户名可能更有效。例如,我的办公室有大约三百人在一个外部IP地址后面工作。因此,通过IP锁定可能会产生大量误报,同一IP后面的两个人同时登录似乎是一种攻击。感谢您的回答!是的,你可能是对的。只要防御措施不是阻止帐户(因此阻碍实际所有者访问),而是像验证码一样,通过用户名跟踪是最有效的方法。现在,失败的登录尝试应该随着时间的推移而重置。就像一个用户今天可以错误输入一次密码,明天和一周后的另一次。你们不应该强迫他们在一个月后进入登录页面时输入captcha,仅仅因为他们过去有足够多失败的登录尝试。因此,每次成功登录后,请将计数器重置为零。您不应执行类似于
password=“.sha512($\u POST['password'])
的操作。而应从username=$\u POST['username']的表中选择密码。显然,首先要清理用户输入。然后将数据库中的内容与运行任何必要加密的密码字段中发布的内容进行比较。如果安装了LAMP,则还应配备软件防火墙和mod_security。mod_security通常有助于应对大型post数据攻击,而防火墙可能是抵御DDoS的良好解决方案。Nonetheless,我发现这个答案与OP的问题无关。
$query = "SELECT * FROM user WHERE user = " . $_POST['username'] . " AND password " . sha512($_POST['password']);