經(jīng)常有站長遇到網(wǎng)站被人惡意刷流量,api接入口被人惡意刷新等CC攻擊問題。
想要解決,奈何口袋里又沒錢買不起高防產(chǎn)品怎么辦?
我們可以通過代碼的方式自定義訪問頻率時間限制解決那些惡意攻擊。
優(yōu)勢:
- 可以自由設(shè)置訪問頻率時間,可以以月為時間長度
- 簡單易用,無論你懂不懂 PHP 開發(fā),只要會復(fù)制粘貼就行。
- Memcached 內(nèi)存緩存技術(shù),高性能,高并發(fā)。
- 精準(zhǔn)無誤,0 誤封。
- 能防護(hù) QPS 10000 以內(nèi)的CC攻擊,看機(jī)器配置,有可能更高。
- 支持范圍較廣,直接你網(wǎng)站支持 PHP 就行。
- 源碼簡單,可自行修改,可以套自己喜歡的前端模板主題。
要求:
- PHP 版本 ≥ 7.2
- PHP 需安裝 Memcached 擴(kuò)展
- Memcached ≥1.6
使用方法
以下開源代碼添加到你網(wǎng)站核心文件中,相當(dāng)于你網(wǎng)站任何頁面都會引用的一個文件,類似于:config.php
WordPress 網(wǎng)站添加到根目錄的 /index.php
頭部即可,即控制所有的頁面訪問,如果想要控制單獨(dú)某個頁面,只需要將此代碼放到此頁面的 PHP 內(nèi)即可。
其他 PHP 網(wǎng)站根據(jù)你的程序邏輯決定。
<?php
ini_set("display_errors", "Off");
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
extension_loaded('memcached') or die('memcached擴(kuò)展未安裝!');
$logPath = $_SERVER['DOCUMENT_ROOT'] . '/waf/waf.log'; //日志記錄文件保存路徑,$_SERVER['DOCUMENT_ROOT']是網(wǎng)站根目錄
$fileht = $_SERVER['DOCUMENT_ROOT'] . '/waf/ban.log'; //被拉黑IP記錄文件保存路徑
if (!file_exists($logPath)) {
@mkdir($_SERVER['DOCUMENT_ROOT'] . '/waf/', 0777, true);
@file_put_contents($logPath, '');
@file_put_contents($fileht, '');
}
$allowtime = 2; //防刷新時間(秒)
$allownum = 5; //防刷新次數(shù)(比如2秒5次,超過就警告)
$allowRefresh = 10; //在此警告次數(shù)之后拉黑IP
$bantime = 600; //封禁時間,超時自動解封(秒)
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
$uri = $_SERVER['PHP_SELF'];
$cache = new Memcached();
$cache->addServer('127.0.0.1', '11211') or die('memcached連接失??!');
$inban = $cache->get('waf-ban-' . $ip);
if ($inban) {
header("HTTP/1.1 403 Forbidden");
exit('<h1>403 Forbidden 非法訪問</h1>
<p>你的請求似乎不符合常理,已被服務(wù)器防火墻攔截,如有疑問請聯(lián)系管理員zhujib.com</br>如果你在開發(fā)測試過程中超頻被封IP,請等待' . ($bantime / 60) . '分鐘后自動解封</br>你的IP:' . $ip . '</p>');
}
$wafarr = $cache->get('waf-' . $ip);
if (!$wafarr) {
$wafarr = ['path' => $uri, 'time' => time() + $allowtime, 'sum' => 1, ];
$cache->set('waf-' . $ip, $wafarr, time() + $allowtime);
} else {
if ($wafarr['sum'] > $allownum) {
$wafsum_arr = $cache->get('waf-sum-' . $ip);
if (!$wafsum_arr) {
$wafsum_arr = ['sum' => 1, ];
$cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
} else {
if ($wafsum_arr['sum'] > $allowRefresh) {
$cache->set('waf-ban-' . $ip, 1, time() + $bantime);
file_put_contents($fileht, $ip . "\n", FILE_APPEND);
} else {
$wafsum_arr['sum']++;
$cache->set('waf-sum-' . $ip, $wafsum_arr, time() + $bantime);
}
}
file_put_contents($logPath, $ip . '--' . date('Y-m-d H:i:s', time()) . '--' . $uri . "\n", FILE_APPEND);
header("HTTP/1.1 403 Forbidden");
exit("請求頻率QPS超過限制,請酌情訪問,多次提醒后會封禁IP!");
} else {
$wafarr['sum']++;
$cache->set('waf-' . $ip, $wafarr, $wafarr['time']);
}
}
該方法能防御市面上那些以高頻率請求的惡意CC攻擊,并不能100%防御所有CC攻擊,但對可以解決絕大多數(shù)小型CC攻擊了,如果有更高防御要求,建議購買性價比非常高的百度云加速或京東云星盾。相關(guān)鏈接