Mysql
這個觸發器會顯著降低性能嗎?
我有這個觸發器(盡我所能)來防止暴力登錄。它有兩個獨立的功能:
- 如果在過去三分鐘內從同一 IP 地址嘗試登錄失敗超過 4 次(因此準確讀取 5 次),則該 IP_address 將添加到 blacklisted_ips 表中。然後,IP 地址具有由表中的列指定的“冷卻”時間段。
- 如果在過去兩分鐘內從同一使用者名(因此 IP 地址不可知)嘗試登錄失敗超過 3 次(因此準確讀取 4 次),則該使用者名將添加到 blacklisted_usernames 表中。然後,使用者名具有由表中的列指定的“冷卻”時間段。
我的問題是,看看這個觸發器,我覺得它的性能效率很低。我的想法是正確的,還是性能影響可以忽略不計?
CREATE TRIGGER prevent_brute_force AFTER INSERT ON login_att FOR EACH ROW BEGIN SELECT ip_add, was_success INTO @ip, @result FROM login_att ORDER BY login_att_id DESC LIMIT 1; SELECT ip_add INTO @check_ip FROM login_att WHERE login_att_time > DATE_SUB(NOW(), INTERVAL 3 MINUTE) AND ip_add = @ip HAVING COUNT(ip_add) > 4; IF @check_ip IS NOT NULL THEN IF @result = 0 THEN INSERT INTO blacklisted_ips (ip_add) VALUES (@ip); END IF; END IF; SELECT username_att into @username_att FROM login_att WHERE login_att_time > DATE_SUB(NOW(), INTERVAL 2 MINUTE) AND was_success=0 HAVING COUNT(username_att) > 3; IF @username_att IS NOT NULL THEN INSERT INTO blacklisted_users (username) VALUES (@username_att); END IF; END$$
評估性能的最佳方法是對其進行測量 - 您是唯一可以在真實應用程序上進行評估的人,或者更好的是,在具有流量副本或此類仿真的暫存環境中進行評估。
硬體、執行的其他程式碼、吞吐量、這些新查詢的速度有多慢、您擁有的數據量等都會告訴您您想知道的內容——相同的程式碼可以在不同的情況下成功或破壞它。
話雖如此,如果你只是想對這個想法有一個高層次的看法,而對你的系統沒有太多了解——我個人會根據外部日誌(或你的 login_att 表)非同步進行這種分析,就像通常你不做的那樣如果發生的頻率不夠高,不想懲罰您的普通使用者。觸發器也不是我最喜歡的處理應用程序邏輯的方式。但是,如果您無法修改原始碼,它不會增加總延遲,並且您對其進行測試並且它似乎可以接受,請繼續 - 但請測試它不會在有數千次並行嘗試時破壞您的應用程序每秒由於額外的寫入。