آرایهها در PHP و سایر زبانهای اسکریپتی بسیار پرکاربرد و محبوب هستند. با استفاده از آرایهها میتونید هر تعداد و از هرنوعی داده ذخیره کنید. و حتی بعد از تشکیل آرایه هر تعداد موجودیت که خواستید به آرایه اضافه کنید. مشکل اصلی PHP هم که بش میگن تصادم هش (Hash Colision) از همینجا میاد.
شرح مشکلدر PHP آرایههای زیادی به طور پیشفرض از محیط و یا از کاربر انتهایی (end-user) مقادیر را گرفته و ذخیره میکنن. از جملهی اونها میشه آرایههای زیر اشاره کرد :
$_GET, $_POST, $_COOKIE
اگر شما یک آرایه با حجم زیادی از موجودیت بگیرید تا حتی آخرین نسخهی PHP هم ممکن است با مشکل مواجه بشید !
بزارید توضیح بدیم که چطوری این مشکل پیش میاد. موتور زمان اجرای PHP که با زبان C پیادهسازی شده است، دادههای درخواستی HTTP را گرفته و آرایههایی را برای ذخیرهی متغیرهای درخواستی ایجاد میکنه. این کار قبل از اینکه هرگونه خطی از PHP تفسیر بشه اتفاق میافته.
در زبان C و خیلی زبانهای دیگه آرایهها با استفاده از ساختاردادههایی به اسم جداول هش (Hash Tables) پیادهسازی میشن. به بیان سادهتر، جداول هش، آرایهای از موجودیتهای لیست پیوندی (Linked List) هستند. این آرایهها طول ثابتی دارند.
هر زمان که میخواید یک ورودی جدید به جدول هش اضافه بکنید، یک مقدار هش جدید برای کلید آرایه نیاز هست که محاسبه بشه. این مقدار هش یک عدد صحیح هست که مشخص میکنه مقدار جدید در چه قسمتی از لیست پیوندی باید وارد و اضافه بشه.
وقتی که جدول هش فهمید که باید موجودیت جدید را درکجای لیست پیوندی قرار بده، قبل از قرار دادن اون بررسی میکنه که آیا قبلاً همچنین موجودیتی با این عدد صحیح در جدول هش اضافه شده یا نه. اگر اضافه شده بود، فقط مقدار این موجودیت رو به مقدار جدید تغییر میده. در غیر اینصورت یک پیوند جدید به لیست پیوندی اضافه میشه.
خوب میبینید که اگر عناصر آرایه تعدادشون کم باشه این فرآیند میتونه سریع باشه اما اگر عناصر آرایه هم زیاد باشه به تدریج کارایی افت میکنه.
این مشکل میتونه خیلی بیشتر تشدید بشه اگر یک جدول هش بسیار بزرگ داشته باشیم و عناصر بسیار زیادی هم کلیدهای یکسانی داشته باشن !
یه سری تحقیقات امنیتی مشخص کرده که ایجاد متغیرهای طولانی با داشتن کلیدهای یکسان برای متغیرهای ورودی HTTP مختلف در PHP مثل GET, POST, COOKIE میتونه سروری که PHP رو اجرا میکنه برای ساعتها و حتی بیشتر مشغول خودش نگه داره و PHP رو مجبور کنه که از همهی قدرت CPUی سرور استفاده کنه تا آرایههای متغیرهای درخواستی رو بسازه !!
این مشکل حتی در زبانهای دیگه هم وجود داره و مشکل چندان جدیدی به شمار نمیره. اما از اونجایی که ۷۷ درصد سرورهای جهان از PHP استفاده میکنند، این موضوع بسیار خطرناک به نظر میرسه.
و راهحلاین مشکل در همهی نسخههای PHP قبل از 5.3.9 وجود داره و در این نسخه و بعد از اون با استفاده از متغیر max_input_vars در فایل php.ini میشه تعداد متغیرهای ورودی رو محدود کرد.
تنها راهحل فعلی آپگرید PHP سرورتون به آخرین نسخهی فعلی یعنی 5.3.9 به نظر میرسه. پس اگه یه روز بیدار شدید و دیدید که سایتتون بدون دلیل suspend شده احتمال یک چنین حملهای رو بدید و برای اینکه چنین اتفاقی نیافته اگه سرور دست خودتون نیست حتماً به مدیر سرور اطلاع دهید که هرچه زودتر بروزرسانی رو انجام بده.
منبع:
http://azadrah.net/2012/01/php-vulnerability-may-halt-millions-of-servers/?utm_source=rss&utm_medium=rss&utm_campaign=php-vulnerability-may-halt-millions-of-servers