السلام عليكم ورحمة الله وبركاتة
أقدم لكم class يحمى من هجمات Flooding التى تعتمد على أستهلاك موارد كثيرة من السيرفر بكثرة الطلبات .
أعلم أن هناك أضافات تركب على السيرفر لهذا الغرض لاكن هذا حل يستخدم فى برامج php
فكرة class بسيطه يقوم بتخزين عناوين ip للمستخدمين على القرص الصلب واذا تجازوت طلبات المستخدم 50 طلب فى مدة أقل من أو تساوى 30 ثانية أى نص دقيقة يقوم بحجب الخدمة عن المستخدم لمدة زمنية بسيطة وبعد أنتهاء المدة يتصفح المستخدم الموقع مرة أخرى.
فى حال كان رقم 50 طلب فى نصف دقيقة غير ملائم لمحركات البحث ممكن زيادتوا لعدم حدوث مشاكل مع محركات البحث
يمكن أستدعاء هذا الكلاس فى كل البرامج المستخدمة فى الموقع ويتم أستدعائوا فى أول أستدعاء يستخدموا البرنامج مثال على منتديات vb يكون فى فايل
[PHP
require_once('./global.php');
[/PHP]
file:- global.php
كود PHP:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.0
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd.
<br />Search Engine Optimization by <a rel="nofollow" href="http://www.crawlability.com/vbseo/">vBSEO</a> 3.1.0
<br />Search Engine Optimization by <a rel="nofollow" href="http://www.crawlability.com/vbseo/">vBSEO</a> 3.1.0 All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/
require_once('/home/user/public_html/antiflooding.php');
file:- antiflooding.php
كود PHP:
<?php
/**
* Anti Flooding Class
*
* @link http://www.khdma.net
* @author Mostafa Moheyeldeen <info@khdma.net>
* @copyright 2009
* @version 1.0
*/
class antiflooding {
var $pathic;
function writef($x, $xx)
{
$file = fopen($x, 'w');
fputs($file, $xx);
fclose($file);
}
function cleanci($pc, $time)
{
$file = @file_get_contents($pc);
if ($file <= time() || $file == false)
{
$dirContent = scandir($this->pathic);
$ci = count($dirContent);
for($x = 0; $x <= $ci; $x++)
{
@unlink($rootDir.$dirContent[$x]);
}
$this->writef($pc, time() + $time);
}
}
function ip()
{
if (getenv('HTTP_CLIENT_IP'))
{
return getenv('HTTP_CLIENT_IP');
}
elseif (getenv('HTTP_X_FORWARDED_FOR'))
{
return getenv('HTTP_X_FORWARDED_FOR');
}
elseif (getenv('HTTP_X_FORWARDED'))
{
return getenv('HTTP_X_FORWARDED');
}
elseif (getenv('HTTP_FORWARDED_FOR'))
{
return getenv('HTTP_FORWARDED_FOR');
}
elseif (getenv('HTTP_FORWARDED'))
{
return getenv('HTTP_FORWARDED');
}
return $_SERVER['REMOTE_ADDR'];
}
function antiflooding()
{
$pathip = $this->pathic.$this->ip();
$time = time();
if ( is_file($pathip) )
{
$file = @file_get_contents($pathip);
$ex = explode(':', $file);
$res = ($time - $ex[0]);
if ($res >= 30)
{
unlink($pathip);
$fb = 1;
} elseif ($ex[1] >= 50)
{
// Page was not found:
header('HTTP/1.1 404 Not Found');
exit();
}
if ($res < 30)
{
$this->writef($pathip, $ex[0].':'.($ex[1] + 1));
}
} else {
$this->writef($pathip, $time.':1');
}
}
}
$flood = new antiflooding();
// path folder ip cache
$flood->pathic = '/home/user/public_html/cacheip/data/';
// Clear the cache for the duration ... Example 120 seconds = 2 Minute
$flood->cleanci('/home/user/public_html/cacheip/.clean', 120);
?>
أنشىء المسارات الأتية
Permission: 0777 > folder: /home/user/public_html/cacheip/data/
Permission: 0777 > file: /home/user/public_html/cacheip/.clean
ومن antiflooding.php عدل الأعدادات
كود PHP:
هنا يتم تخزين عنواين IP للمستخدمين
$flood->pathic = '/home/user/public_html/cacheip/data/';
كود PHP:
وهنا مدة حزف عناوين IP بعد مدة مثلا 120 ثناية = دقيقتين
فى حال كان عدد المستخدمين أكثر من 4000 فى الدقيقة فهناك حل أخر سا أناقشوا مرة أخرى
$flood->cleanci('/home/user/public_html/cacheip/.clean', 120);
السلام عليكم