السلام عليكم ورحمة الله وبركاته
الكلام أدناه فقط للمطورين : ) وللمبتدئين عليكم بآخر الموضوع
جميعنا يعلم في نسخة 3.7 ولا أعلم عن 3.6 .. أن طريقة تحديد الآيبي تعتمد على تعريف IPADDRESS عن طريق ملف class_core.php
لو نبحث جيداً داخل هذا الملف وبحثنا عن:
رمز PHP:
function fetch_ip()
{
return $_SERVER['REMOTE_ADDR'];
}
لوجدنا أنه يعيد قيمة بروتوكول الإنترنت البعيد REMOTE_ADDR فقط
أما لو بحثنا في نفس الملف عن:
رمز PHP:
function fetch_alt_ip()
{
$alt_ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_CLIENT_IP']))
{
$alt_ip = $_SERVER['HTTP_CLIENT_IP'];
}
else if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches))
{
// make sure we dont pick up an internal IP defined by RFC1918
foreach ($matches[0] AS $ip)
{
if (!preg_match('#^(10|172\.16|192\.168)\.#', $ip))
{
$alt_ip = $ip;
break;
}
}
}
else if (isset($_SERVER['HTTP_FROM']))
{
$alt_ip = $_SERVER['HTTP_FROM'];
}
return $alt_ip;
}
لوجدنا أنه يعطي قيمة بروتوكول الإنترنت البعيد REMOTE_ADDR في البداية ثم بعدها يتحقق من متغيرات لإيجاد الآيبي الحقيقي الخاص بالزائر .. فإن كانت لها قيمة فسوف تسند إلى متغير $alt_ip
وهو أدق من fetch_ip وحدها
أي أنه بكل الأحوال .. لو لم يكن هناك قيم للـ:
رمز PHP:
$_SERVER['HTTP_CLIENT_IP']
$_SERVER['HTTP_X_FORWARDED_FOR']
$_SERVER['HTTP_FROM']
لأعاد قيمة REMOTE_ADDR .. أي أنه أصبح نفس عمل fetch_ip السابق
ولو أن هناك قيم أخرى المذكورة أعلاه لأصبح الآيبي الحقيقي غير عن REMOTE_ADDR فيسند قيمة الآيبي الحقيقي إلى $alt_ip
دعونا نعود للبحث عما بداخل الملف مرة أخرى عن:
رمز PHP:
// fetch client IP address
$registry->ipaddress = $this->fetch_ip();
define('IPADDRESS', $registry->ipaddress);
// attempt to fetch IP address from behind proxies - useful, but don't rely on it...
$registry->alt_ip = $this->fetch_alt_ip();
define('ALT_IP', $registry->alt_ip);
إذاً ALT_IP هو من يحمل قيمة الآيبي الحقيقي
لكن مشكلة أن أغلب ملفات vbulletin تستخدم IPADDRESS وليس ALT_IP
الحل الوحيد لهذا المشكلة بدل التعديل على الملفات واستبدال IPADDRESS إلى ALT_IP
هو إسناد قيمة IPADDRESS إلى ALT_IP
ويكمن ذلك في الـ plug-in الخاص بـ init_startup حيث نقوم بإنشاءه مرتين وتحديد قيمة 1 عند خانة ترتيب التنفيذ Execution Order في أول إنشاء وقيمة 999 في ثاني إنشاء ومن ثم وضع الكود التالي في كلا الإنشائين:
كود PHP:
define('IPADDRESS', ALT_IP);
والسر في وضع رقم 1 ورقم 999 مع أن كلاهما يحمل نفس الكود
هو للإحتياط فقط
حيث ربما يوجد منتجات products تستخدم plugin init_startup يحوي على الـ IPADDRESS الغير الحقيقي في وسطها .. لهذا وضعت رقم 1
أما رقم 999 فهو للحماية من التعديل على قيمة IPADDRESS من قبل أية منتج آخر لا أكثر ولا أقل
قد يسأل سائل،
لماذا لم تقم شركة vBulletin بالقيام بهذا الطريقة ونرتاح ؟
الجواب لأن قيمة REMOTE_ADDR يحتوي على الآيبي الحقيقي لديهم وفي الدول الغربية كذلك لذا هم ليسوا بحاجة إلى تعيين بدائل Alternative للـ REMOTE_ADDR
لمن لديه إعتراض على طريقتي أعلاه في تحديد الآيبي الحقيقي فليتفضل مشكوراً
---------------------------------------
زبدة الهرج هذا كله
ارفع الملف التالي الموجود بالمرفق على هذا الرابط:
http://www.yourwebsite.com/vb/adminc...n.php?do=files
وقم باستعراضه بعد فك الضغط عنه وتمتع بالآيبيات الحقيقية
وشكراً لكم
تذكير: الهاك والموضوع للمبرمج المبدع: مدمن نت
المصدر: سوالف سوفت ..
الملفات المرفقة
product-realip.zip (524 بايت)