2012-04-18 180 views
2

我試圖使用cURL實現成功POST到ASPX(ASP.NET)頁面(外部網站)。澄清__VIEWSTATE __EVENTVALIDATION __EVENTTARGET,__EVENTARGUMENT需要

因爲我不在乎多的頁面(這是在服務器端全部完成),我不發送任何參數 __VIEWSTATE__EVENTVALIDATION__EVENTTARGET__EVENTARGUMENT,甚至不爲空,但看起來我確實發送了真實的數據。

將這些參數發佈到ASP.NET服務器有多關鍵?

我不是一個ASP.NET程序員,但我可能會懷疑__EVENTVALIDATION可能在這裏給我一些困難(?)。或者,這是瀏覽器和服務器之間的東西,我不需要太在意?

如果這是至關重要的,我該如何模仿這些變量以便服務器接受POSTS?

+1

難道你不能只問你提交給這個網站的信息嗎? – 2012-04-18 00:49:52

回答

3

一般來說,你不能消除這些值。

ViewState和EventValidation是至關重要的 - 除非另一方已禁用它們。如果對方使用它們,並且在回發時沒有找到它們,則會出現拋出錯誤,並且取決於程序如何處理它。

ViewState包含頁面在回發後需要使用的信息。

EventValidation包含一個驗證回發控件的密鑰,以確保您不會嘗試觸發任何沒有權限的命令,或發送任何無權運行的參數。

讓我們給你一個例子:假設我有一個控件發送一個數字,43和一個觸發回發的按鈕,並且我要求信息爲43. EventValidation注意你不能使一個腳本並請求任何id的所有數字,並得到你可能會想到的任何結果。

1

這是可能的。只是不與cURL

最好的辦法是使用瀏覽器模擬器,如機械Python。這是一個示例腳本。試一試。您始終可以使用命令行調用此腳本,並讓它返回結果HTML

import mechanize 
import cookielib 

# Browser 
br = mechanize.Browser() 

# Cookie Jar 
cj = cookielib.LWPCookieJar() 
br.set_cookiejar(cj) 

# Browser options 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# Follows refresh 0, but it does not hang on refresh > 0 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1) 

# Want debugging messages? 
#br.set_debug_http(True) 
#br.set_debug_redirects(True) 
#br.set_debug_responses(True) 

# User-Agent (this is cheating, OK?) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 

# Open some site, let's pick a random one, the first that pops in mind: 
r = br.open('http://www.example.com/') 
html = r.read() 

# Show the source 
print html 
# or 
print br.response().read() 

# Show the HTML title 
print br.title() 

# Show the response headers 
print r.info() 
# or 
print br.response().info() 

# Show the available forms 
for f in br.forms(): 
    print f 

# Select the first (index zero) form 
br.select_form(nr=0) 

# Let's search 
br.form['field']='value' 
br.submit() 

# Show HTML of results 
print br.response().read()