2015-12-10 16 views
8

In einer ähnlichen Rails-App konnte ich eine rekursive Hash-Prüffunktion erstellen, die dann die clean/fragment-Methode des Sanitize-Edelsteins ausführt, um alle HTML-Elemente aus dem eingehenden params-Hash zu entfernen. Ich habe im application_controller einen before-Filter verwendet, so dass alles App-weit geschrubbt wird (es ist eine große App).Wie kann ich alle Params sanieren, die in eine Sinatra App kommen?

Backstory: XSS-Angriffe waren möglich, besonders in IE-Browsern, aber wir wollen wirklich nicht, dass irgendwas davon in der Datenbank gespeichert wird. Obwohl das ultimative Ziel war, dass JSON-Ausgabe es nicht enthielt.

Ich habe versucht, das gleiche in einer Sinatra-App (die einige ActiveSupport und JRuby ActiveRecord gebündelt) zu tun, aber die Sanitize Edelstein wird nicht bündeln, weil diese bestimmte App in JRuby für einige Datenbank-Gründe ausgeführt wird. Sanitize braucht Nokogiri, das wiederum Nokogumbo benötigt, und letzteres wird einfach nicht in dieser JRuby-Umgebung gebaut.

Also habe ich versucht, einen vor Filter in app.rb mit Rack :: Util eingebauten HTML-Escape-Methode, aber das sprengt die App.

Gibt es alternative Möglichkeiten, wie ich denken kann,

1) Sanitizing alle eingehenden params in ein (JRuby) Sinatra App

Und wenn nicht, eine geringere Option:

2) es macht JSON, das analysiert wird, saniert also Werte in den JSON-Attribut-Wert-Listen?

PS - Ein Teil des Problems hier ist, dass ein eingeschlossenes lokales Juwel, das viele der Parameter behandelt und JSON-Rendering durchführt, sich als unmöglich erweist, zu debuggen. Ich schließe Pry sowohl in der Host-App als auch in dem lokal verknüpften Juwel ein, und wenn ich versuche, in den Edelstein hineinzuwachsen, kann ich den params-Hash nicht anzeigen (er wird nur als leer angezeigt) - es scheint sich um ein Problem zu handeln Umfang.

+0

Was war das Problem mit 'Rack :: Utils.escape_html' im Vorher-Filter? – matt

Antwort

1

Sanitize Edelstein wird nicht gebündelt, weil diese bestimmte App in JRuby für einige Datenbankgründe läuft. Sanitize braucht Nokogiri, das wiederum Nokogumbo benötigt, und letzteres wird einfach nicht in dieser JRuby-Umgebung gebaut.

scheint falsch als Nokogiri in JRuby funktioniert (hat eine -java spezifische Juwel), versuchen, eine bundle update nokogiri, so dass Sie Sanitize schön zu spielen bekommen ...

Also habe ich versucht, bevor der Filter ein tun in app.rb mit Rack :: Util eingebaute HTML-Escape-Methode, aber das sprengt die App.

wieder, schade. vielleicht posten Sie Details zu Ihren Edelstein-Versionen und den Fehlern, denen Sie begegnen. obwohl die bevorzugte Option, glaube ich, wäre, etwas zu bekommen, das unter MRI arbeitet, arbeitet unter JRuby - so würde ich wieder versuchen, Nokogiri zu verwenden.

+0

Ich konnte Nokogiri dazu bringen, mit JRuby zu bauen, aber die Gemspec des Sanitize-Edelsteins hat auch eine spezifische Abhängigkeit von Nokogumbo, die auf Version 1.4.1 eingestellt ist und die nicht mit JRuby bauen würde, also scheint das Sanitize-Juwel zu versagen eine Option sein. – rcd

+0

sollten Sie in der Frage genauer gewesen sein: * Sanitize braucht Nokogiri, was wiederum Nokogumbo * benötigt, was ich falsch verstanden habe. Die verbleibenden Optionen sind also eine Nokogumbo-kompatible Schnittstelle, z. Verwendung eines "nativen" [Java HTML Parser] (http://java-source.net/open-source/html-parsers) (Schreiben einer JRuby-Erweiterung oder Verwenden der Java-Scripting-Integration von JRuby) oder Migrieren zu einer anderen Bibliothek, wie Sie es versuchten . Beide sind nicht wirklich für eine SO-Antwort, sondern mehr von der realen Welt Codierungssitzung :) – kares

0

Per Sinatra gibt es 2 gute Möglichkeiten zu entkommen. Beide werden auf der Website erwähnt. http://www.sinatrarb.com/faq.html#escape_html

1) Verwendung des Racks. Der Op erwähnte, dass es die App in die Luft jagte. Könntest du bitte mehr erklären? Um die Rack-Methode zu verwenden, können Sie das folgende Code-Snippet verwenden. Sobald der Parameter gereinigt wurde, kannst du das verwenden.

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

2) erubis gem Verwendung. Der Edelstein ist in reinem Rubin geschrieben. Richten Sie das erubis Juwel wie folgt:

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

Sobald dies geschehen ist, können Sie erubis verwenden, wenn eine Vorlage outputing

erb :index 
0

Sie durch jeden des Parameters in dem params Hash laufen können und Racks verwenden escape_html Methode, um HTML-Elemente aus den einzelnen Parametern zu entfernen.

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

Die Dokumentation für escape_html kann here finden.