12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
在使用 PHP 进行 Web 开发时,我们经常需要使用 Curl 来模拟客户端向服务器发送请求并获取响应。而针对部分经过 ASP.NET 开发的 Web 应用程序,则需要特别处理 ViewState 参数,
以下为本文的正文内容,请查阅,本站为公益性网站,复制本文以及下载DOC文档全部免费。
在使用 PHP 进行 Web 开发时,我们经常需要使用 Curl 来模拟客户端向服务器发送请求并获取响应。而针对部分经过 ASP.NET 开发的 Web 应用程序,则需要特别处理 ViewState 参数,使 Curl 可以顺利完成模拟请求的过程。
ViewState 是 ASP.NET 的一个会话状态管理机制,通常用来记录在客户端和服务器之间的请求和响应状态。如果一个 Web 应用程序使用了 ViewState,则在向服务器发送 POST 请求时,需要在请求体中带上传递该参数,否则服务器将认为客户端请求无效,直接返回错误。
下面是一个模拟登录一个使用了 ViewState 机制的 ASP.NET Web 应用程序的 PHP Curl 示例:
$ch = curl_init();curl_setopt_array($ch, array(CURLOPT_URL =>'http://example.com/login.aspx',CURLOPT_RETURNTRANSFER =>true,CURLOPT_COOKIESESSION =>true,CURLOPT_COOKIEFILE =>'',CURLOPT_COOKIEJAR =>'/tmp/cookie',CURLOPT_POST =>true,CURLOPT_POSTFIELDS =>'txtUsername=admin&txtPassword=123456&__VIEWSTATE=/wEPDwUJODAyNjkxMTkyZGTN3coYX4QKkf/cSTk7 +ML6pGw==&btnLogin=Login',));$response = curl_exec($ch);curl_close($ch);
在 CURLOPT_POSTFIELDS 参数中,我们可以看到提交的请求体中包含了一个名为 "__VIEWSTATE" 的参数,这就是 ASP.NET 的 ViewState 参数。具体来说,该参数的值是一个经过 Base64 编码后的字符串,其中包含了客户端与服务器之间的请求和响应状态。
如果我们不使用 Curl,而是使用 Python 的 requests 模块,那么需要将上述 Base64 字符串进行解码:
import requestsimport base64payload = {'txtUsername': 'admin','txtPassword': '123456','__VIEWSTATE': base64.b64decode('/wEPDwUJODAyNjkxMTkyZGTN3coYX4QKkf/cSTk7+ML6pGw=='),'btnLogin': 'Login',}response = requests.post('http://example.com/login.aspx', data=payload)
虽然请求体中的数据相对较长,但是只有 ViewState 是必须要传递的参数。在实际应用中,如果我们需要绕过登录页,则必须要在模拟请求中携带 ViewState 参数。
当然,如果你希望直接获取 ViewState 的值,而不是从浏览器中复制该参数,也是可以的。方法是,在请求页面时,将返回的 HTML 页面保存到本地,然后解析出 ViewState 的值,并携带该参数再次向服务器发送请求。例如下述代码:
$ch = curl_init();curl_setopt_array($ch, array(CURLOPT_URL =>'http://example.com/login.aspx',CURLOPT_RETURNTRANSFER =>true,CURLOPT_COOKIESESSION =>true,CURLOPT_COOKIEFILE =>'',CURLOPT_COOKIEJAR =>'/tmp/cookie',));$response = curl_exec($ch);curl_close($ch);preg_match('/name="__VIEWSTATE" value="(.*)" \/>/', $response, $matches);$viewstate = $matches[1];$ch = curl_init();curl_setopt_array($ch, array(CURLOPT_URL =>'http://example.com/login.aspx',CURLOPT_RETURNTRANSFER =>true,CURLOPT_COOKIESESSION =>true,CURLOPT_COOKIEFILE =>'/tmp/cookie',CURLOPT_COOKIEJAR =>'/tmp/cookie',CURLOPT_POST =>true,CURLOPT_POSTFIELDS =>'txtUsername=admin&txtPassword=123456&__VIEWSTATE=' . urlencode($viewstate) . '&btnLogin=Login',));$response = curl_exec($ch);curl_close($ch);
在上述代码中,我们使用了正则表达式来匹配 HTML 页面中的 ViewState 值,并使用 urlencode() 方法对其进行编码。然后再次发送请求,此时携带了正确的 ViewState 参数,就可以在服务器成功模拟登录。此时,我们还可以通过 CURLOPT_COOKIEJAR 和 CURLOPT_COOKIEFILE 两个参数来使 Curl 客户端记住服务器返回的 Cookie 值,以便实现后续请求的会话保持。
总之,当需要使用 Curl 模拟请求一个使用了 ViewState 机制的 ASP.NET Web 应用程序时,需要特殊处理请求体中的 __VIEWSTATE 参数,并注意正确地管理 Cookie 会话状态,否则模拟请求将无法生效。
11-20
11-20
11-19
11-20
11-19
11-20
11-20
11-20
11-20
11-19
11-19
11-19
11-19
11-19
11-19
11-19