المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تحديد الآيبي الحقيقي فعلاً - طريقة خاصة بي ومضمونة بإذن الله


ŘǻŶąŅ~ •●∫
12-12-08, 04:41 PM
السلام عليكم ورحمة الله وبركاته

الكلام أدناه فقط للمطورين : ) وللمبتدئين عليكم بآخر الموضوع

جميعنا يعلم في نسخة 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


لمن لديه إعتراض على طريقتي أعلاه في تحديد الآيبي الحقيقي فليتفضل مشكوراً

---------------------------------------

زبدة الهرج هذا كله
ارفع الملف التالي الموجود بالمرفق على هذا الرابط:
www.yourwebsite.com/vb/admincp/plugin.php?do=files (http://www.yourwebsite.com/vb/admincp/plugin.php?do=files)

وقم باستعراضه بعد فك الضغط عنه وتمتع بالآيبيات الحقيقية http://www.traidnt.net/vb/images/smilies/icon30.gif

وشكراً لكم
الملفات المرفقة http://www.traidnt.net/vb/images/attach/zip.gif product-realip.zip (http://www.traidnt.net/vb/attachment.php?attachmentid=324819&d=1228922558) (524 بايت