2015-12-10 12 views
8

In un'app Rails simile, sono stato in grado di eseguire una funzione ricorsiva di controllo hash che esegue quindi il metodo clean/framment della gemma Sanitize per rimuovere qualsiasi elemento HTML dall'hash dei parametri in entrata. Ho usato un filtro before in application_controller in modo che tutto venga cancellato dall'app (è una grande app).Come posso disinfettare tutti i parametri che arrivano in un'app Sinatra?

Backstory: gli attacchi XSS erano possibili, in particolare nei browser IE, ma in realtà non vogliamo che nessuna di queste cose venga salvata nel database. Sebbene l'obiettivo finale fosse che l'output JSON non lo contenesse.

ho cercato di fare la stessa cosa in un'applicazione Sinatra (che ha qualche ActiveSupport e JRuby ActiveRecord bundle in), ma la gemma Sanitize non si fascio, perché questa particolare applicazione viene eseguita in JRuby per alcuni motivi di database. Sanitize ha bisogno di Nokogiri, che a sua volta ha bisogno di Nokogumbo, e quest'ultimo non si costruirà in questo ambiente JRuby.

Così ho provato a fare un filtro prima in app.rb usando il metodo di fuga html incorporato di Rack :: Util, ma questo fa esplodere l'app.

Esistono soluzioni alternative che posso pensare

1) Sanificazione tutti i params in arrivo in un (JRuby) Sinatra app

E se no, una minore possibilità:

2) rendere più quindi tutto il JSON che viene analizzato disinfetta i valori in detti elenchi di valori degli attributi JSON?

PS - Parte del problema qui è che un gioiello locale incluso, che gestisce molti parametri e esegue il rendering JSON, si sta rivelando impossibile eseguire il debug. Includerò Pry sia nell'app host, sia nella gemma localmente collegata, e quando provo a fare leva su Gem, non riesco a visualizzare l'hash params (che appare solo come vuoto) - sembra che sia un problema di scopo.

+0

Qual è il problema con l'utilizzo di 'Rack :: Utils.escape_html' nel filtro precedente? – matt

risposta

1

Sanitize gem non si raggruppa, perché questa particolare applicazione viene eseguita in JRuby per alcuni motivi di database. Sanitize ha bisogno di Nokogiri, che a sua volta ha bisogno di Nokogumbo, e quest'ultimo non si costruirà in questo ambiente JRuby.

sembra sbagliato come opere Nokogiri in JRuby (ha un -java gemma specifico), provare un bundle update nokogiri in modo da ottenere Sanitize a giocare bene ...

Così ho provato a fare un prima filtro app.rb che utilizza il metodo di escape html incorporato di Rack :: Util, ma che fa esplodere l'app.

ancora, peccato. magari postare dettagli sulle versioni della gemma e sui fallimenti in cui ti imbatti. anche se l'opzione preferita, credo, sarebbe quella di ottenere qualcosa che funzionasse sotto la risonanza magnetica operando sotto JRuby - quindi proverei ancora a usare Nokogiri.

+0

Sono stato in grado di ottenere Nokogiri da creare con JRuby, ma il gemspec della gemma Sanitize ha anche una dipendenza specifica da Nokogumbo, impostata alla versione 1.4.1, e che non sarebbe stata costruita con JRuby, quindi è qui che la gemma Sanitize sembrava fallire essere un'opzione. – rcd

+0

dovresti essere più preciso nella domanda: * Sanitize ha bisogno di Nokogiri, che a sua volta ha bisogno di Nokogumbo * che ho capito male. quindi le opzioni a sinistra sono costruite un'interfaccia compatibile con Nokogumbo, ad es. utilizzando un "nativo" [parser Java HTML] (http://java-source.net/open-source/html-parsers) (scrivendo un'estensione JRuby o utilizzando l'integrazione di scripting Java di JRuby) o esegui la migrazione in una libreria diversa come hai tentato . entrambi non sono realmente per una risposta SO ma più della sessione di codifica del mondo reale :) – kares

0

Per Sinatra, ci sono 2 buoni modi per scappare. Entrambi sono menzionati sul sito web. http://www.sinatrarb.com/faq.html#escape_html

1) Utilizzo del rack. L'op ha detto che stava facendo esplodere l'app. Potresti spiegarci di più? Nel frattempo, per utilizzare il metodo rack, è possibile utilizzare il seguente frammento di codice. Una volta che il param è stato pulito, puoi usarlo.

cleanedParam = Rack::Utils.escape_html(params[:some_param_name]) 

2) Utilizzando Erubis gemma. La gemma è scritta in puro rubino. Imposta la gemma erubis come segue:

require 'erubis' 
set :erb, :escape_html => true 

Una volta fatto ciò, è possibile utilizzare erubis quando outputing un modello

erb :index 
0

È possibile scorrere ciascuno dei parametri nella params hash e utilizzare Rack di escape_html metodo per sfuggire agli elementi HTML contenuti in ciascun parametro.

params.each do |p, v| 
    params[p] = Rack::Utils.escape_html(v) 
end 

La documentazione di escape_html può essere trovata here.

Problemi correlati