2012-09-21 3 views
0

Je veux faire une application Sinatra simple qui quand je navigue à "/ proxy /: someurl" je verrai le contenu exact de la navigation directement à: someurl, AKA un simple proxy web, sorte de iframe pleine page.Comment faire un proxy dans Sinatra?

Quelle est la meilleure façon de faire cela?

Répondre

2
require 'sinatra' 
require 'open-uri' 

get '/proxy' do 
    url = params[:url] 
    raise "GTFO" if (url[0] == '/' || url[0] == '.') 
    open(url) do |content| 
    content.read.to_s.gsub(/(href|src)=("|')\//, '\1=\2' + url + '/') 
    end 
end 

Ce script obtient le contenu d'une page, grâce à OpenURI, fixe des scripts, feuilles de style et des liens images, affiche le résultat. J'ai utilisé une route /proxy?url=http://url.com/ au lieu d'une route /proxy/url. Sinatra n'aime pas les barres obliques et caractères spéciaux qui sont généralement dans les URL.

+0

Cela fonctionne, mais les scrips et les feuilles de style n'ont pas fonctionné. Avez-vous essayé ce code? –

+0

En fait cela fonctionne parfois (comme avec yahoo.com) mais pas d'autres (comme avec habosa.com), aucune idée pourquoi c'est? Par ailleurs, il y a beaucoup plus de choses avec lesquelles ça marche que d'autres. –

+4

L'utilisation de 'open-uri' provoque cette implémentation non seulement pour le contenu HTTP proxy, mais aussi pour les fichiers locaux:' GET/proxy? Url =/etc/passwd'. S'amuser! – willglynn

4

La chose la plus simple serait d'utiliser par ex. RestClient et dit:

get '/proxy/:url' do |url| 
    RestClient.get(url) 
end 

Cela permettrait de remplacer le contenu de toute récupération réussie. Faites un peu plus de travail, et vous passez par les types de contenu et les en-têtes de contrôle de cache. Un peu plus, et vous pouvez passer à travers les codes d'erreur. Puis POSTs. Alors ...

Cela dit, je ne vais pas vous aider davantage parce que faire de votre proxy serveur Web un contenu arbitraire est une idée terrible. Cela mine le same origin policy qui est la base de la sécurité Web. C'est lent (attachant votre serveur web en attente d'un autre serveur web) et/ou non trivial (si vous partez avec sinatra-async + em-http-request). Cela fait de votre serveur web un anonymiseur qui invite totalement les abus. Juste ... ne le fais pas.

  • mandatement URL arbitraires: mauvaise.
  • Proxier du contenu à partir d'URL spécifiques de confiance: peut-être OK, mais ce n'est probablement pas la meilleure solution.
Questions connexes