কিভাবে এএসপি.নেটে কোনও ব্যবহারকারীর ক্লায়েন্টের আইপি ঠিকানা পাবেন?


387

আমাদের Request.UserHostAddressএএসপি.নেটে আইপি ঠিকানা পেতে হবে, তবে এটি সাধারণত ব্যবহারকারীর আইএসপির আইপি ঠিকানা, ব্যবহারকারীর মেশিনের আইপি অ্যাড্রেস হুবহু নয়, যিনি উদাহরণস্বরূপ কোনও লিঙ্ক ক্লিক করেছেন। আমি কীভাবে আসল আইপি ঠিকানা পেতে পারি?

উদাহরণস্বরূপ, স্ট্যাক ওভারফ্লো ব্যবহারকারীর প্রোফাইলে এটি হ'ল: "সর্বশেষ অ্যাকাউন্টের ক্রিয়াকলাপ: 86 ঘন্টা আগে 86.123.127.8" , তবে আমার মেশিনের আইপি ঠিকানাটি কিছুটা আলাদা। স্ট্যাক ওভারফ্লো কীভাবে এই ঠিকানাটি পাবেন?

কিছু ওয়েব সিস্টেমে কিছু উদ্দেশ্যে একটি আইপি ঠিকানা চেক থাকে। উদাহরণস্বরূপ, একটি নির্দিষ্ট আইপি ঠিকানা সহ, প্রতি 24 ঘন্টা ব্যবহারকারীর ডাউনলোড লিঙ্কগুলিতে কেবল 5 টি ক্লিক থাকতে পারে? এই আইপি ঠিকানাটি অনন্য হওয়া উচিত, কোনও আইএসপি-র পক্ষে নয় যা ক্লায়েন্ট বা ইন্টারনেট ব্যবহারকারীদের একটি বিশাল পরিসীমা রয়েছে।

আমি কি ভাল বুঝতে পারি?


4
তারা সাধারণত একই কাজ করে এবং ভাগ করা আইপি ঠিকানাগুলির জন্য সঠিকভাবে কাজ করে না। এই অঞ্চলে বেশি কিছু করা যায় না।
মেহরদাদ আফশারি

আপনি যে সমস্যাটি এখানে সমাধান করার চেষ্টা করছেন তা কী, আপনি কেন মনে করেন যে আপনার আইপি ঠিকানা প্রয়োজন?
স্টিভ

3
আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে যা একটি নির্দিষ্ট লিঙ্কের ক্লিকগুলি পরীক্ষা করে এবং একটি নির্দিষ্ট ব্যবহারকারী (আইপি দ্বারা) লিঙ্কটি দিনে 5 বারের বেশি ক্লিক করতে পারে না pro সমস্যাটি হ'ল অনুরোধটি যদি হয়। একটি নির্দিষ্ট ব্যবহারকারীর এক?
মেহেদি

উত্তর:


142

অন্যরা যেমন বলেছে আপনি যা চাইছেন আপনি তা করতে পারবেন না। আপনি যদি সমস্যাটি সমাধান করার চেষ্টা করছেন তা বর্ণনা করে যদি কেউ সাহায্য করতে পারে?

যেমন

  • আপনি কি আপনার ব্যবহারকারীদের অনন্যভাবে সনাক্ত করার চেষ্টা করছেন?
  • আপনি কি আইপি ঠিকানার পরিবর্তে কোনও কুকি বা সেশন আইডি ব্যবহার করতে পারেন?

সম্পাদন করাআপনি সার্ভারে যে ঠিকানাটি দেখছেন তা ISP এর ঠিকানা হওয়া উচিত নয়, কারণ আপনি বলছেন যে এটি একটি বিশাল পরিসীমা হবে। ব্রডব্যান্ডে কোনও বাড়ির ব্যবহারকারীর জন্য ঠিকানাটি তাদের রাউটারের ঠিকানা হবে, তাই ঘরের অভ্যন্তরের প্রতিটি ডিভাইস বাইরের অংশে একইরূপে উপস্থিত হবে, তবে রাউটারটি প্রতিটি ডিভাইসে ট্র্যাফিক সঠিকভাবে চালিত হয়েছে তা নিশ্চিত করতে NAT ব্যবহার করে। অফিস পরিবেশ থেকে ব্যবহারকারীদের জন্য ঠিকানাটি সমস্ত ব্যবহারকারীর জন্য একই রকম হতে পারে। আইডির জন্য আইপি ঠিকানা ব্যবহার করা সাইটগুলি এটি খুব ভুল হওয়ার ঝুঁকি নিয়ে চলে - আপনি যে উদাহরণগুলি দেন তা ভাল এবং সেগুলি প্রায়শই ব্যর্থ হয়। উদাহরণস্বরূপ আমার অফিস যুক্তরাজ্যে, ব্রেকআউট পয়েন্ট (যেখানে আমি ইন্টারনেটে উপস্থিত হতে "উপস্থিত") অন্য একটি দেশে রয়েছে যেখানে আমাদের মূল আইটি সুবিধা রয়েছে, তাই আমার অফিস থেকে আমার আইপি ঠিকানাটি যুক্তরাজ্যে নেই বলে মনে হয়। এই কারণে আমি যুক্তরাজ্যের কেবলমাত্র ওয়েব সামগ্রী অ্যাক্সেস করতে পারি না, যেমন বিবিসি আইপ্লেয়ার)। যে কোনও সময়ে আমার সংস্থার কয়েক হাজার বা এমনকি হাজার হাজার লোক থাকবে যারা একই আইপি ঠিকানা থেকে ওয়েবে অ্যাক্সেস করছে বলে মনে হচ্ছে।

আপনি যখন সার্ভার কোড লিখছেন তখন আপনি কখনই নিশ্চিত হতে পারবেন না যে আপনি যে আইপি ঠিকানাটি দেখছেন সেটি উল্লেখ করছে। কিছু ব্যবহারকারী এটি পছন্দ করেন। কিছু লোক ইচ্ছাকৃতভাবে আপনাকে আরও বিভ্রান্ত করার জন্য একটি প্রক্সি বা ভিপিএন ব্যবহার করে।

আপনি যখন বলছেন যে আপনার মেশিনের ঠিকানা স্ট্যাকওভারফ্লোতে দেখানো আইপি ঠিকানার চেয়ে আলাদা, আপনি কীভাবে নিজের মেশিনের ঠিকানা খুঁজে পাচ্ছেন? আপনি যদি কেবল স্থানীয়ভাবে ব্যবহার করছেন ipconfigবা এর মতো কিছু দেখছেন তবে আমি উপরে বর্ণিত কারণগুলির জন্য এটি অন্যরকম হওয়ার আশা করব। আপনি যদি ডাবল পরীক্ষা করতে চান তবে বাইরের বিশ্ব কী চিন্তা করে তা কি আইসেমিপ্যাডড্রেস . com/ দেখুন

NATউইকিপিডিয়া লিঙ্কটি আপনাকে এর কিছু পটভূমি সরবরাহ করবে।


তাই আমি সার্ভার সাইড অ্যাপ্লিকেশনগুলিতে বুঝলাম আমরা আইপি ঠিকানার বিষয়ে নিশ্চিত হতে পারি না। এর অর্থ ক্লায়েন্ট সাইড প্রোগ্রামিং এর সমাধান কি ?? আপনি উদাহরণস্বরূপ কিছু জাভাস্ক্রিপ্ট কোড দিয়ে বলতে চাইছেন আমরা তা করতে পারি ??
মেহেদী

11
না, এটি অর্থহীন হবে, ক্লায়েন্টের "IP" ঠিকানাটি এটি মনে করে যে এটি বাড়ি বা অফিসের অভ্যন্তরীণ হবে, এটি বাইরের বিশ্বে অর্থহীন হবে। উদাহরণস্বরূপ, বেশিরভাগ হোম রাউটারগুলি 192.168.1.xxx রেঞ্জের আইপি ঠিকানাগুলি সরবরাহ করে, তাই হাজার হাজার মেশিনের নিজস্ব নেটওয়ার্কগুলিতে একই ঠিকানা থাকে।
স্টিভ

12
না, এটি অনন্য নয়। NAT ব্যবহার করে একই রাউটারের পিছনে দু'জন ব্যবহারকারীর একই আইপি ঠিকানা থাকবে। আমি সত্যিই মনে করি আপনার এটি পড়তে হবে, আমার সম্পাদনায় লিঙ্কটি দেখুন।
স্টিভ

1
সুতরাং কেন এডাব্লুএস, আউজুর ইত্যাদির মতো সংস্থাগুলি সুরক্ষা গোষ্ঠী বিধিগুলিতে আইপি ঠিকানা ব্যবহার করে এবং কেবল সেই আইপি-ঠিকানাটি ভিএম-এর সাথে সংযোগ করার অনুমতি দেয়?

2
@ ব্যবহারকারী5950947: কারণ অ্যাজুরে আশা করছেন আপনি একটি স্ট্যাটিক পাবলিক আইপি অ্যাড্রেস সহ একটি সংস্থা হবেন। এটি ধরে নেওয়া নিরাপদ যে আপনার সংস্থা কেবলমাত্র সর্বজনীন আইপি ঠিকানা থেকে অ্যাক্সেস করবে, সুতরাং এটি একটি দুর্দান্ত যুক্ত সুরক্ষা বৈশিষ্ট্য। তবে আইপি অ্যাড্রেসগুলি নকল হতে পারে বা আপনার নেটওয়ার্ক হ্যাক করা যায়, তাই এটি কেবলমাত্র একমাত্র সুরক্ষা হওয়া উচিত নয়।
Deantwo

449

প্রায়শই আপনি আপনার ওয়েবসাইটে যে কোনও ব্যক্তির আইপি ঠিকানা জানতে চাইবেন। যদিও এএসপি.এনইটির কাছে আমরা দেখেছি যে সেরা উপায়গুলির মধ্যে এটির বেশ কয়েকটি উপায় রয়েছে তা হ'ল সার্ভারভেরিবল সংগ্রহের "HTTP_X_FORWARDED_FOR" ব্যবহার করে।

কারণটা এখানে...

কখনও কখনও আপনার দর্শনার্থীরা প্রক্সি সার্ভার বা রাউটারের পিছনে থাকে এবং Request.UserHostAddressমানকরা কেবল প্রক্সি সার্ভার বা রাউটারের আইপি ঠিকানাটি ধারণ করে। এই ক্ষেত্রে যখন ব্যবহারকারীর আইপি ঠিকানাটি সার্ভার ভেরিয়েবলে সংরক্ষণ করা হয় ("HTTP_X_FORWARDED_FOR")।

সুতরাং আমরা যা করতে চাই তা হ'ল প্রথমে "HTTP_X_FORWARDED_FOR" চেক করুন এবং যদি তা খালি হয় তবে আমরা কেবল ফিরে যাব ServerVariables("REMOTE_ADDR")

যদিও এই পদ্ধতিটি নির্বোধ নয়, এটি আরও ভাল ফলাফলের দিকে নিয়ে যেতে পারে। নীচে ভিবি.এনইটি-র এএসপি.নেট কোড রয়েছে, জেমস ক্রোলির ব্লগ পোস্ট "গোটা: HTTP_X_FORWARDED_FOR একাধিক আইপি ঠিকানা ফেরায়" থেকে নেওয়া

সি শার্প

protected string GetIPAddress()
{
    System.Web.HttpContext context = System.Web.HttpContext.Current; 
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }

    return context.Request.ServerVariables["REMOTE_ADDR"];
}

VB.NET

Public Shared Function GetIPAddress() As String
    Dim context As System.Web.HttpContext = System.Web.HttpContext.Current
    Dim sIPAddress As String = context.Request.ServerVariables("HTTP_X_FORWARDED_FOR")
    If String.IsNullOrEmpty(sIPAddress) Then
        Return context.Request.ServerVariables("REMOTE_ADDR")
    Else
        Dim ipArray As String() = sIPAddress.Split(New [Char]() {","c})
        Return ipArray(0)
    End If
End Function

24
সুরক্ষা উদ্দেশ্যে এই কোডটি ব্যবহার না করা নিশ্চিত হন কারণ যে কেউ HTTP_X_FORWARDED_FOR বা অনুরূপ শিরোনাম নকল করতে পারে। সুতরাং আপনি যদি সুরক্ষা সম্পর্কিত লগিং বা সুরক্ষা পরীক্ষার জন্য এটি ব্যবহার করেন তবে আক্রমণকারী সহজেই এটিকে বাইপাস করতে পারে।
ড। মন্দ

4
আপনার লিঙ্ক থেকে what we actually needed to be doing was take the last IP address, তবে আপনার কোডটি প্রথমটি পায় addresses[0]। যা সঠিক?
নেলসন রোদারমেল

4
@NelsonRothermel ভিত্তি করে en.wikipedia.org/wiki/X-Forwarded-For#Format আপনি ক্লায়েন্ট (বদলে পূর্ববর্তী প্রক্সি) তাহলে ব্যবহার করতে চান তাহলে প্রথমে
রিচার্ড

4
@ dr.evil তাহলে আপনি এর পরিবর্তে কী প্রস্তাব করবেন? কারণ আমি নির্দিষ্ট আইপি দ্বারা ডাব্লুসিএফ পরিষেবার জন্য অ্যাক্সেস সেট করতে চাই।
ক্রিপ্রু

7
addresses.Length != 0না প্রয়োজন হয় তাহলে, যেহেতু এটা 0. হতে পারে
জেমস উইলকিন্স

78

আপডেট: ব্রুনো লোপসকে ধন্যবাদ। যদি বেশ কয়েকটি আইপি ঠিকানা আসতে পারে তবে এই পদ্ধতিটি ব্যবহার করতে হবে:

    private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }

3
অন্য উত্তরে উল্লিখিত হিসাবে, HTTP_X_FORWARDED_FOR কমা দ্বারা পৃথক করা আইপিগুলির একটি তালিকা হতে পারে।
ব্রুনো লোপস

ফাংশনের প্রতিক্রিয়ায় আমি কেবল প্রতিবার :: 1 পেয়েছি। আমি কি পুরো আইপি ঠিকানা পেতে পারি না ???
ফরহ্যাংডন

1
এটি স্থানীয় হোস্টে :: 1 ফিরে আসবে। productino পরিবেশে এটি চেষ্টা করুন এবং এটি ঠিক করা উচিত fine
বেনি মার্সালিত

1
@ ফারহ্যাংডন, নীচের কোডটি স্থানীয় হোস্টে আইপি ঠিকানা ফেরত দেবে যেমন @ ব্যাট_প্রোগ্রামার নীচে লিখেছেনSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
বেনি মার্গালিট

এটি করবেন না! কেবলমাত্র তালিকার প্রথম আইপি ঠিকানাটি ব্যবহার না করার বিষয়ে সতর্কতা অবলম্বন করুন। ম্যান-ইন-দ্য-মধ্যম আক্রমণ এবং হেডার স্পোফিং এড়াতে আপনার ডান দিকের প্রবেশদ্বার থেকে শুরু করা জ্ঞাত প্রক্সি আইপিগুলি এড়িয়ে যাওয়া উচিত।
জেপিসি

24

যদি সি হয় # এই ভাবে দেখুন, খুব সহজ

string clientIp = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
                   Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

8
যদি উভয় সার্ভারের ভেরিয়েবলগুলি নাল হতে পারে তবে এটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে।
মাইকেল ফ্রেইজিম

অনুরোধ এখানে রেফারেন্সিং কি? আমি সার্ভারে ভেরিয়েবলগুলি খুঁজে পেল না
ব্রাউনবাগার 11

23

আপনি আর কি ব্যবহারকারীর আইপি ঠিকানা বিবেচনা করবেন? আপনি যদি নেটওয়ার্ক অ্যাডাপ্টারের আইপি ঠিকানা চান তবে আমি ভয় করি যে এটি কোনও ওয়েব অ্যাপে করার কোনও সম্ভাব্য উপায় নেই। যদি আপনার ব্যবহারকারী NAT বা অন্যান্য জিনিসগুলির পিছনে থাকে তবে আপনি আইপিও পেতে পারেন না।

আপডেট : এমন কোনও ওয়েব সাইট রয়েছে যা ব্যবহারকারীর সীমাবদ্ধ করতে আইপি ব্যবহার করে (র‌্যাপিডশেয়ারের মতো), তারা NAT পরিবেশে সঠিকভাবে কাজ করে না।


22

আমি মনে করি আমার অভিজ্ঞতা আমার সবার সাথে শেয়ার করা উচিত। ভাল আমি কিছু পরিস্থিতিতে REMOTE_ADDR দেখতে পাচ্ছি আপনি যা খুঁজছেন তা পাবেন না। উদাহরণস্বরূপ, যদি আপনার দৃশ্যের পিছনে কোনও লোড ব্যালান্সার থাকে এবং আপনি যদি ক্লায়েন্টের আইপি পাওয়ার চেষ্টা করছেন তবে আপনি সমস্যায় পড়বেন। আমি আমার আইপি মাস্কিং সফটওয়্যারটি দিয়ে এটি পরীক্ষা করেছি এবং আমার সহকর্মীদের সাথে বিভিন্ন মহাদেশে থাকার বিষয়টিও পরীক্ষা করেছিলাম। সুতরাং এখানে আমার সমাধান।

যখন আমি কোনও ক্লায়েন্টের আইপি জানতে চাই, আমি প্রতিটি সম্ভাব্য প্রমাণ বাছাই করার চেষ্টা করি যাতে তারা অনন্য কিনা তা আমি নির্ধারণ করতে পারি:

এখানে আমি আরেকটি সেভার-ভার পেয়েছি যা যদি আপনি ক্লায়েন্ট পক্ষের সঠিক আইপি পেতে চান তবে আপনাকে সকলকে সহায়তা করতে পারে। সুতরাং আমি ব্যবহার করছি: HTTP_X_CLUSTER_CLIENT_IP

HTTP_X_CLUSTER_CLIENT_IP সর্বদা আপনাকে ক্লায়েন্টের সঠিক আইপি দেয়। যে কোনও ক্ষেত্রে যদি এটি আপনাকে মূল্য না দেয় তবে আপনাকে এইচটিটিপি_এক্স_ফোরওয়ার্ডED_FOR সন্ধান করা উচিত কারণ এটি আপনাকে ক্লায়েন্টের আইপি পাওয়ার জন্য দ্বিতীয় সেরা প্রার্থী এবং তারপরে REMOTE_ADDR ভেরি যা আপনাকে আইপি ফিরিয়ে দিতে পারে বা নাও করতে পারে তবে আমার কাছে এই সবগুলি রয়েছে তিনটি আমি তাদের নিরীক্ষণ করার জন্য সবচেয়ে ভাল জিনিসটি পাই find

আমি আশা করি এটি কিছু ছেলেদের সহায়তা করে।


এটি বলা দরকার যে http_x _... শিরোনামগুলি দূরবর্তী_আড্ডার ভেরিয়েবলের প্রতি সহজেই ছলনা করা যায়। এবং তাই ক্লায়েন্ট আইপি ঠিকানার জন্য রিমোট_এডিডিআর সবচেয়ে নির্ভরযোগ্য উত্স।
Ciro Corvino

1
@ সিরোকর্ভিনো আপনি ঠিক বলেছেন তবে আপনি যখন আপনার ওয়েবসাইটটি এমন একটি সার্ভারে হোস্ট করেছেন যা লোড ব্যালেন্সারের পিছনে চলছে (যেমন আমি ইতিমধ্যে আমার পোস্টে উল্লেখ করেছি) তখন রিমোট_আড্ডার আপনাকে যে আইপিটি খুঁজছেন তা দেবে না। আপনি যা বলছেন তা আমি অভিজ্ঞতা অর্জন করেছি তবে যখন আমি যা বলেছি সেগুলি সমাধানের জন্য আমার পক্ষে সবচেয়ে ভাল কাজ করে।
কেএমএক্স

দুঃখিত @ কেএমএক্স, বাস্তবে আমি অনুরোধের উত্স সম্পর্কে কিছু ধারণা অনুমান করতে রিমোট_এডিডিআর এবং http_x_ ফরোয়ার্ডের সংমিশ্রণটিও ব্যবহার করি। আপনি যদি আপনার পোস্টটি সম্পাদনা করেন তবে আমি আমার ভোট আপডেট করি
Ciro Corvino

15

তুমি ব্যবহার করতে পার:

System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList.GetValue(0).ToString();

1
ধন্যবাদ, আমার জন্য এটিই একমাত্র পদ্ধতি যা স্থানীয় হোস্টে সত্যিকার অর্থে আমার আইপি ফিরিয়ে দেয়।
বেনি মার্সালিট

আসলে আমি স্থানীয় হোস্ট আইপি ঠিকানাটি পেতে যা ব্যবহার করেছি তা হ'লSystem.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName()).AddressList[1].ToString();
বেনি মার্গালিট

1
এই কোডটি কেবল আমার জন্য কাজ করে এবং আমি যথাক্রমে getValue (0) এবং getValue (1) ব্যবহার করে আইপিভি 6 এবং আইপিভি 4 পেতে সক্ষম হয়েছি। ধন্যবাদ আপভোটেড!
রাজ বড়াল

যাইহোক, আমি এই Request for the permission of type 'System.Net.DnsPermission, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
ফল্লিতে

ওপি কীভাবে নিজের লোকালহোস্টের ঠিকানা নয়, দূরবর্তী ওয়েব ব্যবহারকারীর আইপি কীভাবে পাবেন তা জিজ্ঞাসা করছেন।
t.durden

13

আইপি অ্যাড্রেসগুলি "সাত স্তরের স্ট্যাক" এর নেটওয়ার্ক স্তরের অংশ। নেটওয়ার্ক স্তরটি আইপি ঠিকানার সাথে যা করতে চায় তা করতে পারে। প্রক্সি সার্ভার, NAT, রিলে বা যে কোনও কিছুতে যা ঘটে তা ঘটে।

অ্যাপ্লিকেশন স্তরটি কোনওভাবেই আইপি ঠিকানার উপর নির্ভর করবে না। বিশেষত, একটি আইপি অ্যাড্রেস বলতে কোনও নেটওয়ার্ক সংযোগের এক প্রান্তের আইডেন্টিফায়ার ব্যতীত অন্য কোনও কিছুর সনাক্তকারী হিসাবে বোঝানো হয় না। কোনও সংযোগ বন্ধ হওয়ার সাথে সাথে আপনার আইপি ঠিকানাটি (একই ব্যবহারকারীর) পরিবর্তনের আশা করা উচিত।


1
এগুলি সব ভাল এবং ভাল, তবে যখন আপনি বহু-ভাড়াটে সিস্টেমের একজন গ্রাহক তাদের ব্যবহারকারীদের অ্যাকাউন্ট কেবল একটি নির্দিষ্ট আইপি ঠিকানা থেকে লগইন করতে পারেন এমন দাবি করেন?
রনি ওভারবি

1
তারপরে তাদের আপনাকে জানাতে হবে যে আপনার সার্ভারটি কোন আইপি ঠিকানাটি দেখতে পাবে। তাদের যদি সেখানে কোনও নির্দিষ্ট ঠিকানা প্রয়োজন হয় তবে তারা কোনও NAT বা অনুরূপ পেছনে থাকতে পারবে না।
জন স্যান্ডার্স

@ রনিওভারে আমি একই পরিস্থিতিতে আছি আমার জানা দরকার যে তারা কোন আইপি থেকে সংযুক্ত হচ্ছে এবং এটি অবশ্যই আমার শ্বেতলিস্টে থাকা উচিত। তারপরে অ্যাপ্লিকেশনটি তাদের আইপির উপর ভিত্তি করে নির্দিষ্ট কার্যকারিতা চালু বা বন্ধ করতে পারে। গ্রাহক এটিই চান।
t.durden

10

এখনও অবধি সমস্ত প্রতিক্রিয়া অ্যাকাউন্টে মানহীন, তবে খুব সাধারণ, X-Forwarded-Forশিরোনাম গ্রহণ করে। এখানে একটি মানক Forwardedশিরোনাম রয়েছে যা পার্স করা আরও একটু কঠিন e কয়েকটি উদাহরণ নিম্নরূপ:

Forwarded: for="_gazonk"
Forwarded: For="[2001:db8:cafe::17]:4711"
Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43
Forwarded: for=192.0.2.43, for=198.51.100.17

আমি একটি ক্লাস লিখেছি যা কোনও ক্লায়েন্টের আইপি অ্যাড্রেস নির্ধারণের সময় এই উভয় শিরোনামকে অ্যাকাউন্টে নেয়।

using System;
using System.Web;

namespace Util
{
    public static class IP
    {
        public static string GetIPAddress()
        {
            return GetIPAddress(new HttpRequestWrapper(HttpContext.Current.Request));
        }

        internal static string GetIPAddress(HttpRequestBase request)
        {
            // handle standardized 'Forwarded' header
            string forwarded = request.Headers["Forwarded"];
            if (!String.IsNullOrEmpty(forwarded))
            {
                foreach (string segment in forwarded.Split(',')[0].Split(';'))
                {
                    string[] pair = segment.Trim().Split('=');
                    if (pair.Length == 2 && pair[0].Equals("for", StringComparison.OrdinalIgnoreCase))
                    {
                        string ip = pair[1].Trim('"');

                        // IPv6 addresses are always enclosed in square brackets
                        int left = ip.IndexOf('['), right = ip.IndexOf(']');
                        if (left == 0 && right > 0)
                        {
                            return ip.Substring(1, right - 1);
                        }

                        // strip port of IPv4 addresses
                        int colon = ip.IndexOf(':');
                        if (colon != -1)
                        {
                            return ip.Substring(0, colon);
                        }

                        // this will return IPv4, "unknown", and obfuscated addresses
                        return ip;
                    }
                }
            }

            // handle non-standardized 'X-Forwarded-For' header
            string xForwardedFor = request.Headers["X-Forwarded-For"];
            if (!String.IsNullOrEmpty(xForwardedFor))
            {
                return xForwardedFor.Split(',')[0];
            }

            return request.UserHostAddress;
        }
    }
}

নীচে কিছু ইউনিট পরীক্ষা দেওয়া আছে যা আমি আমার সমাধানটি বৈধ করতে ব্যবহার করেছি:

using System.Collections.Specialized;
using System.Web;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UtilTests
{
    [TestClass]
    public class IPTests
    {
        [TestMethod]
        public void TestForwardedObfuscated()
        {
            var request = new HttpRequestMock("for=\"_gazonk\"");
            Assert.AreEqual("_gazonk", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv6()
        {
            var request = new HttpRequestMock("For=\"[2001:db8:cafe::17]:4711\"");
            Assert.AreEqual("2001:db8:cafe::17", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4()
        {
            var request = new HttpRequestMock("for=192.0.2.60;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedIPv4WithPort()
        {
            var request = new HttpRequestMock("for=192.0.2.60:443;proto=http;by=203.0.113.43");
            Assert.AreEqual("192.0.2.60", Util.IP.GetIPAddress(request));
        }

        [TestMethod]
        public void TestForwardedMultiple()
        {
            var request = new HttpRequestMock("for=192.0.2.43, for=198.51.100.17");
            Assert.AreEqual("192.0.2.43", Util.IP.GetIPAddress(request));
        }
    }

    public class HttpRequestMock : HttpRequestBase
    {
        private NameValueCollection headers = new NameValueCollection();

        public HttpRequestMock(string forwarded)
        {
            headers["Forwarded"] = forwarded;
        }

        public override NameValueCollection Headers
        {
            get { return this.headers; }
        }
    }
}

9

আপনি যদি ক্লাউডফ্লেয়ার ব্যবহার করছেন তবে আপনি এই এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন :

public static class IPhelper
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

        return Request.UserHostAddress;
    }
}

তারপর

string IPAddress = Request.GetIPAddress();

এবং F5 বা Palo Alto ব্যবহার করছেন?
কিকিনেট

8
string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress;

7

আপনি যা করতে পারেন তা হ'ল আপনার ব্যবহারকারীর রাউটার আইপি এবং ফরোয়ার্ড আইপি সংরক্ষণ এবং এটি আইপি [বহিরাগত পাবলিক এবং অভ্যন্তরীণ প্রাইভেট] উভয়ই ব্যবহার করে এটি নির্ভরযোগ্য করার চেষ্টা করুন। তবে কিছু দিন পরে ক্লায়েন্টকে রাউটার থেকে নতুন অভ্যন্তরীণ আইপি অর্পণ করা যেতে পারে তবে এটি আরও নির্ভরযোগ্য হবে।


5

@ টনি এবং @ মঙ্গোকুনের উত্তরগুলির সংমিশ্রণে , আমি নিম্নলিখিত এক্সটেনশন পদ্ধতিটি তৈরি করেছি:

public static class RequestExtensions
{
    public static string GetIPAddress(this HttpRequest Request)
    {
        if (Request.Headers["CF-CONNECTING-IP"] != null) return Request.Headers["CF-CONNECTING-IP"].ToString();

        if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
        {
            string ipAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (!string.IsNullOrEmpty(ipAddress))
            {
                string[] addresses = ipAddress.Split(',');
                if (addresses.Length != 0)
                {
                    return addresses[0];
                }
            }
        }

        return Request.UserHostAddress;
    }
}

আপনি কেন ব্যবহার করবেন HTTP_X_FORWARDED_FORনা X_FORWARDED_FOR? তারা কি একই?
ইগর ইয়ালভয়

3

অ্যাশএক্স ফাইল ব্যবহার করুন

public string getIP(HttpContext c)
{
    string ips = c.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ips))
    {
        return ips.Split(',')[0];
    }
    return c.Request.ServerVariables["REMOTE_ADDR"];
}

2
public static class Utility
{
    public static string GetClientIP(this System.Web.UI.Page page)
    {
        string _ipList = page.Request.Headers["CF-CONNECTING-IP"].ToString();
        if (!string.IsNullOrWhiteSpace(_ipList))
        {
            return _ipList.Split(',')[0].Trim();
        }
        else
        {
            _ipList = page.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"];
            if (!string.IsNullOrWhiteSpace(_ipList))
            {
                return _ipList.Split(',')[0].Trim();
            }
            else
            {
                _ipList = page.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (!string.IsNullOrWhiteSpace(_ipList))
                {
                    return _ipList.Split(',')[0].Trim();
                }
                else
                {
                    return page.Request.ServerVariables["REMOTE_ADDR"].ToString().Trim();
                }
            }
        }
    }
}

ব্যবহার করুন

string _ip = this.GetClientIP();


-1

হ্যালো বলছি, আপনি যে বেশিরভাগ কোডগুলি খুঁজে পাবেন সেগুলি আপনাকে সার্ভার আইপি ঠিকানাটি ক্লায়েন্ট আইপি ঠিকানা নয়, ফিরিয়ে দেবে ow যাইহোক এই কোডটি সঠিক ক্লায়েন্ট আইপি ঠিকানা ফেরত দেয় it চেষ্টা করে দেখুন। আরও তথ্যের জন্য কেবল এটি পরীক্ষা করে দেখুন

https://www.youtube.com/watch?v=Nkf37DsxYjI

জাভাস্ক্রিপ্ট ব্যবহার করে আপনার স্থানীয় আইপি ঠিকানা পাওয়ার জন্য আপনি এই স্ক্রিপ্ট ট্যাগের মধ্যে এই কোডটি ব্যবহার করতে পারেন

<script>
    var RTCPeerConnection = /*window.RTCPeerConnection ||*/
     window.webkitRTCPeerConnection || window.mozRTCPeerConnection;

         if (RTCPeerConnection) (function () {
             var rtc = new RTCPeerConnection({ iceServers: [] });
             if (1 || window.mozRTCPeerConnection) {      
                 rtc.createDataChannel('', { reliable: false });
             };

             rtc.onicecandidate = function (evt) {

                 if (evt.candidate)
                     grepSDP("a=" + evt.candidate.candidate);
             };
             rtc.createOffer(function (offerDesc) {
                 grepSDP(offerDesc.sdp);
                 rtc.setLocalDescription(offerDesc);
             }, function (e) { console.warn("offer failed", e); });


             var addrs = Object.create(null);
             addrs["0.0.0.0"] = false;
             function updateDisplay(newAddr) {
                 if (newAddr in addrs) return;
                 else addrs[newAddr] = true;
                 var displayAddrs = Object.keys(addrs).filter(function
(k) { return addrs[k]; });
                 document.getElementById('list').textContent =
displayAddrs.join(" or perhaps ") || "n/a";
             }

             function grepSDP(sdp) {
                 var hosts = [];
                 sdp.split('\r\n').forEach(function (line) { 
                     if (~line.indexOf("a=candidate")) {   
                         var parts = line.split(' '),   
                             addr = parts[4],
                             type = parts[7];
                         if (type === 'host') updateDisplay(addr);
                     } else if (~line.indexOf("c=")) {      
                         var parts = line.split(' '),
                             addr = parts[2];
                         updateDisplay(addr);
                     }
                 });
             }
         })(); else
         {
             document.getElementById('list').innerHTML = "<code>ifconfig| grep inet | grep -v inet6 | cut -d\" \" -f2 | tail -n1</code>";
             document.getElementById('list').nextSibling.textContent = "In Chrome and Firefox your IP should display automatically, by the power of WebRTCskull.";

         }




</script>
<body>
<div id="list"></div>
</body>

এবং আপনার সর্বজনীন আইপি ঠিকানা পাওয়ার জন্য আপনি এই স্ক্রিপ্ট ট্যাগের মধ্যে এই কোডটি ব্যবহার করতে পারেন

  function getIP(json) {
    document.write("My public IP address is: ", json.ip);
  }


<script type="application/javascript" src="https://api.ipify.org?format=jsonp&callback=getIP"></script>

-3

এটা ব্যবহার কর

Dns.GetHostEntry(Dns.GetHostName())

4
Dns.GetHostEntry getHostEntry পদ্ধতি একটি হোস্টের নাম বা আইপি ঠিকানার সাথে সম্পর্কিত আইপি ঠিকানার জন্য একটি ডিএনএস সার্ভারকে জিজ্ঞাসা করে। পড়ুন msdn.microsoft.com/en-us/library/ms143998(v=vs.80).aspx
মিলিন্দ থ্যাকার

-7

চেষ্টা করুন:

using System.Net;

public static string GetIpAddress()  // Get IP Address
{
    string ip = "";     
    IPHostEntry ipEntry = Dns.GetHostEntry(GetCompCode());
    IPAddress[] addr = ipEntry.AddressList;
    ip = addr[2].ToString();
    return ip;
}
public static string GetCompCode()  // Get Computer Name
{   
    string strHostName = "";
    strHostName = Dns.GetHostName();
    return strHostName;
}

এটি সার্ভারের আইপি ঠিকানাটি দেয়
শ্রিকুমার পি

এটি এসপ নেট সম্পর্কে, যা একটি ওয়েব অ্যাপ্লিকেশন, যা একটি সার্ভারে চলে, ব্যবহারকারীদের কম্পিউটারে নয়।
দোকমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.