|
楼主 |
发表于 2017-7-11 15:24:19
|
显示全部楼层
公布一波标答, 抛砖引玉了
- import requests
- import re
- url = 'https://dev.yii2.cc/fishc/task1'
- opener = requests.session()
- res = opener.get(url)
- csrf_token = re.findall(r'type="hidden"\s*name="(\w+)"\s*value="(\w+)"', res.text)[0]
- res = opener.post(url, {
- # 坑1: csrf token
- # 建议阅读: https://github.com/pillarjs/understanding-csrf
- csrf_token[0]: csrf_token[1]
- }, headers={
- # 坑2: referer && session 检测
- # 此处配合后端源码理解更佳
- 'Referer': url
- })
- print(res.text)
复制代码
因为后端是自己写的所以也公布一下源码, php 写的, 希望各位看官轻喷
基于 phalcon 写的, 只贴关键代码, 框架代码和 view 层代码不贴
- public function task1Action()
- {
- if ($this->request->isPost()) {
- $this->view->disable();
- // 此处为 csrf 验证, 是框架集成方法
- if ($this->security->checkToken()) {
- /**
- * 此处即为 referer 判断
- * 判断 request 的 http 头中的 referer 是否与 session 中相等
- */
- $referer = parse_url($this->request->getHTTPReferer(), PHP_URL_PATH);
- if ($referer == $this->session->get('referer')) {
- echo 'Welcome ' . $this->request->getPost('username', null, 'Fishc');
- return;
- }
- }
- echo 'fail';
- return;
- }
- $this->session->set('referer', $this->request->getUri());
- }
复制代码
第一次发题(guan)目(shui)帖, 好多要求都没说清楚, 导致很多鱼油不知道答题规则, 下次会改进 |
|