در این آموزش قصد داریم نحوه بدست آوردن IP کاربر در PHP و نمایشIP کاربر بپردازیم .آدرس آی پی (IP) یک شناسه منحصر به فرد برای هر ماشین یا دستگاه مثل کلاینت (کامپیوتر , موبایل و تبلت و .. ) , سرور یا پروکسی است . در php می توانیم به دو روش آدرس IP را بدست بیاریم
- با دسترسی به آرایه سوپرگلوبال $_SERVER
- با استفاده از تابع getenv()
آسان ترین راه برای بدست آوردن IP کاربر استفاده از کد زیر است :
1 2 |
$ip = $_SERVER['REMOTE_ADDR']; echo $ip; |
اما بهترین روش برای بدست آوردن IP کاربر در php نیست چونکه احتمال وجود یک سری پروکسی و احتمالات دیگر وجود دارد و برای همین توصیه می شود ادامه مقاله را دنبال کنید .
هر دو از متد های بالا نیاز به بعضی مقادیر برای بدست آوردن آی پی کاربر , دارند . برای بدست آورد آی پی کاربر در PHP با استفاده از متد های بالا می توانید مقادیر کلید را به به هر یک از متد های بالا ارسال کنید . برای مثال , اگر قصد داریم IP کاربر را بدست بیاریم , پس در اینصورت باید به اینصورت آن را فراخوانی کنیم .
حالا قصد داریم جزییات هر یک از دو متد بالا برای نمایش IP کاربر در PHP را بررسی کنیم .
با دسترسی به آرایه سوپرگلوبال $_SERVER
در این متد , ما تلاش می کنیم که به آدرس Ip کاربر با ساخت متغیر server به صورت از راه دور (remote) دسترسی پیدا کنیم .این متغییر ها در آرایه سوپر گلوبال $_SERVER ذخیره شده اند .
این آرایه مقادیر ایندکس مختلفی برای نمایش آی پی کاربر می پذیرد. این کلید های ایندکس را در لیست زیر می بینید.
- HTTP_CLIENT_IP
- HTTP_X_FORWARDED_FOR
- HTTP_X_FORWARDED
- HTTP_FORWARDED_FOR
- HTTP_FORWARDED
- REMOTE_ADDR
کد php زیر برای نمایش IP کاربر در PHP با استفاده از احتمالات هر یک از ایندکس هایی که معرفی کردیم , استفاده شده است.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function showIPAddress() { $variableIndex = array("HTTP_CLIENT_IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_FORWARDED_FOR","HTTP_FORWARDED","REMOTE_ADDR"); for($i=0;$i<count($variableIndex);$i++){ if(!isset($ipAddress)) { if(array_key_exists($variableIndex[$i], $_ENV)) { $ipAddress = $_SERVER[$variableIndex[$i]]; echo $ipAddress; break; } } } } showIPAddress(); |
برای کپی صحیح و کامل کدها ، دابل کلیک کرده تا وارد محیط سفید و کپی شوید در غیر اینصورت امکان دارد اجرای کدها با مشکل روبرو شود
در کد php بالا , آرایه $variableindex همه کلید های احتمالی از پیش تعیین شده برای پیدا کردن آدرس IP کاربر را دارد. این آرایه در یک حلقه تا زمانی که مقدار متغییر $ipAddress ست شده باشد , ادامه پیدا می کند . همین که متغییر $ipAddress مقدار دهی شد , با استفاده از break; حلقه را می شکنیم و آی پی را نمایش می دهیم.
استفاده از تابع getenv()
به جای دسترسی به متغییر server , متد دوم برای بدست آوردن متغییر های محیطی با تابع getenv() در php , استفاده می شود.
با استفاده از همان مثال قبلی , IP کاربر را با استفاده از تابع getenv() بدست می آوردیم . بنابراین , در اسکریپت php بالا , به جای $_SERVER[] از getenv() بهره می بریم .
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function showIPAddress() { $variableIndex = array("HTTP_CLIENT_IP","HTTP_X_FORWARDED_FOR","HTTP_X_FORWARDED","HTTP_FORWARDED_FOR","HTTP_FORWARDED","REMOTE_ADDR"); for($i=0;$i<count($variableIndex);$i++){ if(!isset($ipAddress)) { if(array_key_exists($variableIndex[$i], $_SERVER)) { $ipAddress = getenv($variableIndex[$i]); echo $ipAddress; break; } } } } showIPAddress(); |
$_SERVER یا getenv()
هر دو برای بدست آوردن و نمایش IP کاربر در PHP استفاده می شود , در حالی که تابع getenv , case-insensitive است به این معنا تفاوتی ندارد که index ها را به صورت حروف کوچک یا بزرگ به تابع پاس بدیم . در هر صورت خروجی تفاوتی نخواهد کرد . پس اگر از بزرگ یا کوچک بودن حروف ایندکس ها مطمین نبودیم می توانیم از این متد استفاده کنیم .
بدست آوردن IP کاربر در PHP می تواند مزایای زیادی داشته باشد . اینکه تشخیص بدیم کاربران ما بیشتر از چه کشوری یا حتی چه شهر و منظقه ای وارد سایت ما می شوند یا اینکه اگر ip مشکوکی حملاتی را بر روی سایت انجام داد به راحتی آن را تشخیص بدیم و آن ip را بلاک و یا اینکه بدنبال تشخیص هویت فرد باشیم . همچنین ip در بحث ذخیره وقایع و لاگ (logging) می تواند بسیار مهم باشد .
هر گونه مشکلی در پیاده سازی کدها داشتید ، از قسمت نظرات اقدام کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق و پیروز باشید.
درود طریقه به دست اوردن isp در php اطلاعاتی دارین؟مثلا تخصیص ایرانسل بودن یا همراه اول… باشد..ممنونم بتونم راهنمایی کنید با تشکر
سلام.
با api میتونید:
https://ipinfo.io
ممنون از راهنمایی شما گویا سایت برای ایرانی ها مسدود هست و باید با فیلتر شکن وارد شد،ایا سایت دیگری هست که بدون فیلتر این خدمت را انجام دهد با تشکر از شما
سلام
تو گوگل سرچ کنید
Ip location api free
لیست سایت هایی که دایگان این خدمات رو میدن میتونید چک کنید کدومش مناسب کارتون هست
تشکر و سپاس از راهنمایی خوب و همیشگی شما،پایدار برقرار و موفق باشید.
سلام
در پی اچ پی راهی هست تا بتونیم آی پی سروری که درخواست رو برای سرور ما ارسال کرده بدست بیاریم، توجه داشته باشید که منظورم آی پی سرور درخواست کننده هست نه آی پی کاربری که از طریق یه سایت درخواست ارسال میکنه
سلام.
اطلاعی ندارم باید در سایت های خارجی جستجو کنید
سلام حسن جان من میخوام تو سایتم هر کسی بتونه ثبت آگهی ثبت کنه و برای ویرایش آگهی خودش میخوام از کد پیگیری استفاده کنم به نظر شما کار درستیه و اینکه بهترین تابع برای تولید کد پیگیری که هیچوقت تکراری نباشه چیه
آیا uniqeid انتخاب درستیه با تشکر از سایت خوبتون
سلام. مشکلی نداره اوکی هست
سلام مهندس شفیعی عزیز وقتی سایتم رو تو گوگل مینویسم چند تا تصویر از سایتم رو نشون میده ولی اسم همشون رو نوشته document چیکار کنم که اسم دلخواهم رو نشون بده خاصیت alt رو هم نوشتم یه چیزی چرا اسم خود تصویر که تو سایت هست رو نشون نمیده تشکر از سایت خوبتون
سلام. از سیو کارها باید بپرسید و سوالتون ارتباطی با php یا این پست ندارد
سلام حسن جان من برای سیستم امتیاز دهی از ip کاربر استفاده کردم ولی با فیلتر شکن قابل دور زدنه چیکار کنم که با فیلتر شکن نشه دور زد اگر از تابعی که در سایت شماست استفاده کنم مشکل حل میشه ؟
سوال دوم من توی سایت آزمایشی soft40.b6b.ir وقتی یکی از پست ها رو جستجو میکنم وبه صفحه search میرم تو کامپیوتر امتیاز کاربر رو توی alert درست نشون میده ولی توی موبایل هر امتیازی ثبت میکنم تو alert مینویسه امتیاز شما صفر اگه امکان داره شما هم یه نگاهی بندازید راهنماییم کنید مشکل از کجاست با تشکر از سایت عالی تون
یکی از اسم های محمود فرهام یا کامبیز رو انتخاب کنید و جستجو کنید
سلام.
در کنار ip همزمان از cookie و session هم استفاده کنید.
اگر هم کلا نمی خواید قابل دور زدن باشه که باید کاربر رو در سیستم ثبت نام کنید و امتیاز دهی را محدود کنید به کاربران لاگین شده که در اینصورت به هیچ وجه قابل دور زدن نخواهد بود و هر کاربر یکبار می تواند امتیاز ثبت کند.
متاسفانه این موارد روی پروژه های شخصی بررسی نمیشه
سلام حسن جان میشه راهنمایی کنید چه چیزی رو به عنوان سشن ست کنم
برای اینکه جیمیل کاربران رو داشته باشم روش ساده ای به جز احراز هویت با اکانت گوگل وجود داره ؟
سلام.
آیدی اون پست که امتیاز دهی داره یا اینکه اگر یه مورد عمومی هست فقط یک $_SESSION[‘rating’] = true میتونید ست کنید.
خیر بهترین و آسان ترین راه احراز هویت با اکانت هست
سلام حسن جان من برای سیستم امتیاز دهی کوکی و سشن رو امتحان کردم فقط در مورد سشن یه ساعت بعد دوباره میشه رای داد چیکار کنم که سشنی که ست میکنم مثل کوکی با مدت زمان دلخواه اعتبار داشته باشه با تشکر از راهنمایی ها تون
سلام. این آموزش را ببینید :
https://netparadis.com/session-timeout-in-php
سلام
دستور REMOTE_ADDR آی پی کاربر در شبکه محلی رو میده!
چطوری باید آی پی اینترنتی کاربر رو بدست بیاریم؟
سلام.
بر اساس داکیومنت php
:
‘REMOTE_ADDR’
The IP address from which the user is viewing the current page.
آدرس آیپی پابلیک کاربر که با آن در اینترنت گشت و گذار می کند با REMOTE_ADDR برگشت داده می شود و موردی که گفتید اشتباه هست و در این مقاله توضیح داده شده و روش دیگری برای دریافت آیپی با PHP نیست
بعضی وقت ها نیز کاربر از پروکسی استفاده می کند که تابع جامع برای دریافت آیپی می تواند بصورت زیر باشد :
function getUserIpAddr(){
if(!empty($_SERVER[‘HTTP_CLIENT_IP’])){
//ip from share internet
$ip = $_SERVER[‘HTTP_CLIENT_IP’];
}elseif(!empty($_SERVER[‘HTTP_X_FORWARDED_FOR’])){
//ip pass from proxy
$ip = $_SERVER[‘HTTP_X_FORWARDED_FOR’];
}else{
$ip = $_SERVER[‘REMOTE_ADDR’];
}
return $ip;
}
echo ‘User Real IP – ‘.getUserIpAddr();
ولی آی پی که REMOTE_ADDR برمیگردونه ممکنه برای کاربران مختلف مشابه باشه!
از طرفی این آی پی برای یک کاربر مدام تغییر میکنه!
وقتی توی گوگل my ip رو بزنیم همیشه یه ip ثابتی رو میده!
توی PHP یا سایر زبان ها، میشه این ip ثابت رو دریافت کرد؟
سلام
برای اینکه من تعداد بازدید های یک پست را به دست بیاورم استفاده از $_SERVER مناسب هست؟
سلام.
میتونید از سشن استفاده کنید https://netparadis.com/php-session
موفق باشید.
ممنون
من میخوام ای پی ها رو توی دیتابیس ذخیره کنم و بعد یک هفته پاک کنم
میشه توضیح بدید که چطوری تایمر درست کنم؟
از کرون جاب استفاده کنید
https://netparadis.com/managing-cron-jobs-with-php
سلام چطوری می تونم ip کاربرانی که از سایت دیدن میکنن با php دستور insert ذخیره کند و بعد از این که سایت بست تشخیص بده که ip فعال نیست و حذف کند ممنون
سلام. از ajax استفاده کنید که باید بصورت real-time چک کند که فعال هست یا خیر.
https://netparadis.com/ajax-crud-database-php-jquery
سلام در php تابعی هست که من بتونم باهاش ip شبکه ای که بهش اتصال دارم رو بدست بیارم؟
تمام این توابع در لوکال فقط ۱۲۷٫۰٫۰٫۱ را برمیگردونه
سلام. لطفا از آرایه سراسری $_SERVER یک var_dump بگیرید تا ایندکس مربوطه برای دریافت آی پی شبکه رو دریافت و بعد echo کنید تا نتیجه مشاهده شود.
موفق باشید.
سلام
هیچ راهی نیست که بشه آیپی واقعی کاربر را با پروکسی بدست آورد؟ من خیلی کد ها را تست کردم ولی هیچ کدوم نتونستن پیدا کنند.کد رو بدون پروکسی تست می کنم آیپی خودم رو می گیرم و وقتی پروکسی را کانکت می کنم آیپی تغییر می کنه. هیچ کدی پیدا نکردم که بتونه این کار را انجام بده.
سلام استاد
اقا ببخشید من دو تا سوال داشتم از شما . اول این که $_ENV چی هستش ؟
وب بعدش این که چه تفاوتی بین
HTTP_CLIENT_IP
HTTP_X_FORWARDED_FOR
HTTP_X_FORWARDED
HTTP_FORWARDED_FOR
HTTP_FORWARDED
REMOTE_ADDR
ها هستش در حالی که همشون ای پی کاربر رو به ما میدن ؟
با تشکر از شما
سلام . ممنونم لطف دارید .
آرایه سوپر گلوبال $_ENV شامل تمام متغییر های محیطی که تعریف کردید هستش که میتونید به مقادیر متغییر ها بدون تعیین global در تمام توابع به راحتی استفاده کنید
این هدر ها برای تشخیص ip اصلی کاربر به کار می روند . زمانی که یک کاربر از یک پروکسی استفاده می کند , احتمال دارد پروکسی سرور همچنین فیلد هایی را به صورت hidden به http request ها اضافه کنند تا اینکه ip حقیقی کاربر مخفی بداند . ما بررسی اینها مطمین می شیم که ip که دریافت کردیم همان آی پی واقعی کاربر باشه . برای همین اگر از هیچ پروکسی سروری استفاده نکنید عملا تمام این ایندکس ها دوباره همون آی پی اصلی یا واقعی رو بهتون نشون میدن
انشالا مقاله ای کامل در مورد متغییر های محیطی در php خواهم نوشت .
موفق باشید.
ممنون از پاسختون ! یکی از معدود سایت هایی که به سوالات php پاسخ میدین ! پسر واقعا قول میدم سایتتون رو به همه معرفی کنم و خودم تک تک مقاله هاتون رو بخونم و به بیشترشون نظر بدم !
راستی یک سوال دیگه -> پروکسی وظیفه اش اینه که ای پی کاربر رو پنهان کنه یا تغیر بده ؟ یعنی وقتی من یک پروکسی روی یک vps نصب میکنم و با کامپیوتر خودم از اینترنتش استفاده میکنم و توی یک سایتی میرم که ای پی من رو ذخیره میکنه php ای پی من رو میتونه بفهمه ؟ چون طبیعتا باید ای پی سرور میانی رو پیدا کنه نه مال من !
خواهش می کنم . خیلی لطف دارید . پروکسی فقط ip شما رو مخفی میکنه . بعضی از پروکسی سرور ها یک هدر HTTP_X_FORWARDED_FOR رو ست می کنند که با php میتونید به آی پی اصلی کاربر دسترسی داشته باشید (این هدر هم قابل جعل است ! ) پس همیشه نمی توان اعتماد کرد که با php میشه ip اصلی رو بدست اورد . یکی از روش های دیگه استفاده از traceroute است که در لینوکس استفاده میشه و به جای استفاده از php میتونید از این ابزار توسط سرور استفاده کنید . پروکسی سرور فقط درخواست شما رو دریافت اون رو اجرا و در نهایت پاسخ رو به شما انتقال میده همین .
این مقاله نحوه کار پروکسی رو هم کامل توضیح میده
موفق باشید
سلام
وقتتون بخیر
تشکر دوباره بابات وب و پاسخ هاتون
وب خوبی دارید
خود من که بعد از تصادفم حافظه ام دچار مشکل شده بود الان کلا وب شمارو برای یادگیری دوباره استفاده میکنم
یه سوال برام پیش اومد وقتی نظر بالا رو خوندم
گفتید “پروکسی سرور فقط درخواست شما رو دریافت اون رو اجرا و در نهایت پاسخ رو به شما انتقال میده همین .”
پس ما با یه CURL
میتونیم از طریق یه سرور خارجی یه سایت که فقط با پروکسی نشون میده رو بگیریم و نشون بدیم؟؟؟
درسته؟
سلام ممنون. خوشحالیم که مفید واقع شده.
بله دقیقا میتونید.
موفق باشید.