MySQL的过滤器使用像从另一个表

问题描述 投票:-1回答:1

我知道如何使用游标做到这一点,但我想知道如果没有它是可能的。

我分析流量到我的网站,跟踪IP地址,请求的URL,代理,引用,主机名等我使用一个存储过程执行插入和逻辑。

从交通我已经记录下来,我已经确定我要根据这次访问的细节,采取额外的措施:

1 - 如果请求的是/ WP-*,/测试/管理,/备份,/老/ WordPress的*(及以上),这是一个利用探头(这不是一个WordPress站点)。我想自动获得IP地址列入黑名单。

2 - 如果请求的是一个社会化媒体命中(可见通过URL请求和/或引荐),我们的营销人要系统立即发了一个短信。它插入信息到po_box表,衬托触发发送。

3 - 如果代理是蟒蛇,请求*或多个机器人的一个忽略我的robots.txt,我想自动获得IP地址列入黑名单。

我在寻找沿着线的东西:“如果像(从known_exploits选择exploit_prefix)REQUESTED_URL”或“如果像REQUESTED_URL(选择social_med_links sm_query)或类似HTTP_REFERRER(选择social_media_links sm_referral)”或“如果像HTTP_REFERRER(选择bot_ref从bad_bots)或USER_AGENT等(选择从bad_bots bot_agent)”

我使用游标这样做的权利,但要寻找一个更优雅的方式。即使它比游标慢(是惊人的),我很好奇,如果是可以做到的。

@Sloan思拉舍:我故意没去成左右后端是如何工作的细节。它的工作原理是,并讨论其出轨从实际问题(如@danblack评论,我确定不利用探针攻击。我已经确定,他们是基于证据)。我问,如果是可以从光标移开,并用(希望更有效)查询。

其中的第一个功能是登录的页面访问,这确定该请求违反了网站,或IP地址已经被列入黑名单。如果IP黑名单表(无论是以前还是因为当前请求的),服务器通过一个403我仔细检查每一个新的地址加入到黑名单中,并移动如果合适的话为.htaccess,或改变规则,如果不适当。

create table bad_bots (
    bot_ref varchar(16) comment 'use like %xxx% compare',
    bot_agent varchar(16) comment 'use like %xxx% compare',
    blacklist_comment varchar(32) comment 'push to blacklist table'
);

一些bot_ref的条目:

http://pizza-imperia.com/

一些bot_agent的条目:

%MJ12bot%
%NetcraftSurveyAgent%
%Uptimebot%
%zgrab%
%python-requests%

create table blacklist (
    blacklist_ip varchar(32) primary key,
    blacklist_added datetime not null default now(),
    blacklist_comment varchar(32)
);

create table known_exploits(
    exploit_prefix varchar(64) primary key comment 'use like xxx% compare,  
    blacklist_comment varchar(32) comment 'push to blacklist table'
);

前缀的部分列表。 @danblack - 每个是访问这些都是常见的利用途径的网站方面的尝试。没有人访问我的/ admin目录中没有明确授权的任何权利和合法内容扫描知道。这份名单已经通过查找谁取得了这些请求的IP开发的,他们在多个黑名单存在漏洞的详细探测。

/admin%
/adminer.php%
/xmlrpc.php%
/demo%
/backup%
/test%
/main%
/new%
/old%
/wp/wp-login.php%
/wordpress/wp-login.php%

(标识点击关闭社交媒体帐户或谷歌/雅虎/冰/商会等)

create table social_media_links (
    sm_referral varchar(32) comment 'use like %xxx% compare,
    sm_query varchar(32) comment 'use like %xxx% compare',
    sm_owner varchar(16) comment 'use for po_box'
);

在sm_referral条目的部分列表:

%.facebook.com/%
%.instagram.com/%
%.yelp.com/%
%thurstonchamber.com%

只有一个sm_query至今:

%?fbclid=%

create table page_visits (
    visit_ip_address varchar(32),
    visit_time datetime not null default now(),
    visit_url varchar(128),
    visit_agent varchar(64),
    visit_referrer varchar(128)
);

create procedure sp_log_page_visit (
    IN var_visit_ip_address varchar(32),
    IN var_visit_url varchar(128),
    IN var_visit_agent varchar(64),
    IN var_visit_referrer varchar(128)
)
begin
    declare is_blacklisted int default 0;

    insert into page_visits (visit_ip_address, visit_url, visit_agent, visit_referrer)
        values (var_visit_ip_address, var_visit_url, var_visit_agent, var_visit_referrer);

    # I'M CURRENTLY USING A CURSOR FOR THIS...LOOKING FOR SIMPLER QUERY SIMILAR TO...
    if(var_visit_agent like (select bot_agent from bad_bots where bot_agent is not null) 
    or var_visit_referrer like (select bot_ref from bad_bots where bot_ref is not null)) then

        insert ignore into blacklist (blacklist_ip) values (var_visit_ip_address);
        set is_blacklisted = 1;
    end if;

    # I'M CURRENTLY USING A CURSOR FOR THIS...LOOKING FOR SIMPLER QUERY SIMILAR TO...
    if(var_visit_url like (select exploit_prefix from known_exploits)) then
        insert ignore into blacklist (blacklist_ip) values (var_visit_ip_address);
        set is_blacklisted = 1;
    end if;

    # I'M CURRENTLY USING A CURSOR FOR THIS...LOOKING FOR SIMPLER QUERY SIMILAR TO...
    if(var_visit_referrer like (select sm_referral from social_media_links)
    or (var_visit_url like (select sm_query from social_media_links)) then
        # performs multiple actions to add new entry into po_box table
    end if

    select is_blacklisted;
end ;;
mysql
1个回答
0
投票

假设你有一个表known_exploits,一个简单的查询将决定是否要列入黑名单特定的IP。这里是你的第一个查询的例子:

IF ((SELECT count(`exploit_prefix`) as `numfound`
    FROM `known_exploits`
    where `exploit_prefix` like var_visit_url) > 0)
    THEN
        insert ignore into `blacklist` (`blacklist_ip`) values (var_visit_ip_address);
        set is_blacklisted = 1;
ENDIF;
© www.soinside.com 2019 - 2024. All rights reserved.