2016-03-29 32 views
3

token düzgün CSRF eklemek için nasıl phantomJS dokümanlar Şimdiye kadar phantomJS

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf 

çok iyi anlatıldığı gibi oldukça kolaydır phantomJS içinde pdf olarak bir web sitesinin içeriğini almak istiyorum. Şu andaki problemim, pdf olarak basmak istediğim web sayfasının, giriş yapan ve 2 giriş alanı içeren bir form göndermesi gerektiğidir! Giriş alanları, daha sonra pdf olarak basılacak olan istenen web sitesinin sonucunu oluşturan bir başlangıç ​​ve bitiş tarihidir. Site Django'da yazılmıştır ve varsayılan olarak bir csrf belirteci gerektirir. İşe yaramayacak olan bu kodu yazdım ve eğer olsa bile bana yardımcı olmaz çünkü sayfa içeriğini pdf'ye dönüştürmek için rasterleştirerek kullanamıyorum.

"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(); 
}); 

süper clueless ve hatta ne yapmak istiyorum phantomJS ile mümkün olup olmadığını bilmiyorum. Yardım çok takdir edilir!

cevap

3

Django, bir çerez (ve POST şablonlarında yapılandırılmışsa Formların içinde DOM içinde) her GET'deki csrf belirtecini ayarlar ancak bu çerez sunucudaki POST isteğini doğrulamak için kullanılmaz (bir güvenlik deliği).

Django, standart POST gövdesinden (Form verileri) veya X-CSRFToken adlı özel bir HTTP üstbilgisinden csrf belirtecini okuyor gibi görünüyor.

  • (İhtiyacınız POST için CSFR belirteci oluşturur sayfaya bir GET olun aynı AutoPostBack sayfa veya olabilir:

    Yani, standart kullanıcı etkileşimi taklit zorunda geçerli bir istek kurma FormAction = "postDestination" ile başka bir sayfa. Bu yanıt, Form DOM içinde ve bir çerezde bir csrf belirteci ile birlikte gelir.

  • Csrf belirtecini çerezden alın veya DOM
  • Jetonu Form veri isteği ve/veya özel başlık olarak ayarlayarak geçerli bir POST isteği oluşturun.
  • Pdf'ye oluşturulabilen bir başarı yanıtı almalısınız.

Eğer rasterize.js yukarıdaki herhangi bir adıma izin vermiyorsa, özel rasterize.js dosyanızı oluşturmanız gerekir.

Neyse, POST'unuz sisteminizde herhangi bir şeyi değiştirmiyor gibi görünüyor, arama gibi görünüyor, bu yüzden bu POST için sadece csrf'yi devre dışı bırakabileceğinizi düşünüyorum.