2012-04-18 177 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()