2009-08-20 4 views
0

zu vermeiden, wie in "Ruby on Rails"Rails - wie Cross-Site-Scripting-

i unter

den Code

verwendet Cross-Site-Scripting zu vermeiden und, möchte ich wissen, wie und wo wir tun Überprüfen Sie, ob dieses Skript funktioniert oder nicht.

+0

Was meinst du mit "dieses Skript überprüfen"? Verwenden Sie Tests? Starten Sie den Server und laden Sie die Seite im Browser? Auch die neueste Version von Rails (und früher) unterstützt Code wie "<% = link_to @ user.name, @user%>". – askegg

+0

Wenn Sie als Namen eines Benutzers zuweisen und dann das Ergebnis von #{@user.name} im Gegensatz zu # {h (@user .name)} Sie werden sehen, dass die h() -Methode tatsächlich das html-Escaping durchführt. – Maulin

Antwort

2

Sie sollten alles in Ihren Ansichten, die von Dritten manipuliert werden können, z. B. Attribute und Parameter, verlassen. In Ihrem Beispiel habe ich einen Benutzer mit dem Namen <script type="text/javascript">alert("XSS")</script> erstellt. Angenommen, Sie bestätigen nur die Anwesenheit eines Namens, wäre dies gültig.

<!-- Raw output --> 
<a href="#"><script type="text/javascript">alert("XSS")</script></a> 

Client, der diese Seite mit aktiviertem JavaScript anzeigt, wird die standardmäßige Warnmeldung sehen. Dies zeigt, dass ich JavaScript in Ihrer Ansicht injizieren kann.

<!-- Escaped output --> 
<a href="#">&lt;script type=&quot;text/javascript&quot;&gt;alert(&quot;XSS&quot;)&lt;/script&gt;</a> 

Client-Seite mit JavaScript sehen aktiviert wird den Standard Alarm Aufforderung nicht sehen.

Mit dieser Technik können Sie überprüfen, ob eine Ansicht für Cross-Site-Scripting-Angriffe anfällig ist.

Eine alternative Option ist die Verwendung von HAML. HAML kann so konfiguriert werden, dass die Ausgabe immer ignoriert wird, es sei denn, Sie verlangen explizit, dass sie unverarbeitet ist. Ich glaube, dass dies das Standardverhalten in Rails 3 mit ERb sein wird.

+0

Alle in Rails integrierten Funktionen (z. B. link_to) werden standardmäßig nicht ausgegeben. Dies wird auch zum Standardverhalten für erb in Rails 3 gemacht. – askegg

+0

'name' Parameter ist standardmäßig nicht maskiert. Nur Optionen, die von 'url_for' ausgewertet werden, sind geflutet. –

+0

Ja - ich hätte das klarstellen sollen :( – askegg

0

Wenn Sie Auto-Escape zu Rails 2.x hinzufügen möchten, werfen Sie einen Blick auf rails_xss von Michael Koziarski. Genau das, was du suchst :)