2016-03-29 55 views
3

令牌適當加CSRF我想獲得一個網站爲PDF的phantomJS內容作爲phantomJS文檔如何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(); 
}); 

我超級無知,甚至不知道我想要做什麼是可能與phantomJS。非常感謝幫助!

回答

3

Django在每個GET中都使用csrf標記設置一個cookie(並且在表單中的DOM內部,如果它在POST模板中配置的話),但是這個cookie不用於驗證服務器中的POST請求(這會導致一個安全漏洞)。

Django似乎從標準POST主體(表單數據)或從名爲X-CSRFToken的自定義HTTP標頭中讀取csrf標記。

因此,打造一個有效的請求,你必須模仿標準的用戶交互:

  • 做一個GET來創建你需要的POST捷克斯洛伐克令牌的頁面(可能是自動回或同一頁面FormAction =「postDestination」的另一頁)。此響應將在Form DOM和Cookie中帶有一個csrf標記。
  • 從Cookie或DOM獲取csrf標記
  • 在Form數據請求和/或自定義標頭中僞造一個有效的POST請求,設置標記。
  • 您應該收回可以呈現給pdf的成功回覆。

如果rasterize.js不允許上述任何步驟,您將需要創建自定義rasterize.js。

無論如何,你的POST似乎並沒有修改你的系統中的任何東西,它看起來像一個搜索,所以我認爲你可以只爲這個POST禁用csrf。