SORU
23 EKİM 2012, Salı


VCRProxy: VCR ile Kayıt PhantomJS ajax çağrıları içinde Kapibara

Ben zaten bu alanda biraz araştırma yaptım ama herhangi bir çözüm bulamadı. Asynchron ajax çağrıları facebook (JSONP kullanarak) yapıldığı bir site var. VCR ile Ruby tarafındaki tüm HTTP istekleri benim kaydediyorum, serin, AJAX aramalar için bu özelliği kullanmak olacağını düşündüm.

Etrafta biraz oynadım ve bir proxy girişimi ile geldi. Başsız bir tarayıcı olarak PhantomJS kullanarak ve Kapibara içinde entegrasyonu için poltergeist ediyorum. Poltergeist şimdi böyle bir proxy kullanacak biçimde yapılandırılmış

  Capybara.register_driver :poltergeist_vcr do |app|
    options = {
      :phantomjs_options => [
        "--proxy=127.0.0.1:9100",
        "--proxy-type=http",
        "--ignore-ssl-errors=yes",
        "--web-security=no"
      ],
      :inspector => true
    }
    Capybara::Poltergeist::Driver.new(app, options)
  end
  Capybara.javascript_driver = :poltergeist_vcr

Test amaçlı, bir proxy sunucusu VCR entegre WEbrick,: dayanarak yazdım

require 'io/wait'
require 'webrick'
require 'webrick/httpproxy'

require 'rubygems'
require 'vcr'

module WEBrick
  class VCRProxyServer < HTTPProxyServer
    def service(*args)
      VCR.use_cassette('proxied') { super(*args) }
    end
  end
end

VCR.configure do |c|
  c.stub_with :webmock
  c.cassette_library_dir = '.'
  c.default_cassette_options = { :record => :new_episodes }
  c.ignore_localhost = true
end

IP   = '127.0.0.1'
PORT = 9100

reader, writer = IO.pipe

@pid = fork do
  reader.close
  $stderr = writer
  server = WEBrick::VCRProxyServer.new(:BindAddress => IP, :Port => PORT)
  trap('INT') { server.shutdown }
  server.start
end

raise 'VCR Proxy did not start in 10 seconds' unless reader.wait(10)

Bu şey her localhost çağrı ile çalışır, ve kayıt altına almak. HTML, JS ve CSS dosyaları VCR ile kayıt edilir. Sonra c.ignore_localhost = true seçeneği etkin, işe yaramaz (bence) localhost aramaları kaydetmek için.

Tekrar denedim ama sayfada yapılan AJAX çağrıları kayıtlı olmadığını anlamaya vardı. Daha da kötüsü, bu testler içinde artık işe yaramıyor.

Sadede gelmek Peki, sorum şu: Neden localhost dosyaları kaydedilmiş ve JSONP dış ressources çağrıları değil JS için tüm aramalar? JsonP şey olamaz, "" ajax isteği. normal değil çünkü Yoksa phantomjs içinde bir hata, AJAX çağrıları vekalet değil mi? Eğer öyleyse, bunu nasıl telafi edebiliriz?

Eğer çalışıyorsa, Başlat entegre ve yordam içinde bitmesini istiyorum

------- GÜNCELLEME -------

Biraz araştırma yaptım ve şu noktaya geldi: proxy HTTPS aramaları HTTPS üzerinden çağırır ve ikili veri ile bazı sorunları var.

Sunucu başladım, ve birkaç telefon görüşmesi yaptı curl:

curl --proxy 127.0.0.1:9100 http://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png

Bu aramayı olması gerektiği gibi kaydı tutuluyor. Proxy istek ve yanıt çıktı

GET http://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png HTTP/1.1
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Host: d3jgo56a5b0my0.cloudfront.net
Accept: */*
Proxy-Connection: Keep-Alive

HTTP/1.1 200 OK 
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Date: Tue, 20 Nov 2012 10:13:10 GMT
Content-Length: 0
Connection: Keep-Alive

Ama bu çağrı kayıt alır değil, HTTPS ile bir sorun olmalı

curl --proxy 127.0.0.1:9100 https://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png

Başlık çıktı

CONNECT d3jgo56a5b0my0.cloudfront.net:443 HTTP/1.1
Host: d3jgo56a5b0my0.cloudfront.net:443
User-Agent: curl/7.24.0 (x86_64-apple-darwin12.0) libcurl/7.24.0 OpenSSL/0.9.8r zlib/1.2.5
Proxy-Connection: Keep-Alive

HTTP/1.1 200 OK 
Server: WEBrick/1.3.1 (Ruby/1.9.3/2012-10-12)
Date: Tue, 20 Nov 2012 10:15:48 GMT
Content-Length: 0
Connection: close

Belki proxy HTTPS kaldıramaz, ama olabilir diye düşündüm (sonra konsolda çıktı Ara cURL alıyorum sürece). O zaman, belki VCR HTTPS istekleri sahte olabilir mi diye düşündüm. Ama bu komut dosyası kullanarak, VCR proxy kullanmıyorum, HTTPS istekleri alay,:

require 'vcr'

VCR.configure do |c|
  c.hook_into :webmock
  c.cassette_library_dir = 'cassettes'
end

uri = URI("https://d3jgo56a5b0my0.cloudfront.net/images/v7/application/stories_view/icons/bug.png")

VCR.use_cassette('https', :record => :new_episodes) do
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  response = http.request_get(uri.path)
  puts response.body
end

Sorun nedir? VCR HTTPS ve proxy HTTPS ele alır. Birlikte oynamıyorlar neden?

CEVAP
19 Mart 2013, Salı


Bu yüzden biraz araştırma yaptım ve şimdi MITM bir proxyserver olarak HTTPS çağrıları işleyen bir çalışma VCR bir proxy sunucusu, çok temel bir örnek, eğer müvekkiliniz güvenlik denetimi devre dışı ise). Eğer birisi katkıda bulunmak ve bana bu şeyi hayata için yardımcı olabilir eğer ben çok mutlu olurdu.

Burada github repo: https://github.com/23tux/vcr_proxy

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Incredible Tutorials

    Incredible T

    27 EKİM 2006
  • TouchePro

    TouchePro

    27 EYLÜL 2007
  • Willie D.

    Willie D.

    16 Aralık 2006