2009-01-27 10 views
15

मुझे .NET WebBrowser नियंत्रण को किसी भी दिखाने से रोकने की आवश्यकता है "क्या आप इस फ़ाइल को खोलना या सहेजना चाहते हैं?" और "के रूप में सहेजें" संवाद। इसके बजाय, मैं उपयोगकर्ताओं को बताते हुए एक संदेश बॉक्स प्रदर्शित करना चाहता हूं कि सुरक्षा कारणों से डाउनलोड फ़ाइल अक्षम हैं।.NET WebBrowser नियंत्रण में डाउनलोड को अवरुद्ध कैसे करें?

मैंने FileDownloadWebBrowser की घटना के साथ शुरुआत की, लेकिन यह रद्दीकरण की अनुमति नहीं देता है। फिर, मैंने इंटरफेस DWebBrowserEvents2 का उपयोग कर मूल COM कॉल के आधार पर अपनी खुद की घटना को लागू करने के लिए CodeProject: Extended .NET 2.0 WebBrowser Control से दृष्टिकोण का उपयोग किया। जब मैंने an MS knowledge base entry about a bug with the FileDownload signature के अनुसार कोड तय किया, तो ईवेंट हैंडलर को कॉल किया गया था और मैं डाउनलोड को रद्द करने में सक्षम था।

यह सभी डाउनलोड के साथ काम नहीं करता है, हालांकि: सहित .exe घटना को बढ़ाने और रद्द किया जा सकता से पहले संवाद प्रकट होता है एक URL की ओर इशारा URL डाउनलोड - (जैसे .do), लेकिन दूसरों के लिए, ईवेंट हैंडलर तक नहीं बुलाया जाता है उपयोगकर्ता संवाद में Open, Save या Cancel पर क्लिक करता है।

सम्भावित समाधान intercept WH_CALLWNDPROCRET messages and 'answer' the dialog before it is shown to the user हो सकता है, लेकिन यह बहुत प्रयास की तरह लगता है और मैं भी एक क्लीनर समाधान पसंद करेंगे ...

किसी को भी पता है कि कैसे मज़बूती से सभी डाउनलोड को अवरुद्ध करने के लिए?

+0

मुझे यह स्ट्रेट प्राप्त करने दें ... आप अपने उपयोगकर्ताओं के लिए इंटरनेट एक्सेस की अनुमति देना चाहते हैं (जो कंप्यूटर में फ़ाइलों को डाउनलोड करने से ज्यादा कुछ नहीं है) और आप सभी डाउनलोड को अवरुद्ध करना चाहते हैं? – Sergio

+0

@ सर्जीओ: मुझे लगता है कि, जेन्स सभी फाइलों को ब्लॉक करना चाहते हैं, जिन्हें सीधे वेबब्रोसर में प्रदर्शित नहीं किया जा सकता है। – TcKs

+0

टीसीके सही है, मैं प्रदर्शित नहीं किया जा सकता है कि सब कुछ ब्लॉक करना चाहता हूँ। बिंदु डाउनलोड को रोकने के लिए नहीं है, लेकिन किसी भी "फ़ाइल को इस रूप में सहेजें" संवाद को रोकने से रोकने के लिए ताकि उपयोगकर्ता को हार्ड डिस्क तक पहुंचने का कोई तरीका न हो। मेरा एप्लिकेशन विंडोज शैल के रूप में स्थापित है (कोई एक्सप्लोरर नहीं, कोई स्टार्ट मेनू नहीं)। –

उत्तर

3

आप Navigating ईवेंट का उपयोग कर सकते हैं जो रद्दीकरण की अनुमति देता है।

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

System.Net.WebRequest request = System.Net.WebRequest.Create(e.Url); 

// we need only header part of http response 
request.Method = "HEAD"; 

System.Net.WebResponse response = request.GetResponse(); 

// only text/html, text/xml, text/plain are allowed... extend as required 
if (!response.ContentType.StartsWith("text/")) 
{ 
    e.Cancel = true; 
    MessageBox.Show("Not allowed for security resons..."); 
} 

जाहिर है इस बुलेट प्रूफ समाधान नहीं है, लेकिन कैसे आरंभ करने के लिए आप यह अनुमान लगा सकते हैं (अगर आप अतिरिक्त छोटे गोल यात्रा से परहेज नहीं करते सिर्फ http प्रतिक्रिया हेडर को पुनः प्राप्त करने के लिए)।

जेन्स Bannmann लिखा है:

यह आदर्श नहीं है, जैसा कि मैंने वेब अनुप्रयोगों के साथ किया जा रहा

:-(दो बार किया जाता निपटने कर रहा हूँ, जहां अतिरिक्त अनुरोध एक कार्रवाई ट्रिगर हो सकता है

फिर मैं कुछ सरल प्रॉक्सी सर्वर तैयार करूंगा जो सभी प्राप्त डेटा का निरीक्षण करेगा और उन सभी HTTP प्रतिक्रियाओं को फ़िल्टर करेगा जो आपके वेब ब्राउज़र नियंत्रण में "इस रूप में सहेजें" संवाद को ट्रिगर कर सकते हैं।

बस, अपने वेब ब्राउज़र नियंत्रण को सीधे इंटरनेट तक पहुंचने न दें, लेकिन अपने विशेष प्रॉक्सी सर्वर पर सभी http अनुरोधों को प्रतिनिधि दें जो वेब से सभी असुरक्षित प्रतिक्रियाओं को फ़िल्टर करेंगे।

+0

हम्म, संवाद को अवरुद्ध/अक्षम करने के बजाए प्रॉक्सी को जोड़ना मुझे एक सुरुचिपूर्ण समाधान के रूप में नहीं रोकता है। वैसे भी, क्या मैं अतिरिक्त सॉफ़्टवेयर इंस्टॉल किए बिना प्रॉक्सी जोड़ सकता हूं, यानी केवल .NET ढांचे का उपयोग कर? –

+0

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

+0

प्रॉक्सी विश्वसनीय रूप से काम नहीं करेगा क्योंकि यह https कनेक्शन के लिए यूआरएल या हेडर देखने में सक्षम नहीं होगा। – Malcolm

0

यह प्रोजेक्ट - http://www.codeproject.com/Articles/157329/Http-Monitor-for-Webbrowser-Control वेबब्रोसर नियंत्रण से HTTP ट्रैफ़िक को अवरुद्ध करने और निरीक्षण करने की अनुमति देता है।

तो फिर तुम माइम से डेटा फ़िल्टर और अनुमति दे सकते हैं केवल एचटीएमएल, छवियों, लिपियों आदि

3

केवल विश्वसनीय तरीका विंडोज घटना कतार में हुक और संवाद बॉक्स (दबाने चीजों के सभी प्रकार के रूप में हो रहा है उपयोगकर्ता का उपयोग कर सकते हैं)।यह वही है हमारे सहायक वर्ग करता है:

void ListenForDialogCreation() 
    { 
     // Listen for name change changes across all processes/threads on current desktop... 
     _WinEventHook = WinAPI.SetWinEventHook(WinAPI.EVENT_OBJECT_CREATE, procDelegate); 
    } 
    void StopListeningForDialogCreation() 
    { 
     WinAPI.UnhookWinEvent(_WinEventHook); 
    } 

    void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
    { 
     const uint OBJID_WINDOW = 0; 
     const uint CHILDID_SELF = 0; 

     // filter out non-HWND, and things not children of the current application 
     if (idObject != OBJID_WINDOW || idChild != CHILDID_SELF) 
      return; 

     //Get the window class name 
     StringBuilder ClassName = new StringBuilder(100); 
     WinAPI.GetClassName(hwnd, ClassName, ClassName.Capacity); 

     // Send close message to any dialog 
     if (ClassName.ToString() == "#32770") 
     { 
      WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); 
      if (OnDialogCancelled != null) 
       OnDialogCancelled(); 
     } 
     if (ClassName.ToString() == "#32768") 
     { 
      WinAPI.SendMessage(hwnd, WinAPI.WM.CLOSE, IntPtr.Zero, IntPtr.Zero); 
      if (OnDialogCancelled != null) 
       OnDialogCancelled(); 
     } 

    } 

    public delegate void OnDialogCancelledEvent(); 
    public event OnDialogCancelledEvent OnDialogCancelled; 
  • # 32770 संवाद वर्ग
  • # 32768 पॉप-अप मेनू
  • WinAPI नाम स्थान हमारे PInvoke रैपर है है।

यदि आप सभी संवादों को अवरुद्ध नहीं करना चाहते हैं तो आप कक्षा को पकड़े जाने के बाद कुछ अतिरिक्त फ़िल्टर में जोड़ना चाहेंगे। यह निर्भर करता है कि आपको कितना सुरक्षित होना चाहिए। $ WORK पर हमें सभी अपलोड और डाउनलोड को अवरुद्ध करने की आवश्यकता है।

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

+0

ठीक है, अगर आप WinAPI क्लास कोड जोड़ चुके हैं तो यह पोस्ट मदद कर सकता है। = ( –

+0

यह थोड़ी देर हो गया है, लेकिन मुझे लगता है कि हमने पिनवोक.net का उपयोग केवल हमारे लिए आवश्यक रैपर बनाने के लिए किया था। – Malcolm

संबंधित मुद्दे