ASP.NET अनुरोध जालसाजी (XSRF/CSRF) इस कोर में संरक्षण

पेज अद्यतन :
पेज निर्माण की तारीख :

वातावरण

विजुअल स्टूडियो
  • विजुअल स्टूडियो 2019
ASP.NET कोर
  • 3.0
  • 3.1

क्रॉस-साइट अनुरोध जालसाजी क्या है?

क्रॉस-साइट अनुरोध जालसाजी (सीएसआरएफ/एक्सएसआरएफ) उन लोगों के लिए है जो केवल ब्याज की साइट के भीतर संसाधित किए जाते हैं। एक बाहरी साइट से इस तरह की अद्यतन प्रक्रिया करता है कि एक भेद्यता पर हमला।

उदाहरण के लिए, मान लीजिए कि आपके पास वेबसाइट पर टिप्पणियां पोस्ट करने की क्षमता है। आम तौर पर, मुझे लगता है कि आप साइट से एक टिप्पणी दर्ज करके पोस्ट करेंगे, इस भेज प्रक्रिया का उपयोग अक्सर लक्ष्य यूआरएल पर डेटा फेंकने के लिए किया जाता है।

इसलिए, यदि आप लक्ष्य साइट के अलावा किसी अन्य व्यक्ति से यूआरएल को समान डेटा भेजते हैं, यह वही इलाज है जिसे आपने पोस्ट किया था।

अगर केवल एक हमलावर ऐसा करेगा, तो यह खतरा नहीं होगा । CSRF के बारे में डरावनी बात यह है कि हमलावरों नकली साइटों का निर्माण या साइट में छिपा यूआरएल एंबेड कर सकते हैं । यह वह जगह है जहां कोई और अनजाने में इसे एक्सेस करता है और हमलावर बन जाता है।

मैं यहां गहराई में नहीं जाऊंगा, इसलिए कृपया क्रॉस-साइट अनुरोध जालसाजी के बारे में अधिक जानकारी प्राप्त करें।

ASP.NET कोर ढांचे में इस प्रतिकार को शामिल किया गया ।

काम करने के लिए क्रॉस-साइट अनुरोध जालसाजी की जांच करें

यह देखने का प्रयास करें कि अपडेट प्रक्रिया वास्तव में बाहरी साइटों या उपकरणों से की जाती है या नहीं।

Index.cshtml एक इनपुट फॉर्म बनाता है जो आपके द्वारा सर्वर पर दर्ज किए गए टेक्स्ट को भेजता है। फिर व्यूडेटा रखें ताकि सर्वर इनपुट टेक्स्ट से मेल खाने के लिए आपके द्वारा बनाए गए संदेशों को प्रदर्शित करे।

इंडेक्स.सीक्लकॉम

@{
  ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
  <input type="text" name="text" />
  <button type="submit">送信</button>
</form>

<p>@ViewData["Message"]</p>

सर्वर-साइड HomeController.cs भेजे गए टेक्स्ट को प्रोसेस करता है और इसे विजुअल स्टूडियो ट्रेस में आउटपुट करता है। व्यूडेटा के लिए एक ही पाठ सेट करें ताकि इसे क्लाइंट को प्रदर्शित किया जा सके।

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

आप सिर्फ सामान्य चरणों में बनाया कार्यक्षमता प्रदर्शन करने की कोशिश करो। जब आप डिबगिंग चलाते हैं और स्क्रीन दिखाई देती है, तो टेक्स्ट डालें और सबमिट बटन पर क्लिक करें।

प्रोसेस्ड टेक्स्ट उम्मीद के मुताबिक स्क्रीन पर दिखाई देता है।

क्योंकि यह भी ट्रेस करने के लिए आउटपुट है, दृश्य स्टूडियो आउटपुट विंडो पाठ भी प्रदर्शित करता है। वास्तव में, हम डेटाबेस में इनपुट डेटा दर्ज करने जैसे काम करते हैं, लेकिन हम यहां कोड को सरल नहीं बनाने जा रहे हैं।

अब, डिबगिंग और रनिंग करते समय लक्ष्य स्थल के बाहर से कार्यक्रम तक पहुंचने की कोशिश करें। सादगी के लिए, मैं विजुअल स्टूडियो कोड नामक टूल का उपयोग करके एक पोस्ट करूंगा। यदि आप पोस्ट भेज सकते हैं, तो आप अन्य उपकरणों का उपयोग कर सकते हैं या हमले के लिए किसी अन्य साइट कार्यक्रम का निर्माण कर सकते हैं।

जब आप विजुअल स्टूडियो कोड में रेस्ट क्लाइंट नामक एक्सटेंशन इंस्टॉल करते हैं, आप एक ऐसी सुविधा का उपयोग कर सकते हैं जो आपको बस .http फ़ाइल खोलकर रेस्ट एपीआई के ऑपरेशन की जांच करने की अनुमति देता है।

जब आप टेक्स्ट फ़ाइल में निम्नलिखित के समान .http फ़ाइल बनाते हैं, और फिर दृश्य स्टूडियो कोड में फ़ाइल खोलते हैं, आप भेजअनुरोध पर क्लिक करके GET या पोस्ट भेज सकते हैं।

यदि आप निम्नलिखित पोस्ट डेटा बनाते हैं, तो आपको स्क्रीन पर टेक्स्ट टाइप करने और सबमिट बटन दबाने के रूप में लगभग उतनी ही मात्रा में डेटा भेजा जाएगा। (लोकलहोस्ट पोर्ट नंबर निष्पादन वातावरण के समान होना चाहिए।

RestTest.http://www.restTest.http

### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--

जब आप इसे भेजते हैं, तो आप देख सकते हैं कि सर्वर टेक्स्ट प्राप्त कर रहा है और इसे संसाधित कर रहा है।

विजुअल स्टूडियो कोड के परिणाम प्राप्त कर सकते हैं। अगर आप रिजल्ट कोड को करीब से देखते हैं, तो आप देख सकते हैं कि व्यूडाटा के लिए निर्धारित मूल्य प्रदर्शित किया गया है. (यह यूनिकोड में प्रदर्शित किया जाता है, लेकिन यदि वेब ब्राउज़र में देखा जाता है तो पाठ सही ढंग से प्रदर्शित किया जाता है।

पता पार साइट अनुरोध जालसाजी भेद्यता

जैसा कि मैंने शुरुआत में उल्लेख किया है, ASP.NET कोर ढांचे में पार साइट अनुरोध जालसाजी के खिलाफ उपायों को शामिल किया गया । एक आम उपाय ग्राहक को पहले से एक अद्वितीय टोकन जारी करना है जिसके लिए पोस्ट आदि की आवश्यकता होती है। जब तक आप सर्वर पर टोकन नहीं फेंकते हैं, तब तक आपको प्रसंस्करण स्वीकार करने की ज़रूरत नहीं है।

बेशक, यदि आप सीधे बाहरी साइट से यूआरएल का उपयोग करते हैं, तो टोकन अज्ञात है और प्रसंस्करण स्वीकार नहीं करेगा।

सबसे पहले, मैं क्लाइंट (एचटीएमएल) को टोकन जारी करने के बारे में बात करना चाहूंगा, लेकिन तथ्य यह है कि फ्रेमवर्क ऐसा नहीं कर पा रहा है। जाऊंगा। यदि आप फॉर्म टैग में पोस्ट विधि निर्दिष्ट करते हैं, तो आप बिना अनुमति के एचटीएमएल में टोकन पैरामीटर शामिल कर सकते हैं।

नीचे दिए गए एचटीएमएल में, यह इनपुट नाम है = "__RequestVerificationToken" टाइप ="छिपा"। इसे एक साथ सर्वर पर भेजा जाता है जब सेंड बटन दबाया जाता है। वैसे, यह GET विधि से संलग्न नहीं है।

सर्वर की ओर से Startup.cs सेवाएं दी। ऐडकंट्रोलर्सWithअविके डडने के विकल्प। फ़िल्टर करने के लिए ऑटोवैलिडेएंटीफोरेज़रीटोकनडे, सभी क्रियाएं यह टोकन चेक स्वचालित रूप से जोड़ा जाता है (केवल पोस्ट, पुट, पैच और डिलीट के HTTP तरीकों का सटीक होना)।

यदि आप इस बाधा को केवल विशिष्ट कार्यों में जोड़ना चाहते हैं, तो प्रति नियंत्रक, प्रति कार्रवाई सभी कार्यों को प्रति कार्रवाई करने के लिए नहीं यह भी सेट करने के लिए संभव है ।

इसके विपरीत, यदि आप अधिकांश कार्यों पर प्रतिबंध लगाना चाहते हैं, लेकिन आप विशिष्ट कार्यों को बाहर करना चाहते हैं, यदि आप नियंत्रक और कार्रवाई के लिए IgnorAntiforgeryToken विशेषता सेट करते हैं, तो यह ठीक है।

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(options =>
  {
    // 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
    // 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
    // API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
  });
}

देखते हैं कि यह कैसे काम करता है। सबसे पहले, ट्रांसमिशन प्रक्रिया सामान्य रूप से स्क्रीन से की जाती है।

परिणाम उम्मीद के अनुसार स्क्रीन पर परिलक्षित हुए ।

यह भी ट्रेस करने के लिए आउटपुट है।

अब, आइए इसे बाहर से एक्सेस करने की कोशिश करें।

एक्सेस एड, लेकिन बुरा अनुरोध वापस कर दिया गया था । जब आप उपाय नहीं कर रहे हैं तो यह एक अलग परिणाम है। समझा जाता है कि इसका पहरा है क्योंकि यह ट्रेस करने के लिए आउटपुट नहीं है।

सारांश

इस बार मैंने क्रॉस-साइट अनुरोध जालसाजी के खिलाफ उपायों को लागू करने की कोशिश की। इसे लागू करना बहुत आसान था क्योंकि इसे पहले से ही ढांचे में बनाया गया था ।

एक वेब साइट के निर्माण के लिए सीएसआरएफ की तुलना में बहुत अधिक भेद्यता की आवश्यकता होती है। आप देख सकते हैं कि वहां क्या है, या आप अपनी साइट में कमजोरियों की जांच करने के लिए ओडब्ल्यूएसपी जैसे उपकरणों का उपयोग कर सकते हैं।