有一个 asp.net 驱动的站点,我可以在成功登录后登录并填写表格下订单。这需要由我的服务器使用 curl 完成。
每当我使用浏览器执行此操作时,都没有什么特别之处。
我去 example.com/login.aspx。填写字段并将其发回。我为已登录的用户返回了一个索引页面。在此之后,我需要单击指向下订单表格的链接。这样做会给我一个表格,我填写并发回。这会产生下订单的想要结果。分析来源显示页面是通过javascript提交的,但如果请求相同,服务器无法知道请求是如何发送的。在此过程中,我跟踪了从浏览器发送的所有发布请求。
有了所有的帖子请求,我编写了一些代码来对 curl 做同样的事情。算法是:
- 发送get请求获取example.com/login.aspx页面
- 解析任何隐藏字段的响应(因为它们用于模拟全状态连接)
- 将状态和登录数据发布到 example.com/login.aspx
- 解析状态发回并更新它
- 获取下单表格
- 再次解析并更新状态
- 发布我的浏览器发送的状态和相同的发布数据
- 将信息打印到文件而不是 STDERR
在此过程中,cookie 与 curl 一起使用。
一切都很顺利,直到最后一个 POST。我将原始表单返回给我,而不是“成功”或“失败”结果,没有提及验证错误。如果我故意填写乱码或使用浏览器将某些内容留空,则会显示验证错误。
我没有使用 asp.net 的经验,完全被困在这里,如果这个问题太具体,请原谅我。
问题:
如果标题和帖子数据与我的浏览器完全相同,我的 curl 操作怎么会有不同的结果?
为了完整性:
从浏览器发布:
POST /DataEntry.aspx HTTP/1.1
主办方:www.iftin.co
用户代理:Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0
接受:text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8
接受语言:nl,en-us;q=0.7,en;q=0.3
接受编码:gzip,放气
连接:保持活动
推荐人: https ://www.iftin.co/DataEntry.aspx
Cookie:ASP.NET_SessionId=SomethingX;.hawAuth=SomethingY
内容类型:application/x-www-form-urlencoded
内容长度:10111
通过 Curl 发送帖子:
POST /DataEntry.aspx HTTP/1.1
用户代理:Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0
主办方:www.iftin.co
推荐人:https ://www.iftin.co/DataEntry.aspx
Cookie:.hawAuth=SomethingZ; ASP.NET_SessionId=SomethingW
接受:text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8
接受语言:nl,en-us;q=0.7,en;q=0.3
接受编码:gzip,放气
连接:保持活动
内容长度:25236
期望:100-继续
内容类型:application/x-www-form-urlencoded;boundary=----------------------------5bb8ec4e5ecc
如果人们想看一些代码,请告诉我。感谢您阅读并花时间在这上面。
写完这篇文章后,我注意到我的 curl 请求的 Content-Length 比我的浏览器请求大得多。我将浏览器 Post 正文中的所有参数复制到我的代码中,并将其传递给 curl 数组。
所以 curl 默认要在请求中添加一些数据。是这样吗?
CURLOPT_SSL_VERIFYPEER 设置为 false,而页面使用 SSL。会是这样吗?为什么?