前几天,这个小博客一直被群里某大佬盯上攻击。由于我开启了 CDN,对方无法获取我的源 IP,于是转而对我的网站发起了大规模的 CC 攻击,搞得我是措手不及。
由于攻击来源的 IP 太多,手动拉黑几乎不可能完成。刚好想起百度云加速的智能防 CC 功能,它基于五秒盾的原理。我用 PHP 模拟了百度云加速的防 CC 机制,写了一个简单的防护脚本,今天分享给大家。
PHP 防 CC 代码
php 代码:<?php
define('SYSTEM_ROOT', dirname(preg_replace('@\\(.*\\(.*$@', '', preg_replace('@\\(.*\\(.*$@', '', __FILE__))) . '/');
session_start();
date_default_timezone_set('Asia/Shanghai');
header('Content-Type: text/html; charset=UTF-8');
function getspider($useragent = '') {
if (defined('CC_Defender') && CC_Defender == 2) return false;
if (!$useragent) {
$useragent = $_SERVER['HTTP_USER_AGENT'];
}
$useragent = strtolower($useragent);
$spiders = [
'baiduspider', 'googlebot', 'soso', 'bing', 'yahoo', 'sohu-search',
'sogou', 'youdaobot', 'yodaobot', 'robozilla', 'msnbot', 'lycos',
'ia_archiver', 'archive.org_bot', 'sitebot', 'mj12bot', 'gosospider',
'gigabot', 'yrspider', 'jikespider', 'addsugarspiderbot', 'testspider',
'etaospider', 'wangidspider', 'foxspider', 'docomo', 'yandexbot',
'ezooms', 'sinaweibobot', 'catchbot', 'surveybot', 'dotbot', 'purebot',
'ccbot', 'mlbot', 'adsbot-google', 'ahrefsbot', 'spbot', 'augustbot'
];
foreach ($spiders as $spider) {
if (strpos($useragent, $spider) !== false) return $spider;
}
return false;
}
if ($_GET['rand'] && $_SESSION['rand_session'] != $_GET['rand']) {
header('Content-Type: text/html; charset=UTF-8');
exit('<b>浏览器不支持 COOKIE 或访问异常!</b>');
}
if (!$_SESSION['rand_session']) {
if (!getspider()) {
$rand_session = md5(uniqid() . rand(1, 1000));
$_SESSION['rand_session'] = $rand_session;
exit("<!DOCTYPE HTML>
<html>
<head>
<meta charset=\"UTF-8\"/>
<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1\" />
<title>安全检查中...</title>
<script>
var i = 5;
var intervalid;
intervalid = setInterval(\"fun()\", 1000);
function fun() {
if (i == 0) {
window.location.href = \"?{$_SERVER['QUERY_STRING']}&rand={$rand_session}\";
clearInterval(intervalid);
}
document.getElementById(\"mes\").innerHTML = i;
i--;
}
</script>
<style>
html, body {width: 100%; height: 100%; margin: 0; padding: 0;}
body {background-color: #ffffff; font-family: Helvetica, Arial, sans-serif; font-size: 100%;}
h1 {font-size: 1.5em; color: #404040; text-align: center;}
p {font-size: 1em; color: #404040; text-align: center; margin: 10px 0 0 0;}
#spinner {margin: 0 auto 30px auto; display: block;}
.attribution {margin-top: 20px;}
</style>
</head>
<body>
<table width=\"100%\" height=\"100%\" cellpadding=\"20\">
<tr>
<td align=\"center\" valign=\"middle\">
<noscript><h2>请开启浏览器的 JavaScript 功能并刷新页面</h2></noscript>
<h1><span>浏览器安全检查中...</span></h1>
<p>该过程自动完成</p>
<p>请稍候,还剩 <span id=\"mes\">5</span> 秒</p>
</td></tr></table>
</body></html>");
}
}
?>
将以上 PHP 代码添加到网站头部的 PHP 文件中(如 index.php
或其他主入口文件),即可启用防护。这样,只有通过安全验证并获得 COOKIE 的浏览器才能正常访问你的网站。
注意事项
- 该方法仅适用于较小规模的攻击(如普通 CC 攻击)。
- 如果遇到大量分布式肉鸡攻击(如 DDoS),此代码可能无能为力,建议使用专业的抗 DDoS 服务。
- 遇到攻击时,保持低调、冷静处理,避免挑衅。