mysql过滤器使用来自另一个表的like

时间:2019-02-05 00:03:36

标签: mysql

我知道如何使用游标执行此操作,但是我想知道是否可以不使用游标。

我正在分析网站访问量,跟踪IP地址,请求的URL,代理,引荐来源网址,主机名等。我正在使用存储过程来执行插入和逻辑操作。

根据访问的详细信息,我已经记录了访问量,确定了我想采取的其他措施:

1-如果请求是针对/ wp- *,/ test,/ admin,/ backup,/ old,/ wordpress *(以及更多),则这是一个漏洞利用探针(这不是wordpress站点)。我想将IP地址自动列入黑名单。

2-如果请求是社交媒体点击(可通过请求的URL和/或引荐来源网址查看),则我们的营销人员希望系统立即向她发送短信。它将信息插入po_box表中,该表会触发要发送的触发器。

3-如果代理是python-requests *或忽略我的robots.txt的多个漫游器之一,我希望IP地址自动列入黑名单。

我正在寻找类似以下内容的东西:“如果请求的URL相似(从known_exploits中选择exploit_prefix)”或“如果请求的URL相似(从social_med_links中选择sm_query)或http_referrer相似的东西(从social_media_links中选择sm_referral)或“如果http_referrer喜欢(从bad_bots中选择bot_ref)或user_agent之类(从bad_bots中选择bot_agent)”

我现在正在使用游标进行操作,但是正在寻找一种更优雅的方法。即使它比游标慢(令人惊讶),我很好奇它是否可以做到。

@Sloan Thrasher:我故意没有详细介绍后端的工作方式。它正在按原样工作,并在讨论中脱离了实际问题(例如,@ 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%

(标识来自社交媒体帐户或google / yahoo / bing /商会等的点击)

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 ;;

1 个答案:

答案 0 :(得分: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;