如何在phantomJS中正确添加csrf令牌

如何在phantomJS中正确添加csrf令牌,phantomjs,Phantomjs,我想在phantomJS中以pdf格式获取网站的内容,这与phantomJS文档中描述的非常简单 phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf 到目前为止还不错。我现在的问题是,我想要打印为pdf的网页需要一个用户登录并发布一个包含2个输入字段的表单!输入字段是开始日期和结束日期,用于生成所需网站的结果,该结果将在以后以pdf格式打

我想在phantomJS中以pdf格式获取网站的内容,这与phantomJS文档中描述的非常简单

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf
到目前为止还不错。我现在的问题是,我想要打印为pdf的网页需要一个用户登录并发布一个包含2个输入字段的表单!输入字段是开始日期和结束日期,用于生成所需网站的结果,该结果将在以后以pdf格式打印。该站点是用Django编写的,默认情况下需要csrf令牌。我写的这段代码不起作用,即使可以,也帮不了我,因为我无法在光栅化的帮助下使用它将页面内容转换为pdf

"use strict"
var page = require('webpage').create(),
    server = 'http://10.0.3.201:8000/report/',
    data = 'start_date=23.03.2016&end_date=24.03.2016';

page.settings.userName = 'ubuntu';
page.settings.password = 'ubuntu';

page.includeJS(
    // Include the http version, you can change this to http if you like.
    'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',
    function() {
        (page.evaluate(function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        phantom.addCookie({
            'name'      : 'csrf',
            'value'     : getCookie('csrftoken'),
            'domain'    : 'localhost',
            'path'      : 'report',
            'httponly'  : true,
            'secure'    : false,
            'expires'   : (new Date()).getTime() + (1000 * 60 * 60)
        });
        )
    }
);

page.open(server, 'post', data, function(status) {
    if (status !== 'success') {
        console.log('Unable to post!');
    } else {
        console.log(page.content);
    }
    phantom.exit();
});
“使用严格的”
var page=require('webpage')。create(),
服务器http://10.0.3.201:8000/report/',
数据='开始日期=2016年3月23日和结束日期=2016年3月24日';
page.settings.userName='ubuntu';
page.settings.password='ubuntu';
page.includeJS(
//包括http版本,如果愿意,可以将其更改为http。
'https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',
函数(){
(第页)评估(函数getCookie(名称){
var-cookieValue=null;
if(document.cookie&&document.cookie!=''){
var cookies=document.cookie.split(“;”);
对于(变量i=0;i
我非常无知,甚至不知道我想用phantomJS做的事情是否可行。非常感谢您的帮助!

Django在每次GET中使用csrf令牌设置一个cookie(如果在POST模板中配置了,则在表单的DOM中),但此cookie不用于验证服务器中的POST请求(这将导致安全漏洞)

Django似乎从标准POST正文(表单数据)或名为
X-CSRFToken
的自定义HTTP头读取csrf令牌

因此,要伪造有效的请求,您必须模拟标准的用户交互:

  • 访问为所需帖子创建csfr令牌的页面(可以是autopostback中的同一页面,也可以是另一个带有FormAction=“postDestination”)的页面。此响应将在表单DOM和cookie中附带csrf令牌
  • 从cookie或DOM获取csrf令牌
  • 在表单数据请求和/或自定义标头中伪造有效的POST请求设置令牌
  • 您应该收到一个可以呈现为pdf的成功响应
如果rasterize.js不允许上述任何步骤,则需要创建自定义rasterize.js

无论如何,你的帖子似乎并没有修改你系统中的任何东西,它看起来像是一个搜索,所以我认为你可以为这篇帖子禁用csrf