
RT 。网站是这个:
https://eq.wowow.co.jp/CGI/enq/engeki2015/index.cgi/conf/
网站传输用的是multipart/form-data,不过我用 post 模拟提交的数据和 submit 格式是一样的。
而且看了下两个的 request header 基本上也没差了,但是 respone 的 header 和页面就差了不少。后台没写过不清楚,看了下两个最大的区别应该是一个文档类型是document一个是xhr,想问下后台的话可以根据这个直接判定返回的页面吗?
var data={ key:'conf', mem_flg:'', page:'1', back_page:'', '000021914':'ssd', '000021912':'男性', '000021913':'20 代', '000021911':'', '000021916':'sssd', '000021926':'dsds', '000021918':'dsdd', '000021920':'ads', '000021922':'adsds', '000021923':'', '000021924':'0001::同意する', '000021925':'0001::同意する', submit:'次 へ ' }; function sendData(data) { var XHR = new XMLHttpRequest(); var FD = new FormData(); for(name in data) { FD.append(name, data[name]); } XHR.addEventListener('load', function(event) { console.log('Yeah! Data sent and response loaded.'); }); XHR.addEventListener('error', function(event) { console.log('Oups! Something goes wrong.'); }); XHR.open('POST', 'https://eq.wowow.co.jp/CGI/enq/engeki2015/index.cgi/conf/'); XHR.setRequestHeader('Upgrade-Insecure-Requests', '1'); XHR.setRequestHeader('Cache-Control','max-age=0'); XHR.send(FD); } sendData(data) POST /CGI/enq/engeki2015/index.cgi/conf/ HTTP/1.1 Host: eq.wowow.co.jp Connection: keep-alive Content-Length: 1778 Cache-Control: max-age=0 Origin: https://eq.wowow.co.jp Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary5LSRJwQdceXFo8uo Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 X-FirePHP-Version: 0.0.6 Referer: https://eq.wowow.co.jp/CGI/enq/engeki2015/index.cgi/conf/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: wowow2_MGSID_AuthTicket=57d35173edd644dac7cca0ada9fe586a2b874b7a; wowow2_MGSID=0117130a152e480144668844800011862; enq_plus_000002528=6645110a152e550144677804300003180 HTTP/1.1 200 OK Date: Fri, 06 Nov 2015 02:48:44 GMT Server: Apache Pragma: no-cache Cache-Control: no-store, no-cache, post-check=0, pre-check=0 Expires: -1 Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html;charset= POST /CGI/enq/engeki2015/index.cgi/conf/ HTTP/1.1 Host: eq.wowow.co.jp Connection: keep-alive Content-Length: 1754 Origin: https://eq.wowow.co.jp Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryj73JdouNDpXuT6ep Cache-Control: max-age=0 X-FirePHP-Version: 0.0.6 Accept: */* Referer: https://eq.wowow.co.jp/CGI/enq/engeki2015/index.cgi/conf/ Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Cookie: wowow2_MGSID_AuthTicket=57d35173edd644dac7cca0ada9fe586a2b874b7a; wowow2_MGSID=0117130a152e480144668844800011862; enq_plus_000002528=6645110a152e550144677804300003180 HTTP/1.1 200 OK Date: Fri, 06 Nov 2015 02:49:37 GMT Server: Apache Keep-Alive: timeout=2, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html;charset= 感谢 @bertonzh 的检查,是我傻逼了,发送的字段内容复制错了。。这个问题算是解决了。。
不过为了不让各位的心思白费,扩展下问题吧:
如果前端不配合的情况下,后台可以直接判断出来数据是 form 表单的 submit 提交还是利用 ajax 的 post 提交的吗?
1 kokdemo 2015-11-06 11:11:03 +08:00 可以啊, ajax 本质上就一个 xhr 请求,和 form 的当然不一样了。 有一些框架里面都可以判断请求是不是 ajax 的,然后返回不一样的内容。 |
2 TakanashiAzusa OP @kokdemo 所以其实就是后台一旦接收到是 xhr 请求的话就直接返回 a 页面,如果是 form 提交就 b 页面这样么?因为这里的 form 和 xhr 都是 post 的,我以为对后台来说没什么区别呢。。 |
3 cxe2v 2015-11-06 11:16:16 +08:00 其实可以 submit 和 ajax 提交的地址不一样,就能各自返回不同的东西了 |
4 TakanashiAzusa OP @cxe2v 不不不,我现在不是这个意思,而是我想让 post 和 submit 的返回结果一样,但是不管怎么试都试不出来,不知道是我前端哪里疏漏了还是后台他们可以直接判断来源。。 |
5 TakanashiAzusa OP @kokdemo 我查了下很多资料里都提到了“ HTTP_X_REQUESTED_WITH ”这个 header 头,但是这个头貌似是要前端加上去的,而原生的是不带这个头的,所以想问下在前端不配合的情况下,后台可以直接筛选出来这两种方式么 |
6 bertonzh 2015-11-06 11:33:22 +08:00 @kokdemo XHR 和表单提交本质上都是 HTTP 请求,怎么就不一样了? 感觉是 Accpet 的问题。楼主可以先试试修改。不过有一些请求头在 XHR 里面是修改不了的,可以考虑用代理工具 charles 拦截请求,在 charles 里面修改。 |
7 hcymk2 2015-11-06 11:33:46 +08:00 什么是 post 和 submit 返回的结果不一样?你的 js 是写在哪里的? |
9 yongzhong 2015-11-06 11:37:13 +08:00 ajax 在请求头里会有一个特殊的标识符,后台可以用来判断 |
10 TakanashiAzusa OP @hcymk2 那个页面上,用 chrome 开发者工具的 console 里直接运行我那段 js 模拟 post 提交返回的页面和直接用他的表单提交得到的结果是不是一样的。 我就是不知道这个是怎么做到的。不知道是我前端的问题还是后台可以限制。。 |
11 TakanashiAzusa OP @yongzhong 但是我这里贴出来的 header 里没有明显的字段差别啊。 |
12 TakanashiAzusa OP @kokdemo 能问下是怎么做到的么?给个关键词就好。 我刚刚找了下大部分说的都是区分前端框架的 ajax ,但是那个是因为前端框架手动加了个字段。。 |
13 br00k 2015-11-06 11:43:51 +08:00 后台可以根据 HTTP_X_REQUESTED_WITH 判断是否为 AJAX 方式提交。 这个是 TP 的判断方法。 protected function isAjax() { if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ) { if('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) return true; } if(!empty($_POST[C('VAR_AJAX_SUBMIT')]) || !empty($_GET[C('VAR_AJAX_SUBMIT')])) // 判断 Ajax 方式提交 return true; return false; } |
15 icedx 2015-11-06 11:47:18 +08:00 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 这个不一样啊 |
16 bertonzh 2015-11-06 11:47:29 +08:00 |
17 TakanashiAzusa OP |
18 TakanashiAzusa OP @icedx 我能看出来的区别也就这里面了。。但是`Accept`这个字段前端是可以改的。我那里的 js 代码里只要加一句 “ XHR.setRequestHeader('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8');” 就可以改掉了。。 而且我刚刚加了试一下和之前的也没啥区别,一样是不同的页面 |
19 TakanashiAzusa OP @bertonzh 抱歉 v2 的回复提醒好像有点抽,前面 6 楼的回复没看到。我把 accept 改成一样的了,但是还是没什么效果。。 |
20 br00k 2015-11-06 11:59:26 +08:00 @TakanashiAzusa 我试了,是有的。在域名下面控制台输入。 $.ajax({ contentType:"multipart/form-data" }) Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4 Cache-Control:no-cache Connection:keep-alive Content-Type:multipart/form-data Cookie:enq_plus_000002528=8597130a152e540144678235400000449 Host:eq.wowow.co.jp Pragma:no-cache Referer:https://eq.wowow.co.jp/CGI/enq/engeki2015/index.cgi/conf/ User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 X-Requested-With:XMLHttpRequest |
21 TakanashiAzusa OP @br00k $.ajax 是框架(jq 或者 zepto 之类的)封装的 xhr 不是原生的 xmlHttpRequest 。。我前面正文里贴过原生的 xhr 代码,你可以用那个试试看。 |
22 bertonzh 2015-11-06 12:10:56 +08:00 @TakanashiAzusa 楼主仔细检查下你的表单内容。 这三个字段有问题: ------- '000021912':'男性', '000021913':'20 代', '000021911':'', |
23 bertonzh 2015-11-06 12:12:22 +08:00 这是原始表单: 0001::男性 ------WebKitFormBoundaryWm2VeBo2patOxQ5k Content-Disposition: form-data; name="000021913" 0002::20 代 ------WebKitFormBoundaryWm2VeBo2patOxQ5k Content-Disposition: form-data; name="000021911" 0007:: ------WebKitFormBoundaryWm2VeBo2patOxQ5k Content-Disposition: form-data; name="000021916" |
24 TakanashiAzusa OP @bertonzh 我去还真是- -是我傻逼了。。不好意思。。 |
25 bertonzh 2015-11-06 12:15:29 +08:00 前面一条 boundary 和值的前后顺序有问题。值也被我改错了。楼主不要直接复制粘贴。 |
26 TakanashiAzusa OP @bertonzh 嗯,我刚刚改了下已经成功了。谢谢。。可能昨天要复制的字段比较多所以后面只看了 key 的值, name 里的想当然了。多谢 |