最近服务器被无耻的人一致攻击了只能在Nginx服务器上屏蔽一些IP

估计全球的IP都在攻击我网站的xmlrpc.php,于是把这个文件屏蔽,但是还是遭到恶意攻击,实在无聊,只能屏蔽掉这些IP地址;

1.查找要屏蔽的ip;

1
awk ‘{print $1}’  /www/log/nginx/log/lanxinbase.log |sort |uniq -c |sort -n

lanxinbase.log 为蓝芯科技网站的日志文件;

 

会到如下结果,前面是ip的访问次数,后面是ip,很明显我们需要把访问次数多的ip并且不是蜘蛛的ip屏蔽掉,本例当中我们屏蔽掉:

1
2
3
4
5
6
7
1 163.172.66.70
1 164.132.161.5
1 203.208.60.203
1 220.181.108.117
1 68.180.228.100
11 118.192.151.214
195 27.10.12.69
395 191.96.249.53

2.在nginx的安装目录下面,新建屏蔽ip文件,命名为blockip.conf,以后新增加屏蔽ip只需编辑这个文件即可。 加入如下内容

1
deny 191.96.249.53;

3.在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit_except语句块,需要注意相对路径,本例当中nginx.conf,blocksip.conf在同一个目录中。

1
include blockip.conf;

4.重启一下nginx的服务:service nginx restart 就可以生效了。

 

高级用法:

屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 屏蔽单个ip访问
deny IP;
# 允许单个ip访问
allow IP;
# 屏蔽所有ip访问
deny all;
# 允许所有ip访问
allow all;
#屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
#屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
#屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24

如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
那需要你在blockip.conf中这样写

1
2
3
allow 1.1.1.1;
allow 1.1.1.2;
deny all;

单独网站屏蔽IP的方法,把include blocksip.conf; 放到网址对应的在server{}语句块,
所有网站屏蔽IP的方法,把include blocksip.conf; 放到http {}语句块。

Git 基本操作

一、安装环境
CentOS: yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

Debian: apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
二、安装Git
CentOS: yum install git-core

Debian: apt-get install git-core

三、创建基础仓库
mkdir /git/test
cd /git/test

git init –bare –shared //初始化基础仓库

四、客户端操作
git clone root@192.168.1.199:/git/test //克隆仓库

然后复制文件到 test 目录

git add * //添加所有文件
git commit -m “初始化版本”
git push //推送到服务器上
五、其他
git add [*|file] //将该文件添加到缓存
git log [–oneline] //使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
git diff [file name][–cached] //执行 git diff 来查看执行 git status 的结果的详细信息。
git clone [url] //使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。
git init //用 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做,完全是本地化的。
git status //查看在你上次提交之后是否有修改。
git commit [-am] //将缓存区内容添加到仓库中。
git reset HEAD //用于取消已缓存的内容。
git rm [filename] //会将条目从缓存区中移除
git mv [filename] //命令做得所有事情就是 git rm –cached 命令的操作

nginx网站被持续攻击最终防攻策略

上上个月架构全部迁移上云以后,总的来说比较稳定,业务量也上来,可爱的坏人也来了,7X24小时不停恶意攻击我的网站,第一次收到报警是网站流入流量1分钟以内连续3次超过1000000bps,换算下1M/s秒,平时没那么大流量的啊,当时刚好在朋友家玩,于赶紧开本本连vpn检查,发现全是访问同一个页面的请求,而且是正常访问http 200,应该是被恶意攻击了。

发现问题:
发现问题第一反应,赶紧将请求地址截图发给开发们看看,问问这个具体是什么?
最后得知是为短信验证码接口,据后来统计在被持续攻击的一个多小时中损失16000多条短信。

100+ WEB开发工具和资源,热门的都在了

作为Web开发者,这是好的时代,也是坏的时代。Web开发技术也在不断变化。虽然很令人兴奋,但是这也意味着Web开发人员需要要积极主动的学习新技术和新的编程语言,并愿意和渴望接受新的挑战,以适应变化。新的挑战可能会包括一些开发上的要求,如利用适应现有的框架来满足业务需求。测试一个网站,能从中知道出了哪些技术上的问题,并且我们针对这些问题进行优化和消除。便于后端的开发进程加快和测试。所以我们列出了完整的web开发所需要的工具和资源,助力开发者提高开发效率!学不止步,让我们努力成为一个优秀的开发者!

Web开发工具和资源整合

在这里说声抱歉,对于开发者开发使用的工具,我们无法一一囊括,这里是选取较为热门的工具和资源作为范例。我们希望能从中找到适合自己的工具助力自己的开发!

注:工具和资源排序不分先后。

android开发:Application、ActivityResult详解

先说说Application这个类吧,这个累在整个APP中是唯一不变的,也就是说除非APP call exit(0);否则,它的数据都是有效,相当于其他语言的超全局变量吧!

要实现Application类,首先,我们需要创建一个类:

package com.test.testapp;

import android.app.Application;

/**
 * Created by Alan on 2016/08/09 0009.
 */
public class myApplication extends Application {

    private String mUser_name;//用户名
    private String mUser_pwd;//密码

    public void onCreate() {
        super.onCreate();
        setmUser_name(null);
        setmUser_pwd(null);
    }

    public String getmUser_name(){
        return mUser_name;
    }

    public String getmUser_pwd( ){
        return mUser_pwd;
    }

    public void setmUser_name(String u){
        mUser_name = u;
    }

    public void setmUser_pwd(String u){
        mUser_pwd = u;
    }

}

上面代码,我们实现了设置用户名跟密码已经取用户名跟密码的方法,为了简单的演示,所以使用了String,如果在应用编程中,我们应该是指定其他数据类型或者是对象才对;

接着我们需要在manifest描述文件中制定我们application的类名字,只需要增加:android:name=”.myApplication”就可以了;

QQ截图20160809121937

 

创建了一个Application类,那么我们来进行初始化:

myApplication app = (myApplication) getApplication();//这一句放在MainActivity的onCreate()方法中,取得了Application类对象,然后我们调用Application类中的setmUser_name跟setmUset_pwd的方法设置用户名跟密码:
app.setmUser_name("test");
app.setmUser_pwd("123456");

接着我们会绑定一个按钮事件,使用Intent打开第二个Activity,然后使用这个Activity进行Application数据读取:
Button but = (Button) findViewById(R.id.but1);
but.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MainActivity.this,twoActivity.class);
        startActivityForResult(intent,101);
    }
});
QQ截图20160809121924

这里面我们使用的是startActivityForResult,因为我们在调用登陆窗口的时候可能需要数据返回,所以使用startActivityForResult是一个明智的选择;

 

在第二个Activity中,我们首先是读取Application初始化的值(为了演示使用):

app = (myApplication) getApplication();

Log.d(TAG,"2User_name:"+app.getmUser_name());
Log.d(TAG,"2User_pwd:"+app.getmUser_pwd());

接着我们绑定一个回调的按钮(模拟登陆成功的按钮):
Button but = (Button) findViewById(R.id.but1);
but.setText("返回");
but.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent();
        intent.putExtra("user",app.getmUser_name());
        intent.putExtra("pwd",app.getmUser_pwd());
        intent.putExtra("msg","登陆成功了");

        app.setmUser_name("2:test");
        app.setmUser_pwd("2:123456");
        setResult(100,intent);
        finish();
    }
});

我们改写MainActivity中的onActivityResult方法,用于数据处理:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode,resultCode,data);

    Log.d(TAG,"requestCode:"+requestCode);
    Log.d(TAG,"resultCode:"+resultCode);
    Log.d(TAG,"user:"+data.getStringExtra("user")+"\tpwd:"+data.getStringExtra("pwd")+"\tmsg:"+data.getStringExtra("msg"));


    Log.d(TAG,"User_name1:"+app.getmUser_name());
    Log.d(TAG,"User_pwd1:"+app.getmUser_pwd());
    /*
    * 可以在这里写一些逻辑处理代码
    * */

}

以下是日志输出:

QQ截图20160809121859

源代码:链接:http://pan.baidu.com/s/1gfhpAb5 密码:nt49

15354555657115
 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |