【大金山星际源码】【手机回租贷源码】【golang nsq源码分析】开奖名单查询源码_开奖名单查询源码最新

时间:2024-11-14 13:08:45 来源:桌面app源码 分类:综合

1.求C语言源代码 题目 学生成绩管理系统
2.go-iptables功能与源码详解
3.黑名单怎么样设置?开奖开奖
4.java——ip黑名单设计方案(大全+实战)
5.PHP小旋风站群系统源码

开奖名单查询源码_开奖名单查询源码最新

求C语言源代码 题目 学生成绩管理系统

       #include <cstdlib>

       #include <iostream>

       using namespace std;

       int main(int argc, char *argv[])

       { #define UP

       #define DOWN

       #define INSERT

       #define DEL

       #define ENTER

       #define KEY

       #define KEY

       #define KEY

        #define KEY

       #define KEY A

        #define KEY B

       #define KEY C

       #define KEY D

       #define KEY E

        #define KEY F

       #define KEY G

       #define KEY H

        #define KEY I

        #define KEY K

       #define KEY L

        #define KEY M

       #define KEY N

       #define KEY O

        #define KEY P

       #define KEY Q

        #define KEY R

       #define KEY S

        #define KEY T

       #define KEY U

        #define KEY V

       #define KEY W

        #define KEY X

       #define KEY Y

       #define KEY Z

       #define ALT F2

        #define ALT F6

       #define CTRL 4

        #define SHIFT 1

       #define ESC 1

       #define BACKSPACE

       #define LEN sizeof(struct student)

       /*菜单选项。下拉标志*/

       int menu x yes=1;

       int menu y yes=0;

       int menu x=1;

       int menu x old=0;

       int menu y1=1,名单名单 menu y3=1;

       /*保存文件名*/

       char filename[]="NONAME.dat";

       /*开辟保存数据的空间*/

       void *buf=0;

       int left,top,right,bottom;

       /*开辟保存数据的空间*/

       struct student

       { long num;

       char name[];

       float h maths;

       float english;

       float c;

       float sum;

       int s sum;

       struct student*next;

       };

       struct student*head=0,*p1,*p2;

       int record n;

       char key buf[];

       long student number=0;

       char student name[];

       float student score=0;

       /*读键扫描码*/

       char get key(void)

       { AH=0; int (0X); return( AH); }

       /*显示字符*/

       void show char(char z)

       { AL=z; AH=0x0e; int (0x);}

       /*测试是否有键输入*/

       int key pressed(void)

       { AH=0x0b; int (0x); if( AL==0) return(0); else return(1);}

       /*退出程序*/

       voidquit(void)

       { void free data(void);void restore menu(void); free data();

       restore menu(); window(1,1,,,0x0f);

       cur show(); gotoxy(1,1); exit(1);

       }

       /*回到dos提示符*/

       void os shell(void)

       { void mainmenu show(void);

       window(1,1,,,0x0f);

       cur show(); gotoxy(1,1); system("");

       mainmenu show();

       }

       /*主窗口文字*/

       void main menu 1(void)

       { int i,j; char*p;

       char*mainmenu word[]={ "File ","Save ","Options ","About me"};

       if(menu x!=menu x old||!menu y yes)

       { p=mainmenu word[0];

       putstr(4,1,0x,p,);

       for(i=0;i<;i++) if(*p++<='Z') putchar(i+4,1,*(p-1),0x);

       p=mianmenu word[0];

       if(menu x yes)

       for(i=0;j=0;i<;i++)

       { it('A'<=*p&&*(p+1)=='')break;

       putchar(i+4,1,*p,0x0f); }

       p++; }

       }

       }

       void main menu 2(void)

       { int i; int len; char *p;

       char*mainmenu word[6]={ "F1-Help","F2-Save","F5-OS shell","F-Menu","Message"};

       void main box(void); main box();

       p=mainmenu word[0]; putstr(2,,0x,p,);

       for(i=0;i<;i++) { if(*p=='F'||('0'<=*p&&*p<='9'))putchar(i+2,*p,0x); p++; }

       p=mainmenu word[4]; putstr(,,0x,p,9); len=strlen(filename);

       putchar(-len/2-1,2,'',0x);

       for(p=filename,i=0;*p!=0;p++;i++) putchar(-len/2+i,2,*p,0x);

       putchar(-len/2+len,2,'',0x);

       }

       /*主窗口线框*/

       void main box(void)

       { int i;

       for(i=1;i<=;I++) { putchar(i,2,,0x); putchar(i,,,0x);putchar(i,,,0x);}

       for(i=1;i<=;i++) { putchar(1,i,,0x); putchar(,i,,0x); }

       putchar(1,2,,0x); putchar(,2,,0x); putchar(1,,,0x);

       putchar(,,,0x); putchar(1,,,0x); putchar(,,,0x);

       }

       /*显示主窗口菜单*/

       voidmianmenu show (void)

       { textmode set(); cur hide();

       window(1,1,,,0x1e);

       window(1,1,,1,0x);

       window(1,,,,0x);

       main menu ; main menu ;

       }

       /*显示下拉菜单*/

       void menu show (void)

       { int i;

       char*submenu word[][5]={ { "New file F4","Open file F3","OS shell F5","Quit Alt-X"},

       p"Input F6","Delete F8","Update F9","query F","Sort F"}};

       switch(menu x)

       { case 1:

       if(menu x!=menu x old)

       { menu x old=menu x; menu window(3,2,,8); menu box(3,2,,8,3,0);}

       for(i=0;i<2;i++)

       { putstr(4,3+i,0x,submenu word[0][i],);

       putchar(5,3+i,*(submenu word[0][i]+1),0x); }

       for(i=3;i<5;i++) putstr(4,3+i,0x7-,submenu word[0][i-1],);

       putchar(6,6,*(submenu word[0][2]+2),0x);

       putchar(5,7,*(submenu word[0][3]+1),0x);

       window(4,2+menu y1,,2+menu y1,0x0f);

       if(menu y1<=2)

       putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-1],);

       else

       putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-2],); break;

       case 2:menu x old=menu x; menu window(,2,,8);}

       for(i=0;i<5;i++)

       { putstr(,3+i,0x,submenu word[1][i],);

       putchar(,3+i,*(submenu word[1][i]+1,0x); }

       window(,2+menu y3,,2+menu y3,0x0f);

       putstr(,2+menu y3,0x0f,submenu word[1][menu y3-1],); break;

       case 4:menu x old=menu x; }

       }

       /*清空键盘缓冲*/

       void clr buf(void){ key buf[1]=0;}

       void free data(void)

       { struct student*pa,*pb;

       if(head)

       { pb=pa=head;

       do{ pb=pa; pa=pb->next; free(pb);}while(pa!=0);head=0; }

       }

       /*姓名处理*/

       int string name(void)

       { int i,j;

       if(key buf[1]==0) return(0);

       for(i=2,j=0;i<=key buf[1]+1;i++;j++)

       student name[j]='\0'; return(1);}

       /*输入数据*/

       voidinput(int flag)

       { int i; char*s1="NO. Name H maths English C\\C++ ";

       char*s2=" | | | | ";

       char*title="INPUT"; menu window(,,,); window(,,,,0x);

       putstr(,,0x,title,7); putstr(,,0x,s1,);

       if(head==0)

       { head=p1=p2=(struct student*)malloc(LEN);if(!head)memory error();

       p1->next=0;

       else{

       for(p1=head,record n=0;p1!=0;record n++)

       { p2=p1; p1=p2->next; }

       p1=(struct student*)malloc(LEN);

       if(!p1)memory error();

       p2->next=p1; }

       while(1)

       { record n++; putstr(,,0x,s2,);

       if(flag==1)

       { gotoxy(,); printf("Record%d",record n); }

       do{ window(,,,,0x);

       if(!getstring(,,))goto out ;

       }while(!getstring number());

       p1->num=student number;

       do{ if(!getstring(,,)) goto out;

       }while(!string name());

       strcpy(pi->name,student name);

       for(i=1;i<=3;i++)

       { do{ window(+(i-1)*8,,0x);

       if(!getstring(+(i-1)*8,,5)) gotoout;

       }while(!string score());

       if(i==1)p1->h maths=student score;

       if(i==2)pi->english=student score;

       if(i==3)p1->c=student score; }

       p1->sum=0.0; p1->s num=0;

       if(flag==2){ record n--;goto out;}

       p2=p1;

       p1=(struct student*)malloc(LEN);

       if(!p1)memory error();

       p1->next=0; p2->next=p1; }

       out: cur hide(); window(,,,,0x1e);

       if(flag==1) { if(head==p1)head=0; free(p1); p2->next=0; info(1); record n--; }

       menu x yes=1; main menu 1();

       }

       /*查看是否有该成绩*/

       struct student* search(int flag)

       { struct student8pa,*pb; if(head==0)return(0); pb=pa=head;

       if(flag==1)

       { if(head->num==student number) return(head-1);

       do{ if(pa->num==student number) return(pb);

       pb=pa; pa=pb->next;} while(pa!=0); }

       return (0);

       }

       /*查询,删除,查询查询修改对话框*/

       struct student*msg box(int which)

       { int flag; int key; char*p="<-A B->"; menu window(,源码源码,,); gotoxy(,);

       printf("Number OR Name"); window(,,,,0x); gotoxy(,);

       printf(" | "); gotoxy(,);

       switch(which)

       { case 1:printf("Delete");break;

       case 2:printf("Update");break;

       case 3:printf("Query");break; }

       do{ while(!key pressed())

        now time();

       key=get key(); if(key==KEY A) { flag=1;break;}

       if(key==KEY B) { flag=2;break;} printf("\");

       }while(1);

       putstr(,,0x,p,7);

       if(flag==1)

       { do{

       gotoxy(,); printf(" | "):

       if(!getstring(,,)) goto out;

       }while(!string number());

       window(,,,,0x1e); return(search(1)); }

       else

       { do{ gotoxy(,); printf(" | ");

       if(!getstring(,,)) goto out;

       }while(!string name());

       window(,,,,0x1e); return(0);}

       /*删除记录*/

       void delete(void)

       { struct student*pa,*pb; pb=msg box(1); if(pb==0)info(3);

       else

       { if(pb==(head-1))

       { pb=head; if(pb->next==0) head=0;

       else head=pb->next; }

       else

       { if(pb->next->next==0) { pb->next=pa; } }

       record n--; info(2); }}

       /*删除记录*/

       void update(void)

       { int i; struct student*p; i=record n; p=msg box(2;

       if(p==0)info(3);

       else

       { input(2);

       if(i==record n)

       { if(p==(head-1)){

       head->num=p1->num; strcpy(head->name,p1->name);

       head->h maths=p1->h maths; head->english=p1->english;

       head->c=p1->c; free(p1); p2->next=0; }

       else { p->next->num=p1->num; strcpy(p->next->name,p1->name);

       p->next->h maths=p1->h maths; p->next->english=p1->english;

       p->next->c=p1->c; free(p1); p2->next=0; }

       info(4); }

       else { record n--;p2->next=0;free(p1);info(5);} }}

       /*查询成绩*/

       void query(void)

       { struct student*p,*pa,*pb; int key ,flag,i,j;

       char*str="NO. Name H matns English C\\C++ Sum S NO.";

       char*sm="NO. Name h maths English C\\C++ (who fails)";

       menu window(,,,); gotoxy(,); printf("Find Fail");

       putchar(,,'A',0xe4); putchar(,,'B',0xe4);

       do{ if(!key pressed()) now time();

       key=get key();

       if(key==KEY A){ flag=1;break;}

       if(key==KEY B){ flag=2;break;}

       printf("\"); }while(1);

       window(,,,,0x1e); if(flag==1)

       { p=msg box(3); if(p==0) info(3);

       else{ window(6,5,,,0x0e); window(5,4,,,0x5e); window(6,5,,,0x0e);

       putstr(,4,0x5a,str,); gotoxy(6,6);

       if(p!=(head-1)){ pa=p->next;p=pa;}

       else p=head;

       printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\

       p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);

       }}

       if(flag==2)

       { window(6,5,,,0x0e);window(5,4,,,0x5e); window(6,5,,,0x0e);

       putchar(,4,0x5a,sm,); if(head)

       { pa=head; j=0;

       do{ j++; i=0; window(6,5,,,0x0e); gotoxy(,);

       printf("Page%d",j);

       do

       { if(pa->c<||pa->h maths<||pa->english<)

       { gotoxy(6,6+i); i++;

       printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\

       p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}

       pb=pa; pa=pb->next; }while(i!=&&pa!=0);

       while(!key pressed()) now time();

       get key(); }while(pa!=0);

       goto out;}}

       while(!key pressed())

       now time();get key();

       out:window(5,4,,,0x1e);}

       /*成绩排名*/

       void sort(void)

       { int i,j,n,flag; struct student*pa=0,*pb=0;

       struct student*p[],*pmin;

       char*str="NO. Name H maths English C\\C++ Sum S NO.";

       window(6,5,,,0x0e); window(5,4,,,0x5e); window(6,5,,,0x0e);

       putstr(,4,0x5a,str,); window(,,,,0x5b);

       if(head!=0)

       { i=0; pb=pa=head;

       do

       { p[i]=pa; i++; pa->sum=pa->h maths+pa->english+pa->c;

       pb=pa; pa=pb->next; }while(pa!=0);

       for(n=record n-1,i=0;i<n;i++)

       { flag=0;

       for(j=0;j<n-i;j++)

       if(p[j]->sum<p[j+1]->sum)

       { pmin=p[j]; p[j]=p[j+1]; p[j+1]=pmin; flag=1; }

       if(flag==0)break; }

       head=pb=pa=p[0]; head->s sum=1;

       if(record n>1)

        for(i=1;i<record n;i++) { pa->s sum=i; pb=pa; pa=pb->next=p[i];}

       p2=p1=p[record n-1]; p1->s sum=record n;

       p1->next=0; pb=pa=head;

       j=0;

       do{

       j++;i=0; window(6,5,,,0x0e); gotoxy(,); printf("Page%d",j);

       do

       { gotoxy(6,6+i); i++;

       printf("%d%s%8.1f%9.1f%9.1f%9.1f%6d\n",\

       p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}

       pb=pa; pa=pb->next; }while(i!=&&pa!=0);

       while(!key pressed()) now time();

       get key(); }while(pa!=0);

       goto out;}

       while(!key pressed())

       now time();get key();

       out:window(5,4,,,0x1e);}

       /*输入文件名*/

       int input filename(int m)

       { char*p; int fp; menu window(,,,);

       window(,,,,0x);

       gotoxy(,); printf("File name");

       if(!getstring(,,)) goto no;

       if(key buf[1]==0) goto no;

       p=key buf+2; key buf[key buf[1]+2]='\0';

       if(fp=fopen(p,"rb+"))==0)

       { if(m==2) goto no; if(fp=fopen(p,"wb+"))==0 goto no; }

       fclose(fp); strcpy(filename,p);

       yes: window(,,,,0x1e);

       return(1);

       no: window(,,,,0x1e);

       return(0);

       }

       /*新建文件*/

       void new file(void)

       { int fp;

       if(input filename(1)==0) info(9;

       else

       { main menu 2(); free data(); fp=fopen(filename,"wb+"); fclose(fp); info(); }

       }

       /*打开文件*/

       void open file(void)

       { struct student*pa,*pb; int fp;

       if(input filename(2)==0)info(6);

       else

       { free data(); head=pb=pa=(struct student*)malloc(LEN); fp=fopen(filename,"rb+";

       fread(&pa->num,LEN,1,fp);}

       info(8); fclose(fp); input(1); }}

       /*保存文件*/

       void save fiel(void)

       { struct student8pa,*pb; int fp;

       if((fp=fopen(filename,"rb+"))==0) fp=fopen(filename,"wb+");

       pb=pa=head;

       if(fp!=0&&head!=0)

       { do{ fwrite(&pa->num,LEN,1,fp); pb=pa; pa=pb->next;}while(pa!=0);

       fclose(fp); }

       info(7);

       }

       void about me(void)

       { int i; char*title="About Me"; char*str[]={ " I'M A BIG.BIG WORLD. "};

       menu window(,5,,); putstr(,5,0x,title,);

       for(i=0;i<;i++)putstr(,6+i,0x,str[i],);

       while(!key pressed()) now time();

       get key(); window(,5,,,0x1e);

       }

        system("PAUSE");

        return EXIT_SUCCESS;

       }

go-iptables功能与源码详解

       介绍iptables之前我们先搬出他的父亲netfilter,netfilter是最新基于 Linux 2.4.x或更新的内核,提供了一系列报文处理的开奖开奖大金山星际源码能力(过滤+改包+连接跟踪),具体来讲可以包含以下几个功能:

       其实说白了,名单名单netfilter就是查询查询操作系统实现了网络防火墙的能力(连接跟踪+过滤+改包),而iptables就是源码源码用户态操作内核中防火墙能力的命令行工具,位于用户空间。最新快问快答,开奖开奖为啥计算机系统需要内核态和用户态(狗头)。名单名单

       既然netfilter是查询查询对报文进行处理,那么我们就应该先了解一下内核是源码源码如何进行收发包的,发生报文大致流程如下:

       netfilter框架就是最新作用于网络层中,在一些关键的报文收发处理路径上,加一些hook点,可以认为是一个个检查点,有的在主机外报文进入的位置(PREROUTING ),有的在经过路由发觉要进入本机用户态处理之前(INPUT ),有的在用户态处理完成后发出的地方(OUTPUT ),有的在报文经过路由并且发觉不是本机决定转发走的位置(FOWARD ),有的在路由转发之后出口的位置(POSTROUTING ),每个检查点有不同的规则集合,这些规则会有一定的优先级顺序,如果报文达到匹配条件(五元组之类的)且优先级最高的规则(序号越小优先级越高),内核会执行规则对应的动作,比如说拒绝,放行,手机回租贷源码记录日志,丢弃。

       最后总结如下图所示,里面包含了netfilter框架中,报文在网络层先后经过的一些hook点:

       报文转发视角:

       iptables命令行工具管理视角:

       规则种类:

       流入本机路径:

       经过本机路径:

       流出本机路径:

       由上一章节我们已经知道了iptables是用户态的命令行工具,目的就是为了方便我们在各个检查点增删改查不同种类的规则,命令的格式大致如下,简单理解就是针对具体的哪些流(五元组+某些特定协议还会有更细分的匹配条件,比如说只针对tcp syn报文)进行怎样的动作(端口ip转换或者阻拦放行):

       2.1 最基本的增删改查

       增删改查的命令,我们以最常用的filter规则为例,就是最基本的防火墙过滤功能,实验环境我先准备了一个centos7的docker跑起来(docker好啊,实验完了直接删掉,不伤害本机),并通过iptables配置一些命令,然后通过主机向该docker发生ping包,测试增删改查的filter规则是否生效。

       1.查询

       如果有规则会把他的序号显示出来,后面插入或者删除可以用 iptables -nvL -t filter --line​

       可以看出filter规则可以挂载在INPUT,FORWARD,OUTPUT检查点上,并且兜底的规则都是ACCEPT,也就是没有匹配到其他规则就全部放行,这个兜底规则是可以修改的。 我们通过ifconfig查看出docker的ip,然后主机去ping一波:​

       然后再去查一下,会发现 packets, bytes ---> 对应规则匹配到的报文的个数/字节数:

       2. 新增+删除 新增一条拒绝的报文,我们直接把docker0网关ip给禁了,golang nsq源码分析这样就无法通过主机ping通docker容器了(如果有疑问,下面有解答,会涉及docker的一些小姿势): iptables -I INPUT -s ..0.1 -j DROP (-I不指定序号的话就是头插) iptables -t filter -D INPUT 1​

       可见已经生效了,拦截了ping包,随后我删除了这条规则,又能够ping通了

       3. 修改 通过-R可以进行规则修改,但能修改的部分比较少,只能改action,所以我的建议是先通过编号删除规则,再在原编号位置添加一条规则。

       4. 持久化 当我们对规则进行了修改以后,如果想要修改永久生效,必须使用service iptables save保存规则,当然,如果你误操作了规则,但是并没有保存,那么使用service iptables restart命令重启iptables以后,规则会再次回到上次保存/etc/sysconfig/iptables文件时的模样。

       再使用service iptables save命令保存iptables规则

       5. 自定义链 我们可以创建自己的规则集,这样统一管理会非常方便,比如说,我现在要创建一系列的web服务相关的规则集,但我查询一波INPUT链一看,妈哎,条规则,这条规则有针对mail服务的,有针对sshd服务的,有针对私网IP的截取网站页面源码,有针对公网IP的,我这看一遍下来头都大了,所以就产生了一个非常合理的需求,就是我能不能创建自己的规则集,然后让这些检查点引用,答案是可以的: iptables -t filter -N MY_WEB

       iptables -t filter -I INPUT -p tcp --dport -j MY_WEB

       这就相当于tcp目的端口的报文会被送入到MY_WEB规则集中进行匹配了,后面有陆续新规则进行增删时,完全可以只针对MY_WEB进行维护。 还有不少命令,详见这位大佬的总结:

       回过头来,讲一个关于docker的小知识点,就是容器和如何通过主机通讯的?

       这就是veth-pair技术,一端连接彼此,一端连接协议栈,evth—pair 充当一个桥梁,连接各种虚拟网络设备的。

       我们在容器内和主机敲一下ifconfig:

       看到了吧,容器内的eth0和主机的vetha9就是成对出现的,然后各个主机的虚拟网卡通过docker0互联,也实现了容器间的通信,大致如下:

       我们抓个包看一哈:

       可以看出都是通过docker0网关转发的:

       最后引用一波 朱老板总结的常用套路,作为本章结尾:

       1、规则的顺序非常重要。

       如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的复古180传奇源码规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。

       2、当规则中有多个匹配条件时,条件之间默认存在“与”的关系。

       如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。

       3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。

       4、当IPTABLES所在主机作为网络防火墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。

       5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。

       3. go-iptables安装

       go-iptables是组件库,直接一波import " github.com/coreos/go-ip..."​,然后go mod tidy一番,就准备兴致冲冲的跑一波自带的测试用例集,没想到上来就是4个error:

       这还了得,我直接去go-iptables的仓库issue上瞅瞅有没有同道中人,果然发现一个类似问题:

       虽然都是test failures,但是错的原因是不一样的,但是看他的版本是1.8的,所以我怀疑是我的iptables的版本太老了,一个iptables -v看一眼:

       直接用yum update好像不能升级,yum search也没看到最新版本,看来只能下载iptables源码自己编译了,一套连招先打出来:

       不出意外的话,那就得出点意外了:

       那就继续下载源码安装吧,然后发现libmnl 又依赖libnftnl ,所以直接一波大招,netfilter全家桶全安装:

       Finally,再跑一次测试用例就成功了,下面就可以愉快的阅读源码了:

       4. 如何使用go-iptables

       5. go-iptables源码分析

       关键结构体IPTables

       初始化函数func New(opts ...option) (*IPTables, error) ,流程如下:

       几个重要函数的实现:

       其他好像也米有什么,这里面就主要介绍一下,他的命令行执行是怎么实现的:

       6. Reference

黑名单怎么样设置?

       若想在新浪博客中限制某人访问,需采用代码方法实现。

       具体做法如下:

       1. 进入管理博客界面,选择个人首页维护。

       2. 选择已有内容的面板,如音乐面板或时钟面板,勾选“显示源代码”。

       3. 将代码复制粘贴到原有代码后面,然后点击保存,这相当于为博客上锁。

       或

       1. 进入发表文章框。

       2. 写入文章内容,勾选“显示源代码”。

       3. 将代码复制粘贴至文章代码最后,去掉勾选,点击发表文章,此时文章上锁。

       通过以上操作,实现对指定用户的访问限制。

java——ip黑名单设计方案(大全+实战)

       今天,我们将设计一个IP黑名单功能,以阻止像DDoS这样的非法IP。

       环境:使用SpringBoot和JDK,详细源码请访问:gitee.com/xue-shangren/...。首先,我们自定义拦截器,将黑名单IP存入resources下的txt文件中,通过一个bean加载文件内容,并存储于一个Set中。然后在拦截器中检查IP,若在黑名单Set中则拦截。

       接下来,创建blackList.txt文件,包含黑名单IP,如图所示。在IpService类的构造函数中加载txt文件内容,并提供Set的访问方式,用于检查IP。创建自定义黑名单IP拦截器,记录日志。在拦截器中从request获取真实IP,检查是否在Set中,存在则拦截。

       注册自定义拦截器,实现对非法IP的第一层处理。注意,过滤器依赖于Servlet容器,不能获取IOC容器的bean,因此在SpringBoot中通常不使用自定义过滤器处理这种问题。然而,可以通过ServletContext保存黑名单列表,使用监听器加载文件并在请求时手动检查IP。

       将黑名单IP保存到YML文件中,通过@ConfigurationProperties注解获取blackips。在SecurityConfig中根据request匹配黑名单,拦截非法IP。缺点是YML文件静态,不能实时更新黑名单,一般不推荐使用。

       jmx注册MBean并将其注册到JMX中,动态配置黑名单IP。通过编写一个MBean并使用Spring注册,可以在运行中添加或删除IP。该方案优于重启项目更新YML配置,类似热更新,可在运维平台手动操作。不足之处是仍需手动操作。

       在分布式架构中,考虑使用统一网关鉴权或中心化黑名单存储。对于中心化存储,需要注意节点间同步、持久化存储及各节点的缓存机制。同时,使用消息队列实现异步操作中心黑名单,避免同步阻塞业务。

       以上内容参考了:blog.csdn.net/qq_...、blog.csdn.net/gycsdn/...、chatgpt关键词:java黑名单设计、spring security黑名单设计、ConfigurationProperties代替txt文件的黑名单设计、liaoxuefeng.com/wiki/...

PHP小旋风站群系统源码

       本站群系统在原有基础上进行了多项升级,包括引入MIP模型,实现百度MIP推送,并添加了独创新版模板干扰标签,提高了系统安全性。

       系统新增了防CC攻击模块和user-agent黑名单功能,可以屏蔽特定特征的UA。同时,增加了自定义标题库、ASCII特殊码插入等功能,并提供了地址伪静态开关选项。

       为了提高用户体验,系统对内容库txt文件进行了优化,实现了删除后URL跳过此文件的功能。此外,系统还自动替换了img标签为mip标签,并增加了系统修复工具,以解决特殊情况下网站可能出现的错误。

       系统还提供了错误页设置功能,并优化了库文件更新后的即时更新。后台采集句子类型增加了每行放置句子数量的设置,进一步优化了系统性能。

       此外,系统新增了屏蔽空user-agent访问的功能,并可以获取使用cloudflare CDN后的IP。泛域名前缀增加了支持标签,可使用标签生成前缀。系统还增加了自定义域名前缀屏蔽页功能,并优化了CC防御模块。

       文章库内容模式支持插入关键词,提供了一键提取全站链接接口。同时,修复了自定义域名TKD的一个BUG和固定关键词标签变化问题。