PDA

View Full Version : سوال: گرفتن آیپی کاربر



***BiDaK***
چهارشنبه 07 تیر 1391, 19:20 عصر
دوستان این برنامه اروره undefine میده و HTTP_X_FORWARDED_FOR و HTTP_CLIENT_IP رو نمیشناسه..
راه حل چیه؟http://www.freesmile.ir/smiles/231419_starescreen.gif

<?php
$http_client_ip = $_SERVER['HTTP_CLIENT_IP'];
$http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
$remote_addr = $_SERVER['REMOTE_ADDR'];

if (!empty($http_client_ip))
$ip_address = $http_client_ip;
else if (!empty($http_x_forwarded_for))
$ip_address = $http_x_forwarded_for;
else if (!empty($remote_addr))
$ip_address = $remote_addr;

echo $ip_address;
?>

eshpilen
پنج شنبه 08 تیر 1391, 08:09 صبح
اینطوری اون مشکلی که گفتی برطرف میشه:

<?php
@ $http_client_ip = $_SERVER['HTTP_CLIENT_IP'];
@ $http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
$remote_addr = $_SERVER['REMOTE_ADDR'];

if (!empty($http_client_ip))
$ip_address = $http_client_ip;
else if (!empty($http_x_forwarded_for))
$ip_address = $http_x_forwarded_for;
else if (!empty($remote_addr))
$ip_address = $remote_addr;

echo $ip_address;
?>

ولی این کد یک حفرهء امنیتی بزرگ داره: به صحت هدرهای HTTP_CLIENT_IP و HTTP_X_FORWARDED_FOR نمیشه اعتماد کرد، چون براحتی قابل جعل هستن.
پس از این کد نباید در مقاصد امنیتی استفاده بشه (مگر جایی که شرایط و تضمین های خاصی برای جعل نشدن این هدرها بتونیم پیدا کنیم).
حالا استفادش برای Log کردن و اینها مشکلی نداره. ولی در لاگها حتما برای هر IP مشخص کنید که از کدامیک از این منابع استخراج شده.
بین اینها فقط REMOTE_ADDR رو نمیشه جعل کرد. البته REMOTE_ADDR هم میتونه آدرس یک پراکسی واسط و اینها باشه.

بهتون نشون میدم چطور میشه هدرها رو جعل کرد.
کد خودتون رو در فایلی بنام test.php در ریشهء www واقع در local خودتون قرار بدید.
حالا این کد رو در یک فایل PHP دیگه ذخیره و اجرا کنید:

<?php

$service_port = getservbyname('www', 'tcp');

$address = gethostbyname('localhost');

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}

$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}

$in = "GET /test.php HTTP/1.1\r\n";
$in .= "Host: localhost\r\n";
$in .= "X_FORWARDED_FOR: Thank u dude! Excellent hole ;)\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

socket_write($socket, $in, strlen($in));

while ($out = socket_read($socket, 2048)) {
echo $out;
}

socket_close($socket);

?>

نکته: باید امکان استفاده از سوکت در PHP فعال باشه تا بتونید این کد رو اجرا کنید.

***BiDaK***
جمعه 09 تیر 1391, 01:43 صبح
اینطوری اون مشکلی که گفتی برطرف میشه:

<?php
@ $http_client_ip = $_SERVER['HTTP_CLIENT_IP'];
@ $http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR'];
$remote_addr = $_SERVER['REMOTE_ADDR'];

if (!empty($http_client_ip))
$ip_address = $http_client_ip;
else if (!empty($http_x_forwarded_for))
$ip_address = $http_x_forwarded_for;
else if (!empty($remote_addr))
$ip_address = $remote_addr;

echo $ip_address;
?>

ولی این کد یک حفرهء امنیتی بزرگ داره: به صحت هدرهای HTTP_CLIENT_IP و HTTP_X_FORWARDED_FOR نمیشه اعتماد کرد، چون براحتی قابل جعل هستن.
پس از این کد نباید در مقاصد امنیتی استفاده بشه (مگر جایی که شرایط و تضمین های خاصی برای جعل نشدن این هدرها بتونیم پیدا کنیم).
حالا استفادش برای Log کردن و اینها مشکلی نداره. ولی در لاگها حتما برای هر IP مشخص کنید که از کدامیک از این منابع استخراج شده.
بین اینها فقط REMOTE_ADDR رو نمیشه جعل کرد. البته REMOTE_ADDR هم میتونه آدرس یک پراکسی واسط و اینها باشه.

بهتون نشون میدم چطور میشه هدرها رو جعل کرد.
کد خودتون رو در فایلی بنام test.php در ریشهء www واقع در local خودتون قرار بدید.
حالا این کد رو در یک فایل PHP دیگه ذخیره و اجرا کنید:

<?php

$service_port = getservbyname('www', 'tcp');

$address = gethostbyname('localhost');

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
} else {
echo "OK.\n";
}

$result = socket_connect($socket, $address, $service_port);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}

$in = "GET /test.php HTTP/1.1\r\n";
$in .= "Host: localhost\r\n";
$in .= "X_FORWARDED_FOR: Thank u dude! Excellent hole ;)\r\n";
$in .= "Connection: Close\r\n\r\n";
$out = '';

socket_write($socket, $in, strlen($in));

while ($out = socket_read($socket, 2048)) {
echo $out;
}

socket_close($socket);

?>

نکته: باید امکان استفاده از سوکت در PHP فعال باشه تا بتونید این کد رو اجرا کنید.
ممنون از پاسختون..ولی من اماتورم..جریان این @ چیه و کارش چیه چون من جاهای مختلفی دیدم...
بعد اینکه HTTP_CLIENT_IP و HTTP_X_FORWARDED_FOR دقیقا به کدوم آیپی اشاره داره؟
مشکل استفاده از اینارو هم خوب متوجه نشدم..http://freesmile.ir/smiles/165821_Laie_91A.gif

eshpilen
جمعه 09 تیر 1391, 10:57 صبح
ممنون از پاسختون..ولی من اماتورم..جریان این @ چیه و کارش چیه چون من جاهای مختلفی دیدم...
@ در ابتدای هر دستوری که بیاد باعث میشه که در اون دستورات اگر مورد خطا یا هشداری رخ بده، هیچ پیام خطا یا هشداری تولید نشه. درواقع پیامهای PHP رو موقتا خاموش میکنه.


بعد اینکه HTTP_CLIENT_IP و HTTP_X_FORWARDED_FOR دقیقا به کدوم آیپی اشاره داره؟تاجاییکه میدونم اینها رو سیستمهای واسطی مثل بعضی پراکسی ها ست میکنن (لزوما همهء پراکسی ها این کار رو نمیکنن). مقدارش هم باید برابر IP کاربری باشه که از طریق اون پراکسی درخواست میده.
پراکسی یک سرور واسط هست که کاربر از اون بعنوان واسطه برای ارسال و دریافت استفاده میکنه.
این کار گاهی با هدف پنهان کردن IP کاربر از سرورهای مقصد انجام میشه. گاهی هم با اهداف دیگر. این اهداف میتونن انواع مشروع و نامشروع داشته باشن.
ضمنا انواع مختلفی از پراکسی داریم که به شکلهای مختلفی کار میکنن. مثلا یک سازمان ممکنه تمام ارتباطات اینترنتی خودش رو از طریق یک پراکسی (متعلق به خودش) انجام بده.
ولی موضوع اینه که پراکسی میتونه این هدرها رو ست بکنه یا نکنه و با مقدار واقعی ست بکنه یا با هر مقدار جعلی. اینا تحت کنترل پراکسی هست. همینطور حتی خود کلاینت هم میتونه این هدرها رو ست یا جعل بکنه (کدی که بنده برای تست دادم این رو نشون میده).

مشکل استفاده از اینارو هم خوب متوجه نشدم..http://freesmile.ir/smiles/165821_Laie_91A.gifمشکلش اینه که اگر روی این هدرها اتکا کنید نمیتونید مطمئن باشید صحیح هستن.
مثلا ممکنه برای سایت خودتون یک سیستم مسدود کردن دسترسی بر اساس IP پیاده سازی کرده باشید. حالا من هکر میتونم هر بار یک IP جعلی رو در هدر X_FORWARDED_FOR قرار بدم و به این شکل براحتی محدودیت سیستم شما رو دور بزنم. یا میتونم IP کس یا کسان دیگری رو بعنوان IP خودم به سیستم شما معرفی کنم و در سایت شما کارهایی انجام بدم که باعث قطع دسترسی اون افراد بشه، چون شما درواقع IP اونا رو بلاک میکنید، نه IP حقیقی من رو.

حالا این فقط یکی دو مورد واضح و ساده بود که حضور ذهن داشتم. احتمالا انواع سوء استفاده های دیگری رو هم میشه داشت.