어떻게 WebClient를 이용하여 CSRF가 제어하는 사이트에 시뮬레이션하여 로그인합니까

15231 단어 client
일반적으로 우리는 WebRequest라는 종류를 이용하여 서버에 데이터의 POST를 진행하지만 많은 상황에서 상응하는 서버가 검증을 하고 있다. 당신이 로그인하는지 같은 구역에서 왔는지 확인하는 것은 간단하다. 우리는 그 속성을 바꾸어 사기 서비스기에 도달할 수 있다.그러나 서버가 CSRF 제어를 했다면 우리는 어떻게 합니까?
CSRF에 익숙하지 않은 분들은 G 형이 왜 그런지 여쭤봐도 돼요. 여기 간단하게 소개해 드릴게요.CSRF는 일반적으로 폼 페이지에 숨겨진 도메인을 놓고 폼이 제출될 때 서버가 POST에서 온 NAVEVALUE에 이 도메인이 포함되어 있는지 검증하는 동시에 값을 검증합니다.
문제가 생겼다. 이런 상황에서 우리가 서버에 포스팅한 데이터는 어떻게 쓰는가. HTML을 보면 이 NAME가 무엇인지, 그리고 그 VALUE가 무엇인지 알 수 있지만, 이 VALUE는 일반적인 상황에서 매번 닦을 때마다 변한다.그럼 됐어. 우리 포스트 할 때 어떻게 얻지?
인터넷에서 흔히 볼 수 있는 웹 Request 방법은 틀림없이 안 될 것이다. 왜냐하면 그들은 모두 이 종류로 먼저 하나의 Stream을 얻고 이 Stream에 우리가 서버에 포스팅해야 하는 데이터를 기록하기 때문이다. 그러나 이때 우리는 이 CSRF의 값을 몰랐기 때문이다. 포스팅은 과거에 틀림없이 잘못되었을 것이다.이론적으로 말하자면 우리는 먼저 GET를 한 번 한 다음에 스스로 GET가 도착한 이 HTML을 해석하여 CSRF의 값을 얻어야 한다. 그러나 다음에 우리는 다시 WebRequest에 간다.Creat가 POST에 가려고 했을 때, 이때 다시 방문한 셈이다. CSRF 값이 바뀌었기 때문에 이 길은 통하지 않는 것 같다.
다행히도 우리는 WebClient를 이용할 수 있다. WebClient는 우리로 하여금 하나의 실례를 유지하게 할 수 있다. 그러나 WebRequest는 정적 방법을 통해서만 만들어지고 URL을 바꾸어 같은 목적을 달성할 수 없다. 이곳도 NET4에서 마이크로소프트가 새로운 HttpClient를 내놓은 목적일 것이다. 이것은 HTTP 접근 인터페이스의 강호를 통일하는 데 사용될 것이다.
자, 우리가 지금 해야 할 일은 WebClient를 계승하고 해당하는 방법을 다시 쓰는 것입니다. 코드는 다음과 같습니다.
 1 public class CookieAwareWebClient : WebClient
 2     {
 3         public string Method;
 4         public CookieContainer CookieContainer { get; set; }
 5         public Uri Uri { get; set; }
 6 
 7         public CookieAwareWebClient()
 8             : this(new CookieContainer())
 9         {
10         }
11 
12         public CookieAwareWebClient(CookieContainer cookies)
13         {
14             this.CookieContainer = cookies;
15             this.Encoding = Encoding.UTF8;
16         }
17 
18         protected override WebRequest GetWebRequest(Uri address)
19         {
20             WebRequest request = base.GetWebRequest(address);
21             if (request is HttpWebRequest)
22             {
23                 (request as HttpWebRequest).CookieContainer = this.CookieContainer;
24                 (request as HttpWebRequest).ServicePoint.Expect100Continue = false;
25                 (request as HttpWebRequest).UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.5 Safari/537.36";
26                 (request as HttpWebRequest).Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
27                 (request as HttpWebRequest).Headers.Add(HttpRequestHeader.AcceptLanguage, "zh-CN,zh;q=0.8,en;q=0.6,nl;q=0.4,zh-TW;q=0.2");
28                 (request as HttpWebRequest).Referer = "some url";
29                 (request as HttpWebRequest).KeepAlive = true;
30                 (request as HttpWebRequest).AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
31                 if (Method == "POST")
32                 {
33                     (request as HttpWebRequest).ContentType = "application/x-www-form-urlencoded";
34                 }
35             }
36             HttpWebRequest httpRequest = (HttpWebRequest)request;
37             httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
38             return httpRequest;
39         }
40 
41         protected override WebResponse GetWebResponse(WebRequest request)
42         {
43             WebResponse response = base.GetWebResponse(request);
44             String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
45 
46             if (setCookieHeader != null)
47             {
48                 //do something if needed to parse out the cookie.
49                 try
50                 {
51                     if (setCookieHeader != null)
52                     {
53                         Cookie cookie = new Cookie(); 
54                         cookie.Domain = request.RequestUri.Host;
55                         this.CookieContainer.Add(cookie);
56                     }
57                 }
58                 catch (Exception)
59                 {
60 
61                 }
62             }
63             return response;
64         }
65     }

사실 가장 중요한 것은 쿠키 컨테이너를 잘 이용하는 것이다.다음은 어떻게 사용하는지입니다. 우리는 먼저 로그인 페이지를 방문하여 HTML을 받은 다음에 정규든 바꾸든 이 CSRF의 VALUE를 받은 후에 그에 상응하는 서버를 포스팅해야 합니다.
 1 var cookieJar = new CookieContainer();
 2             CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
 3 
 4             // the website sets some cookie that is needed for login, and as well the 'lt' is always different
 5             string response = client.DownloadString("url for get");
 6             string regx = "<input type=\"hidden\" id=\"lt\" name=\"lt\" value=\"(?<PID>\\S+?)\" />";
 7             // parse the 'lt' and cookie is auto handled by the cookieContainer
 8             string token = Regex.Match(response, regx).Groups[1].Value;
 9             string urlforlogin = "url for login";
10             string postData =
11                 string.Format("username={0}&password={1}&lt={2}", "user", "pass", token);
12             client.Method = "POST";            
13             response = client.UploadString("url for login", postData);
14 
15             client.Method = "GET";

여기서 우리는 끝낼 수 있다. 후기는 서로 다른 URL을 바꾸어 DownloadString에 가는 것이다. 속칭 파충류라고 하는데 다음은 서로 다른 업무에 따라 서로 다른 데이터 분석을 할 수 있다.

좋은 웹페이지 즐겨찾기