如何使用javascript从给定的csrftoken构造csrfmiddlewaretoken?

时间:2017-09-29 03:42:58

标签: javascript django postman

我正在研究如何使用邮递员登录django网站。 使用Charles我可以看到以某种方式创建了一个csrfmiddlewaretoken令牌。

给出

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("7VCZ8oJSz...");
Query query = ref.orderByKey().limitToLast(1);
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            childSnapshot.getRef().getChild("Status").setValue("New value");
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "Query:onCancelled", databaseError.toException());
    }
});

发送的csrfmiddlewaretoken是

csrftoken=JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd

能     v3I6Io9H8OoZcp4ATyszhAepdQAEp617mmXZfoJQVKXwDcq7ewVzyu4f3AGk27D6 由...构建     JDmmXqnLK35WCLha1PVOhFWITaKZs9eeAWBfuqXUxZEt3yDHmNoOyzMyJUQF5aQd 使用javascript?

2 个答案:

答案 0 :(得分:0)

为了让CSRF令牌只是通过邮递员登录,你可以做两件事:

  1. 使用开发人员工具并通过检查表单并查找隐藏的csrfmiddleware输入字段来获取csrf中间件令牌。 (这将在服务器端呈现的情况下工作)

  2. 从cookie中获取csrf令牌。这是Django文档提到的{JMS实用程序here

    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;
    }
    var csrftoken = getCookie('csrftoken');
    
  3. 获得CSRF令牌后,只需在POSTMAN中为您的请求添加一个标头,其中包含密钥X-CSRFToken,并将值作为csrf标记。

    希望这有用:)

答案 1 :(得分:0)

这个问题的关键是了解csrfmiddlewaretoken的来源。 我以为它是从csrftoken以某种方式构建的。 我意识到它必须是服务器提供的隐藏变量。

因此,问题就变成了如何从初始get调用login中提取csrfmiddlewaretoken值。注意Postman现在使用cheerio删除了jQuery。

在get调用中使用postman jetpack这是我用来提取隐藏输入值的测试。

tests["responseCode.code === 200"] = responseCode.code === 200 ;
var csrftoken = postman.getResponseCookie("csrftoken").value ;
tests['csrftoken: ' + csrftoken ] = csrftoken.length > 0 ;
var html ;
html = cheerio(responseBody) ;
inputs = html.find('input') ;
csrfmiddlewaretoken = '' ;
postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ;
for( var index = 0 ; index < inputs.length ; index++) {
    var input = inputs[index] ;
    if ( input.attribs.name === 'csrfmiddlewaretoken') {
        csrfmiddlewaretoken = input.attribs.value ;
        postman.setEnvironmentVariable("csrfmiddlewaretoken", csrfmiddlewaretoken) ;
    }
}
tests['csrfmiddlewaretoken: ' + csrfmiddlewaretoken ] = csrfmiddlewaretoken.length > 0 ;

然后在post post中实际登录。

我必须根据网站安全策略添加Referer标头。

Content-Type:application/x-www-form-urlencoded
Referer:{{referer}}

表单值

csrfmiddlewaretoken:{{csrfmiddlewaretoken}}
username:{{username}}
password:{{password}}
next:{{next}}

然后发送邮件调用成功登录的邮递员脚本

pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

: - )