我正在尝试为网站上的登录页面创建一个反bruteforcer。不幸的是,我的查询没有按预期工作。我想测试IP地址尝试登录的次数,并在登录过程中为我的下一步返回用户的ID。
但是,我遇到了查询问题......首先,如果它们与之前尝试登录的用户相同,则只返回行。我需要它成为任何用户。其次,无论我使用LEFT JOIN,RIGHT JOIN,INNER JOIN还是JOIN,它都不会返回用户的ID,除非login_attempts
中的用户有一行。
SELECT COUNT(`la`.`id`),
`u`.`id`
FROM `users` AS `u`
LEFT JOIN `login_attempts` AS `la` ON `u`.`id` = `la`.`user_id`
WHERE `u`.`username` = 'admin'
AND `la`.`ip_address` = '127.0.0.1'
AND `la`.`timestamp` >= '1'
以下是DESC login_attempts
Field Type Null Key Default Extra
id int(10) unsigned NO PRI NULL auto_increment
user_id int(10) unsigned NO MUL NULL
ip_address varchar(15) NO MUL NULL
timestamp int(10) NO NULL
此查询执行相同的操作,但如果在与之对应的login_attempts中有一行,则甚至不选择ID:
SELECT COUNT(`la`.`id`),
`u`.`id`
FROM `users` AS `u`
LEFT OUTER JOIN `login_attempts` AS `la` ON `u`.`id` = `la`.`user_id`
AND `la`.`ip_address` = '127.0.0.1'
AND `la`.`timestamp` >= '1'
WHERE `u`.`username` = 'admin'
答案 0 :(得分:3)
不要使用联接,并分开查询。在一个中计算尝试次数,并在另一个中返回用户ID:
sql 1:
select count(id) from login_attempts where ip_address="<ipaddress>"
sql 2:
select id from users where username="<username>"
如果你真的坚持使用联接,我认为这是不必要的:
select count(login_attempts.id), users.id
from users
cross join login_attempts
where users.username="<username>"
and login_attempts.ip_address="<ipaddress>"
我认为这也是效率低下的。
答案 1 :(得分:0)
尝试将ip_address和timestamp移动到连接条件。您需要一个外部联接到login_attempts。