Der beste Weg, um Benutzereingaben in Schienen zu sanieren
Ich habe viel gelesen über diese und weiß, es gibt viele Fragen hier, aber ich konnte nicht finden eine definitive Anleitung, wie Sie gehen über die Hygienisierung alles. Eine Möglichkeit ist, desinfizieren Sie auf einfügen, zum Beispiel habe ich Folgendes in meinem Modell
before_validation :sanitize_content, :on => :create
def sanitize_content
self.content = ActionController::Base.helpers.sanitize(self.content)
end
Benötige ich, um diese auf jedem Feld in jedem Modell? Ich vermute, die :an => :erstellen sollten entfernt werden, zu, so läuft es bei updates auch?
Die andere option ist zu bereinigen, wenn die Daten angezeigt werden in Ansichten mit simple_format, oder .html_safe oder desinfizieren(fieldname). Sollte ich die Hygienisierung in allen meinen Ansichten für jeden einzelnen Bereich, als auch auf legen?? Dass dies manuell tun, überall scheint nicht sehr railsy
Vielen Dank für jede Hilfe
InformationsquelleAutor der Frage Dave | 2014-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR
Bezug auf die Benutzer-Eingabe und Abfragen: Stellen Sie sicher, dass Sie immer die active record query-Methoden (wie
.where
), und vermeiden Sie die übergabe von Parametern verwenden von string-interpolation; übergeben Sie als hash-Werte der parameter, oder als parametrisierte Aussagen.In Bezug auf rendering potenziell unsichere user-generierten html - /javascript-Inhalte: Als der Rails-3 -, html - /javascript-text wird automatisch maskiert, so dass es erscheint als text auf der Seite, anstatt so interpretiert, html/javascript, so brauchen Sie nicht explizit zu bereinigen (oder verwenden Sie
<%= h(potentially_unsafe_user_generated_content)
%>Wenn ich Sie richtig verstehe, brauchen Sie nicht zu befürchten, bereinigen von Daten in dieser Weise, solange Sie die Verwendung des active-record-Abfrage-Methoden richtig. Zum Beispiel:
Können sagen, dass unsere parameter-Karte sieht aus wie dieses, als ein Ergebnis von einem böswilligen Benutzer die Eingabe der folgenden Zeichenfolge in der
user_name
Feld:Der schlechte Weg (tun Sie das nicht):
Die resultierende Abfrage würde wie folgt Aussehen:
Direkte string-interpolation auf diese Weise wird der wörtliche Inhalt des parameter-Werts mit Taste
:user_name
in die Abfrage ohne Bereinigung. Wie Sie wahrscheinlich wissen, der böswillige Benutzer die Eingabe so behandelt, als plain 'ol SQL, und die Gefahr ist ziemlich klar.Der gute Weg (Do):
ODER
Die resultierende Abfrage würde wie folgt Aussehen:
So wie Sie sehen können, Schienen in der Tat bereinigt es für Sie, so lange wie Sie übergeben die parameter als hash, oder die parameter der Methode (je nachdem, welche query-Methode, die Sie verwenden).
Falle für die Bereinigung der Daten auf die Schaffung neuer Modell-Datensätze nicht wirklich anwenden, da die
new
odercreate
Methoden erwarten eine hash-Werte. Auch wenn Sie versuchen, zu injizieren unsichere SQL-code in der hash, der die Werte der hash-behandelt werden als einfache Zeichenfolgen, zum Beispiel:Ergebnisse in der Abfrage:
So, gleiche situation wie oben.
Ich hoffe, das hilft. Lassen Sie mich wissen, wenn ich es verpasst habe oder etwas missverstanden.
Bearbeiten
In Bezug auf die Flucht html und javascript, die kurze version ist, dass ERB "maskiert" Sie Ihre string-Inhalte für Sie, so dass es behandelt wird-als text. Sie kann haben es behandelt, wie zum Beispiel html, wenn Sie wirklich wollen, zu tun
your_string_content.html_safe
.Doch einfach etwas wie
<%= your_string_content %>
ist absolut sicher. Der Inhalt wird behandelt, als einen string auf der Seite. In der Tat, wenn Sie überprüfen den DOM mit Chrome Developer Tools oder Firebug, sollten Sie in der Tat sehen Sie Anführungszeichen um die Zeichenkette.InformationsquelleAutor der Antwort Paul Richter
Weil ich immer zu schätzen, wenn ich die Quelle des Wissens und der code auf jeder, SO die Antwort, die ich geben werde, für diese Frage.
Beide ActiveRecord und ActionController stellen Methoden zur Bereinigung von sql-Eingabe.
Speziell von
ActiveRecord::Sanitization::ClassMethods
Sie haben sanitize_sql_for_conditions und seine zwei anderen Aliase:sanitize_conditions und sanitize_sql. Die drei buchstäblich genau dasselbe.
sanitize_sql_for_conditions
Jedoch in ActiveRecord haben Sie auch
sanitize_sql_for_assignment
dieAuf der anderen Seite, in ActionController Sie haben
ActionController::Parameters
wodurch SieParameter magic genannt wird Starke Parameter, docs hier.
Ich hoffe, das hilft jemand, wenn auch nur zu lernen und zu entmystifizieren Schienen! 🙂
InformationsquelleAutor der Antwort Bryan Dimas