7

사용자 인증이있는 웹 사이트를 긁어 내려고하고 있습니다. 내 로그인을 보내고 쿠키를 저장하기 위해 POST를 할 수 있습니다. 그러나 로그인 후 보호 된 페이지에 액세스하려고하면 403 오류가 발생합니다.powershell httpwebrequest cookiecontainer 문제가 발생합니까?

$url = "https://some_url" 

$CookieContainer = New-Object System.Net.CookieContainer 

$postData = "User=UserName&Password=Pass" 

$buffer = [text.encoding]::ascii.getbytes($postData) 

[net.httpWebRequest] $req = [net.webRequest]::create($url) 
$req.method = "POST" 
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
$req.Headers.Add("Accept-Language: en-US") 
$req.Headers.Add("Accept-Encoding: gzip,deflate") 
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7") 
$req.AllowAutoRedirect = $false 
$req.ContentType = "application/x-www-form-urlencoded" 
$req.ContentLength = $buffer.length 
$req.TimeOut = 50000 
$req.KeepAlive = $true 
$req.Headers.Add("Keep-Alive: 300"); 
$req.CookieContainer = $CookieContainer 
$reqst = $req.getRequestStream() 
$reqst.write($buffer, 0, $buffer.length) 
$reqst.flush() 
$reqst.close() 
[net.httpWebResponse] $res = $req.getResponse() 
$resst = $res.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 
$res.close() 



$url2 = "https://some_url/protected_page" 

[net.httpWebRequest] $req2 = [net.webRequest]::create($url2) 
$req2.Method = "GET" 
$req2.Accept = "text/html" 
$req2.AllowAutoRedirect = $false 
$req2.CookieContainer = $CookieContainer 
$req2.TimeOut = 50000 
[net.httpWebResponse] $res2 = $req2.getResponse() 
$resst = $res2.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 

해결 방법 : 그래서 나는 다른 무언가를 시도하고 결국 그것이 실제로 작동 거의 모든 시도 후.

로그인을 게시하고 세션 쿠키를 가져온 후 webclient를 사용하여 쿠키 문자열을 헤더에 추가하여 보안 페이지에 액세스합니다.

$web = new-object net.webclient 
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"]) 
$result = $web.DownloadString("https://secure_url") 

멋진 점은 webclient가 쿠키를 저장한다는 것입니다. 다른 보안 페이지에 액세스하려면 $ web.downloadstring ("https : // another_secure_url")을 호출하면됩니다.

+0

전체 솔루션을 게시 할 수 있습니까? 나는 같은 상황에 있지만 나는 아직이 일을하지 못한 것 같다. – bearrito

+0

필자는 Fiddler2를 사용하여 브라우저와 서버 간의 트래픽을 캡처 한 다음 Fiddler2의 요청 헤더에서 쿠키를 가져 왔습니다. 쿠키를 요청에 추가했는데 현재 DownloadString은 계속해서 로그인 페이지로 리디렉션하지 않습니다. 감사! –

답변

4

쿠키에 추가 정보 (예 : URL 또는 HTTP 전용)가 첨부되어있을 수 있으므로 $ res.Headers [ "Set-Cookie"]가 작동하지 않습니다.

$web = new-object net.webclient 
$web.Headers.add("Cookie", $CookieContainer.GetCookieHeader($url)) 
$result = $web.DownloadString($url) 
0

IE automation을 사용합니다. 이것으로 쿠키, 헤더 등으로 작업 할 필요가 없습니다. 훨씬 쉬워졌습니다.

+0

자동화를 시도하기 전에 자동화를 시도했지만 너무 느리게 긁어 냈습니다. 그러나 나는 나의 문제에 대한 해결책을 찾았다. – foureight84

3

사람들은 전체 요구되었습니다하지만 당신의 $ CookieContainer 변수를 사용하여, 당신은 쉽게 여분의 정보를 제거하고 올바른 형식의 쿠키 문자열을 떠나 GetCookieHeader (URL)를 사용하여 변경할 수 있습니다 응용 프로그램은 여기에 있습니다.

$url = "https://some_url" 

$CookieContainer = New-Object System.Net.CookieContainer 

$postData = "User=UserName&Password=Pass" 

$buffer = [text.encoding]::ascii.getbytes($postData) 

[net.httpWebRequest] $req = [net.webRequest]::create($url) 
$req.method = "POST" 
$req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" 
$req.Headers.Add("Accept-Language: en-US") 
$req.Headers.Add("Accept-Encoding: gzip,deflate") 
$req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7") 
$req.AllowAutoRedirect = $false 
$req.ContentType = "application/x-www-form-urlencoded" 
$req.ContentLength = $buffer.length 
$req.TimeOut = 50000 
$req.KeepAlive = $true 
$req.Headers.Add("Keep-Alive: 300"); 
$req.CookieContainer = $CookieContainer 
$reqst = $req.getRequestStream() 
$reqst.write($buffer, 0, $buffer.length) 
$reqst.flush() 
$reqst.close() 
[net.httpWebResponse] $res = $req.getResponse() 
$resst = $res.getResponseStream() 
$sr = new-object IO.StreamReader($resst) 
$result = $sr.ReadToEnd() 
$res.close() 


$web = new-object net.webclient 
$web.Headers.add("Cookie", $res.Headers["Set-Cookie"]) 
$result = $web.DownloadString("https://secure_url") 
관련 문제