Http-Headers

只有http頭通信?- 請解釋

  • September 29, 2019

下面的螢幕截圖是使用螢火蟲製作的。點擊登錄按鈕後,擷取的 Firefox <-> Web 伺服器通信發生。但我在我的 Firefox 中看不到任何重定向。這是否意味著 firefox 和 web 伺服器僅在 http 標頭級別進行通信?

我已經在 ruby​​/mechanize 中準備好了腳本,可以從論壇中抓取一些細節。我使用vBulletin.org論壇對其進行了測試/編碼。然後我設法登錄到我的測試論壇,並愉快地使用正確的論壇完成了我的腳本。但我無法登錄。我的腳本只返回我認為“登錄嘗試不成功”的登錄頁面。

  • 有人會向我解釋下面的螢幕截圖嗎?

    • 特別是為什麼有11行?為什麼不只有一個?
    • 如果我只能理解blindly/without thinking對 Web 伺服器的回复。我對嗎?
  • 當我點擊登錄按鈕時,firefox 在文章中發送,auth_username=myusername&auth_password=mypassword&auth_login=Login但我的腳本發送auth_username=radek&auth_password=mypassword是可以的還是&auth_login=Login必須呈現部分?

  • 有沒有機會模擬這樣的交流讓我們說紅寶石?

  • 或者我在想我是否可以record進行交流,然後replay在我的腳本中(如果可能的話)

通訊截圖

登錄頁面的html

&lt;form class="login" method="post"&gt; &lt;fieldset&gt;
&lt;legend&gt;Members Login&lt;/legend&gt; 

&lt;div&gt;
&lt;label for="auth_username"&gt;Username&lt;/label&gt; &lt;input id="auth_username" name="auth_username"&gt;
&lt;/div&gt;

&lt;div&gt;
&lt;label for="auth_password"&gt;Password&lt;/label&gt; &lt;input id="auth_password" name="auth_password" type="password"&gt;
&lt;/div&gt;

&lt;/fieldset&gt;
&lt;div class="buttons"&gt;
&lt;input name="auth_login" type="submit" value="Login"&gt;&lt;p class="note"&gt;&lt;a href="/forgotpassword"&gt;Forgot your password?&lt;/a&gt;&lt;/p&gt;

&lt;/div&gt;

&lt;/form&gt;

我的紅寶石腳本

require 'rubygems'
require 'mechanize'
#agent = WWW::Mechanize.new

agent = WWW::Mechanize.new 

page = agent.get("http://www.vbulletin.org/forum/index.php")

login_form = page.form_with(:action =&gt; 'login.php?do=login')


puts 
login_form.fields.each { |f| puts "#{f.name} : #{f.value}" }    
login_form['vb_login_username'] = 'user name'
login_form['vb_login_password'] = ''

page = agent.submit login_form

output = File.open("login.html", "w") {|f| f.write(page.parser.to_html) }

從無效的登錄嘗試中機械化日誌

INFO -- : Net::HTTP::Get: /login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1
DEBUG -- : request-header: accept-language =&gt; en-us,en;q=0.5
DEBUG -- : request-header: connection =&gt; keep-alive
DEBUG -- : request-header: accept =&gt; */*
DEBUG -- : request-header: accept-encoding =&gt; gzip,identity
DEBUG -- : request-header: user-agent =&gt; WWW-Mechanize/0.9.3 (http://rubyforge.org/projects/mechanize/)
DEBUG -- : request-header: accept-charset =&gt; ISO-8859-1,utf-8;q=0.7,*;q=0.7
DEBUG -- : request-header: host =&gt; www.somedomain.com
DEBUG -- : request-header: keep-alive =&gt; 300
DEBUG -- : Read 400 bytes
DEBUG -- : Read 1424 bytes
DEBUG -- : Read 2448 bytes
DEBUG -- : Read 3211 bytes
DEBUG -- : response-header: vary =&gt; Accept-Encoding
DEBUG -- : response-header: cache-control =&gt; no-store, no-cache, must-revalidate, post-check=0, pre-check=0
DEBUG -- : response-header: connection =&gt; close
DEBUG -- : response-header: expires =&gt; Thu, 19 Nov 1981 08:52:00 GMT
DEBUG -- : response-header: content-type =&gt; text/html; charset=utf-8
DEBUG -- : response-header: date =&gt; Fri, 29 Jan 2010 23:43:12 GMT
DEBUG -- : response-header: content-encoding =&gt; gzip
DEBUG -- : response-header: server =&gt; Apache/2.2.3 (CentOS)
DEBUG -- : response-header: content-length =&gt; 3211
DEBUG -- : response-header: set-cookie =&gt; PHPSESSID=7cfilg86ju2ldcgso22246hpu4; path=/, WebStats:visitorId=lSMkcwuSWEE%3D; expires=Mon, 27-Jan-2020 23:43:12 GMT; path=/, WebStats:sessionId=%2B2HHK296t%2BQ%3D; expires=Mon, 27-Jan-2020 23:43:12 GMT; path=/
DEBUG -- : response-header: accept-ranges =&gt; bytes
DEBUG -- : response-header: pragma =&gt; no-cache
DEBUG -- : gunzip body
DEBUG -- : saved cookie: PHPSESSID=7cfilg86ju2ldcgso22246hpu4
DEBUG -- : saved cookie: WebStats:visitorId=lSMkcwuSWEE%3D
DEBUG -- : saved cookie: WebStats:sessionId=%2B2HHK296t%2BQ%3D
INFO -- : status: 200
DEBUG -- : query: "auth_username=radek&auth_password=mypassword"
INFO -- : Net::HTTP::Post: /login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1
DEBUG -- : request-header: accept-language =&gt; en-us,en;q=0.5
DEBUG -- : request-header: connection =&gt; keep-alive
DEBUG -- : request-header: accept =&gt; */*
DEBUG -- : request-header: accept-encoding =&gt; gzip,identity
DEBUG -- : request-header: content-type =&gt; application/x-www-form-urlencoded
DEBUG -- : request-header: user-agent =&gt; WWW-Mechanize/0.9.3 (http://rubyforge.org/projects/mechanize/)
DEBUG -- : request-header: cookie =&gt; WebStats:sessionId=%2B2HHK296t%2BQ%3D; WebStats:visitorId=lSMkcwuSWEE%3D; PHPSESSID=7cfilg86ju2ldcgso22246hpu4
DEBUG -- : request-header: referer =&gt; http://www.somedomain.com/login?auth_successurl=http://www.somedomain.com/forum/yota?baz_r=1
DEBUG -- : request-header: accept-charset =&gt; ISO-8859-1,utf-8;q=0.7,*;q=0.7
DEBUG -- : request-header: content-length =&gt; 43
DEBUG -- : request-header: host =&gt; www.somedomain.com
DEBUG -- : request-header: keep-alive =&gt; 300
DEBUG -- : Read 650 bytes
DEBUG -- : Read 1674 bytes
DEBUG -- : Read 2698 bytes
DEBUG -- : Read 3211 bytes
DEBUG -- : response-header: vary =&gt; Accept-Encoding
DEBUG -- : response-header: cache-control =&gt; no-store, no-cache, must-revalidate, post-check=0, pre-check=0
DEBUG -- : response-header: connection =&gt; close
DEBUG -- : response-header: expires =&gt; Thu, 19 Nov 1981 08:52:00 GMT
DEBUG -- : response-header: content-type =&gt; text/html; charset=utf-8
DEBUG -- : response-header: date =&gt; Fri, 29 Jan 2010 23:43:13 GMT
DEBUG -- : response-header: content-encoding =&gt; gzip
DEBUG -- : response-header: server =&gt; Apache/2.2.3 (CentOS)
DEBUG -- : response-header: content-length =&gt; 3211
DEBUG -- : response-header: accept-ranges =&gt; bytes
DEBUG -- : response-header: pragma =&gt; no-cache
DEBUG -- : gunzip body
INFO -- : status: 200

重定向通常通過 HTTP 響應狀態程式碼 301(永久移動)或 302(找到/臨時移動)來實現。 用於執行重定向的那些 301 和 302 HTTP 響應狀態程式碼包含在 HTTP 標頭中。

僅僅因為您沒有“在 Firefox 中看到任何重定向”並不意味著重定向沒有發生:它在幕後發生。

還有一種重定向方法,即在頁面中使用 JavaScript。使用 JavaScript,重定向對使用者來說是顯而易見的,他們可以首先顯示一個頁面,然後被重定向(可能在延遲之後)到另一個位置。但是,這些不是通過 HTTP 標頭響應狀態程式碼傳播的 HTTP 重定向。

要解決您關於 Ruby 的問題:您應該在 Stack Overflow 上提出這個問題。但是,簡而言之,是的,您應該能夠使用任何伺服器端 Web 技術設置 301 和 302 重定向響應程式碼。


**更新:**要解決以下評論中的進一步問題:

如果您想了解有關 HTTP 工作原理的更多資訊,那麼我推薦以下書籍: HTTP:David Gourley 和 Brian Totty 的權威指南。您還可以參考 RFC 2616 定義的官方 HTTP 標準:超文本傳輸協議 - HTTP/1.1

至於您問題中上述一系列請求為何需要 11 個步驟,您需要詢問相關軟體的原作者。它可能可以用更少的步驟來實現,但可能不僅僅是 1 個步驟。考慮一下,伺服器至少需要一個重定向來在使用者瀏覽器中設置一個 cookie,然後再將它們發送到受保護的資源。

由於您正在嘗試複製基於 cookie 的自定義身份驗證機制,因此我還建議您集中研究此類系統通常是如何建構的。

如果您嘗試編寫登錄頁面的腳本,則應確保您的程序向伺服器發布的內容在各個方面都與真實請求相匹配,包括您目前未包含的參數。

此外,您需要確保您的程式碼接受並發送回伺服器發送的任何 cookie。 不保留伺服器發送的 cookie 是這種練習的常見錯誤。此外,您需要指示用於 HTTP 通信的任何庫**遵循重定向。**其中一些預設情況下不遵循重定向。

最後 - 調試,從網頁和程序中擷取請求和響應標頭和正文,並比較它們。懷疑任何差異。

引用自:https://serverfault.com/questions/108461