7

Kullanıcı kimlik doğrulaması olan bir web sitesini taramaya çalışıyorum. Girişimi göndermek ve bir çerez saklamak için bir POST yapabiliyorum. Ancak, giriş yaptıktan sonra korunan sayfaya erişmeye çalışırken 403 hatası alıyorum.powershell httpwebrequest GET yöntemi cookiecontainer sorunu mu?

$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() 

Çözüm: yüzden farklı bir şey çalışıyorum sona erdi ve aslında çalışır hemen her şeyi denedikten sonra.

Oturum açtıktan ve oturum çerezi alındıktan sonra, çerez dizesini başlıklara ekleyerek güvenli sayfaya erişmek için webclient kullanıyorum.

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

Bunun en güzel yanlarından biri de webclient'in çerezi kaydetmesidir. Başka bir güvenli sayfaya erişmek için, sadece $ web.downloadstring ("https: // bir başka_secure_url") :)

+0

bu işlem için komple bir çözüm gönderebilir miyim var. Ben de aynı durumdayım ama henüz bu kadar çalışmam görünmüyor. – bearrito

+0

Tarayıcım ile sunucu arasındaki trafiği yakalamak için Fiddler2'yi kullandım ve daha sonra Fiddler2'deki istek başlığından çerezi aldım. Bu çerezi siz gösterdiğiniz gibi ekledim ve şimdi DownloadString sürekli olarak giriş sayfasına yönlendirme yapmıyor. Teşekkürler! –

cevap

4

Çerezlerin ek bilgileri eklenmiş olabileceğinden (URL veya HTTP gibi), $ res.Headers ["Set-Cookie"] 'nin benim için çalışmadığını öğrendim.

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

numaralı telefonu arayabilirsin IE automation'u kullanırım. Bununla birlikte, çerezler, başlıklar vb. Ile çalışmak zorunda kalmazsınız. Çok daha kolay.

+0

Otomasyona bundan önce bir deneme yaptım ama kazımak için çok yavaş. Ama sorunuma bir çözüm buldum. – foureight84

3

İnsanlar tam soran edilmiştir: Ama $ CookieContainer değişkeni kullanarak, kolayca ekstra bilgi şerit ve düzgün şekilde biçimlendirilmiş bir çerez dize ile yalnız bırakacaktır GetCookieHeader (URL), kullanmak değiştirebilir uygulama, burada bunu

$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")