PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : █ اسکریپت PHP مهار کننده حملات دیداس - PHP DDoS Protection



yastheme
April 8th, 2017, 15:32
با سلام،
اسکریپت زیر یک اسکریپت ساده جهت بلاک کردن آی پی ها بر اساس تعداد رکوئست ها بر ثانیه در PHP می باشد که قابلیت اضافه کردن به پروژه ها و پلاگین ها و CMS ها را دارد.
فقط نکته مهم اینکه این اسکریپت قرار نیست تمامی حملات DDoS را مهار کند و معجزه کند!
این اسکریپت زمانی کارآیی دارد که حملات لایه 7 با پروتکل http بر روی یک سایت در حال انجام باشد و حملات با تعداد آی پی های محدود باعث کندی سایت شده باشند و احتمالا اگر حمله نسبت به سخت افزار و منابع سرور، فدرتمند محسوب شود ممکن است قبل از اینکه این اسکریپت بخواهد کار خودش را بکند وب سرور با مشکل مواجه شود و سایت از دسترس خارج شود.
این توضیح از آن جهت بود که برخی دوستان ممکن است به صورت اشتباه منظور بنده را متوجه شوند و اگر نه برای حملات لایه 7 باید از سمت وب سرور و حتی قبل از آن حملات شناسایی و مهار شوند.

http://central-hosting.com/css/images/firewall_word_cloud.png


مقدار $r رکوئست های یک آی پی و متغیر $ps زمان بر حسب ثانیه است.
فرض اگر بخواهید که آی پی هایی که در طول 4 ثانیه اگر بیشتر از 8 رکوئست ارسال کرده اند را بلاک کنید باید مثل زیر باشد:


$r=8
$ps=4


دریافت کد کامل اسکریپت :


<?php
//M@soud Binaei
//Central-hosting.com
//**********
$r=5;
$ps=5;
//**********
session_start();


if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$ips=file('ip.txt');
foreach($ips as $ipbad)
{
if(trim($ipbad) == $ip){
header('HTTP/1.0 403 Forbidden');
echo'Blocked';
exit();
}
}

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $ps)) {
session_unset();
session_destroy();
$_SESSION['rec'] = 1;
}


if(!isset($_SESSION['rec']) || $_SESSION['rec']==0){
$_SESSION['rec'] = 1;
$_SESSION['LAST_ACTIVITY'] = time();
}else{
$_SESSION['rec']++;
}
if($_SESSION['rec']>=$r){
$file = 'ip.txt';
$current = file_get_contents($file);
$current .= $ip."\n";
file_put_contents($file, $current);
}

?>


نکته: یک فایل با نام ip.txt بسازید و سطح دسترسی آن را 777 قرار دهید. بلک لیست آی پی ها در این فایل ذخیره می شوند.

تشکر فراموش نشود ;)

tikweb.ir
April 8th, 2017, 15:46
پس همونطور که مشخصه میاد هربار چک میکنه اگر ایپی بازدید کننده داخل
ip.txt بود ارور 403 بهش میده
چطور میشه اسکریپت رو جوری داخل سایت قرار داد که در هر صفحه این مورد چک نشه و یک چیزی شبیه کوکی ذخیره بشه

چون اگر بازدید سایت زیاد باشه و در هر صفحه چک بشه به احتمال زیاد سایت رو دچار کندی میکنه

yastheme
April 8th, 2017, 15:51
پس همونطور که مشخصه میاد هربار چک میکنه اگر ایپی بازدید کننده داخل
ip.txt بود ارور 403 بهش میده
چطور میشه اسکریپت رو جوری داخل سایت قرار داد که در هر صفحه این مورد چک نشه و یک چیزی شبیه کوکی ذخیره بشه

چون اگر بازدید سایت زیاد باشه و در هر صفحه چک بشه به احتمال زیاد سایت رو دچار کندی میکنه


یکی از دلایلی که از فایل TXT به جای مثلا دیتابیس استفاده شده سرعت خواندن و نوشتن بالای اون هست،
این مورد تاثیر بسیار بسیار کمی در پردازش php دارد البته تا زمانی که فایل ip.txt سبک باشد و اگر تعداد آی پی ها مثلا به چند هزار تا برسه طبیعتا کمی توی سرعت خودشو نشون میده که این هم باز به هارد یا منابع سرور بستگی داره. که بهتره یکبار آی پی های بلاک شده توی این فایل توسط CSF یا htaccess بلاک بشه و بعد فایل ip.txt خالی بشه

us12
April 8th, 2017, 18:57
قرار نیست که اتکر هر بار با یک sessionID ثابت صفحه را لود کند که توسط این اسکریپت بتوان شناسایی اش کرد ...



if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $ps)) {


اتکر هر بار یک sessionID جدید داخل هدر به سایت ارسال میکنه ، یعنی عملا همیشه مقدار $_SESSION['LAST_ACTIVITY'] برابر با time() و مقدار $_SESSION['rec'] برابر با1 است...

yastheme
April 8th, 2017, 21:24
قرار نیست که اتکر هر بار با یک sessionID ثابت صفحه را لود کند که توسط این اسکریپت بتوان شناسایی اش کرد ...



if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $ps)) {


اتکر هر بار یک sessionID جدید داخل هدر به سایت ارسال میکنه ، یعنی عملا همیشه مقدار $_SESSION['LAST_ACTIVITY'] برابر با time() و مقدار $_SESSION['rec'] برابر با1 است...

بله دقیقا، این مورد در حملات DDoS رایج است اما در برخی از حملات که معمولا کلودفلر یا سرویس های دیگر را بایپس می کنند و از آن عبور می کنند و به سرور هاستینگ میرسند به این دلیل است که کوکی توسط همه بات های یک بات نت پذیرفته می شود و هر رکوئست یک سشن جدید نیست، حتی دستورات جاوا نیز پردازش می شوند،
البته همانطور که گفتم این یک کد ساده است و می توان امکان تست پذیرفتن کوکی و رفرش صفحه با جاوا جهت تست صحت مرورگر توسط یک برنامه نویس اضافه شود،(مثل Page wait کلودفلر یا سرویس کلود پروتکشن ما) شاید طی روز های آینده در اولین فرصت به آن اضافه کنم.
در هر صورت همانطور که گفتم این کد قرار نیست همه حملات را پشتیبانی کند.

lnspiron
April 10th, 2017, 13:46
سلام

خودتون چه مقداری روی برای دو متغییر زیر پیشنهاد میدید ؟

$r=8
$ps=4

yastheme
April 11th, 2017, 13:20
سلام

خودتون چه مقداری روی برای دو متغییر زیر پیشنهاد میدید ؟

$r=8
$ps=4

این مقدار بستگی به نیاز خودتون تعیین میشود،
همین اعداد8 و 4 خوب است.

hegza
April 18th, 2017, 15:10
یکی از دلایلی که از فایل TXT به جای مثلا دیتابیس استفاده شده سرعت خواندن و نوشتن بالای اون هست،
این مورد تاثیر بسیار بسیار کمی در پردازش php دارد البته تا زمانی که فایل ip.txt سبک باشد و اگر تعداد آی پی ها مثلا به چند هزار تا برسه طبیعتا کمی توی سرعت خودشو نشون میده که این هم باز به هارد یا منابع سرور بستگی داره. که بهتره یکبار آی پی های بلاک شده توی این فایل توسط CSF یا htaccess بلاک بشه و بعد فایل ip.txt خالی بشه

درود بر شما
و تشکر بابت این کد!
فکر نمیکنید اگر اطلاعات رو در یک تیبل دیتا بیس ذخیره بکنیم و با کرون تعریف کنیم مثلا هر ساعت ردیف های 24 ساعت به قبل رو خالی کن هم کار راحت تر میشه هم نیاز به اضافه کاری برای مدیر سایت نیست؟

پ.ن:
وقتی تعداد ردیف های یک فایل زیاد باشند سیستم سرچ php خیلی خیلی ضعیف تر از کوئری های مرسوم پایگاه داده عمل میکنه و به نوعی با اینکار سرعت لود سایت رو دارید به حداقل میرسونیم
و نیاز نیست تمپ رو درگیر سشن کنیم کافیه آی پی و تایم رو در حلقه کنترلی بررسی کنیم

- - - Updated - - -

ضمنا بهتره سشن رو قبل از تعرف متغییرها استارت کنیم
موفق باشید

yastheme
April 18th, 2017, 20:59
درود بر شما
و تشکر بابت این کد!
فکر نمیکنید اگر اطلاعات رو در یک تیبل دیتا بیس ذخیره بکنیم و با کرون تعریف کنیم مثلا هر ساعت ردیف های 24 ساعت به قبل رو خالی کن هم کار راحت تر میشه هم نیاز به اضافه کاری برای مدیر سایت نیست؟

پ.ن:
وقتی تعداد ردیف های یک فایل زیاد باشند سیستم سرچ php خیلی خیلی ضعیف تر از کوئری های مرسوم پایگاه داده عمل میکنه و به نوعی با اینکار سرعت لود سایت رو دارید به حداقل میرسونیم
و نیاز نیست تمپ رو درگیر سشن کنیم کافیه آی پی و تایم رو در حلقه کنترلی بررسی کنیم

- - - updated - - -

ضمنا بهتره سشن رو قبل از تعرف متغییرها استارت کنیم
موفق باشید
البته این کد ها یک نمونه سمپل هست و کامل نیست، اما متاسفانه دیتابیس گزینه درستی نیست، سعی شده منابع کمتری مصرف شود، البته کران جاب بر روی فایل متنی هم قابل نوشتن و اجرا است ولی استفاده از دیتا بیس باعث افزایش چندین برابری منابع می شود.

البته باز هم تایید می کنم برای جلوگیری از حملات اصلا php توصیه نمیشود، باید از طریق فایروال و رول های وب سرور استفاده شود، این کد هم بدون نقص نیست. اما یک سمپل و الگو برای حملاتی است که معمولا از فایروال های کلودفلر عبور می کنند