2011-08-30 3 views
3

나는 양말 터널링 (Modify Header Firefox Addon 비슷한)을 추가 및 수정 된 헤더 요청을 사용하여 웹 사이트를 열 수 C#에서 응용 프로그램과 터널 관통 데이터를 개발하기 위해 노력하고 있어요 프록시 (양말 선호). 누구든지 내가 필요로하는 자원을 지정할 수 있습니까? 아니면 같은 기능을 수행 할 수있는 대안, 어쩌면 내가 구축 할 수있는 오픈 소스 등 감사합니다!.NET 기본 응용 프로그램에 해당 파이어 폭스 부가 기능

PS : 응용 프로그램은 또한 HTTPS 및 기타 일반적인 네트워크 프로토콜

답변

2

방법 중 하나를 열 수 있어야한다는 HttpSys를 사용하여 루프백 127.0.0.1 주소에 대한 요청을 처리 할 수있는 로컬 프록시 서버를 만드는 것입니다. 시스템 프록시를이 주소/포트로 변경하고 클라이언트와 서버 사이에 위치하게됩니다.

이것은 당신이 요청/응답 패킷을 & 헤더를 수정할 수있다. C#에서는 example here의 접근 방식을 사용하고 있습니다. 어떻게 작동하는지 보여주기 위해이 내용을 수정했습니다.

public class MyProxy 
{ 
    private readonly HttpListener listener; 

    public MyProxy() 
    { 
     listener = new HttpListener(); 
    } 

    public void Start() 
    { 
     listener.Prefixes.Add("http://*:8888/"); 
     listener.Prefixes.Add("https://*:8889/"); 
     listener.Start(); 
     Console.WriteLine("Proxy started, hit enter to stop"); 
     listener.BeginGetContext(GetContextCallback, null); 
     Console.ReadLine(); 
     listener.Stop(); 
    } 

    public void GetContextCallback(IAsyncResult result) 
    { 
     var context = listener.EndGetContext(result); 
     listener.BeginGetContext(GetContextCallback, null); 

     var request = context.Request; 
     var response = context.Response; 
     var url = request.Url; 

     UriBuilder builder = new UriBuilder(url); 
     builder.Port = url.Port == 8888 ? 80 : 443; 
     url = builder.Uri; 

     WebRequest webRequest = WebRequest.Create(url); 

     webRequest.Proxy = GlobalProxySelection.GetEmptyWebProxy(); 
     WebResponse webResponse = webRequest.GetResponse(); 
     using (Stream reader = webResponse.GetResponseStream()) 
     { 
      using (Stream writer = response.OutputStream) 
      { 
       reader.CopyTo(writer); 
      } 
     } 
    } 
} 

이 방법의 단점은 매우 낮은 수준입니다, 그리고 바람직하지 않을 수 있습니다 사용자 시스템의 모든 트래픽에 영향을 미칩니다. SSL 요청을 처리해야하며 기존의 구성된 프록시에도 영향을 미칩니다.

또 다른 대체 방법은 Microsoft Internet Controls COM 구성 요소를 사용하고 WebBrowser 클래스를 확장하는 것입니다. 접근법을 보여주는 SO question here이 있습니다. 아쉽게도 .NET 네임 스페이스에있는 WebBrowser 버전은 요청 응답 객체를 구현하지 않습니다. 흥미로운 점은 아래와 같습니다.

public class ExtendedWebBrowser : WebBrowser 
{ 
    ... 

    void BeforeNavigate(object pDisp, ref object url, ref object flags, 
         ref object targetFrameName, ref object postData, 
         ref object headers, ref bool cancel) 
    { 
     if (!headers.Contains("X-RequestFlag") 
     { 
      headers += "X-RequestFlag: true\r\n"; 

      // append custom header here 

      // cancel current request 
      cancel = true; 

      // re-request with amended details 
      Navigate((string)url, (string)targetFrameName, (byte[])postData, 
         (string)headers); 
     } 
     else 
     { 
      base.BeforeNavigate(...); 
     } 
    } 
} 
+0

잘 답변 해 주셔서 감사합니다. 난 실제로 모든 트래픽에 영향을 응용 프로그램을 원하지만 어쨌든 SSL 요청을 시도하고 동일한 프록시를 통해 반환 모르겠다. 나는 그것에 가까운 코드 리소스를 기대하고 있었다. –

+0

신뢰할 수있는 CA로 설치된 자체 (자체 서명?) 인증서를 사용해야합니다. 이렇게하면 클라이언트가 프록시에 SSL 요청을하고 개인 키를 알고있는대로 해독 할 수 있습니다. 그런 다음 .NET WebRequest API를 사용하여 평소처럼 SSL을 통해 실제 주소로 요청을 보냅니다. – TheCodeKing

+0

나는 인터넷을 보지 못해서 예제를 보았다. 하나 도와 줄 수 있니? 감사합니다 –

관련 문제