Ich schaue mir diese Railscast-Episode an und frage mich, warum der Anruf escape_javascript
hier benötigt wird:
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
Wofür wird escape_javascript
verwendet?
Laut den Rails-Dokumenten :
Escape_Javascript (Javascript)
Escape Carrier kehrt zurück und einfache und doppelte Anführungszeichen für JavaScript-Segmente.
Das bedeutet mir aber nicht viel.
Antworten:
Weil Sie nicht möchten, dass Benutzer JavaScript veröffentlichen, das der Browser tatsächlich ausführt?
quelle
Es ist einfacher zu verstehen, wenn Sie den Code in zwei Teile teilen.
Der erste Teil
$("#reviews").append("<%= ... %>");
ist Javascript mit erb. Dies bedeutet, dass der<%= ... %>
durch den darin enthaltenen Ruby-Code ersetzt wird. Das Ergebnis dieser Ersetzung muss gültiges Javascript sein, andernfalls wird ein Fehler ausgegeben, wenn der Client versucht, ihn zu verarbeiten. Das ist also das Erste: Sie benötigen gültiges Javascript .Eine andere Sache, die berücksichtigt werden muss, ist, dass alles, was Ruby erzeugt, in einer Javascript-Zeichenfolge mit doppelten Anführungszeichen enthalten sein muss - beachten Sie die doppelten Anführungszeichen um das
<%= ... %>
. Dies bedeutet, dass das generierte Javascript folgendermaßen aussieht:Lassen Sie uns nun den Rubinteil im Inneren untersuchen
<%= ... %>
. Was machtrender(:partial => @review)
das Es wird ein Teil gerendert - was bedeutet, dass es jede Art von Code rendern kann - HTML, CSS ... oder noch mehr Javascript!Was passiert also, wenn unser Teil ein einfaches HTML wie dieses enthält?
Denken Sie daran, dass Ihr Javascript eine Zeichenfolge in doppelten Anführungszeichen als Parameter verwendet hat? Wenn wir das einfach durch den
<%= ... %>
Code dieses Teils ersetzen , haben wir ein Problem - unmittelbar danachhref=
gibt es ein doppeltes Anführungszeichen! Das Javascript ist ungültig:Damit dies nicht passiert, möchten Sie diesen Sonderzeichen entkommen , damit Ihre Zeichenfolge nicht abgeschnitten wird. Stattdessen benötigen Sie etwas, das dies generiert:
Das was
escape_javascript
macht. Es stellt sicher, dass die zurückgegebene Zeichenfolge kein Javascript "bricht". Wenn Sie es verwenden, erhalten Sie die gewünschte Ausgabe:Grüße!
quelle
escape_for_javascript
, da Sie häufig anderen Code (z. B. HTML) entkommen, damit kein Javascript beschädigt wird.escape_javascript()
hat jetzt eine kürzere Methode: simpleyj()
(mindestens in Rails 4).Benutzer können bösartigen Code (böswillige Benutzer) veröffentlichen, der möglicherweise ausgeführt wird, wenn er nicht entführt wird, sodass Benutzer Ihre Anwendung steuern können.
Versuche dies:
variable
Ich bin nicht wirklich mit der Syntax von Schienen vertraut, aber wenn Sie nicht entkommen, wird eine Warnmeldung angezeigt, und ich glaube nicht, dass dies beabsichtigtes Verhalten ist.quelle
Wenn Sie sich die Quelle hier ansehen , wird es viel klarer.
Diese Funktion führt die folgenden zwei Dinge aus:
Es ersetzt die Zeichen in der Eingabezeichenfolge durch die in JS_ESCAPE_MAP definierten
Damit soll sichergestellt werden, dass der Javascript-Code korrekt serialisiert wird, ohne die äußere Zeichenfolge zu beeinträchtigen, in die er eingebettet wird. Wenn Sie beispielsweise eine Javascript-Zeichenfolge in doppelten Anführungszeichen haben, müssen alle Anführungszeichen für Zeichenfolgenliterale in einfachen Anführungszeichen stehen, damit der Code nicht beschädigt wird.
Wenn Sie Escape_Javascript verwenden, wird es normalerweise dynamisch in eine andere Zeichenfolge oder ein vorhandenes HTML eingebettet. Sie müssen sicherstellen, dass dadurch nicht Ihre gesamte Seite gerendert wird.
Einige Aspekte dieser Antwort wurden in anderen Antworten hervorgehoben, aber ich wollte alle Elemente zusammenführen, einschließlich des Unterschieds zwischen Javascript-Escape und HTML-Escape. Einige Antworten weisen auch darauf hin, dass diese Funktion dazu beiträgt, das Einfügen von Skripten zu vermeiden. Ich denke nicht, dass dies der Zweck dieser Funktion ist. Wenn Ihre Bewertung beispielsweise in Ihrer Bewertung eine Warnung enthält ("Hallo"), wird das Popup nicht ausgelöst, wenn Sie sie nur an den Knoten anhängen. Sie binden es nicht in eine Funktion ein, die beim Laden der Seite oder durch ein anderes Ereignis ausgelöst wird. Nur eine Warnung ('hi there') als Teil Ihres HTML-Codes zu haben, bedeutet nicht, dass es als Javascript ausgeführt wird.
Trotzdem leugne ich nicht, dass eine Skriptinjektion nicht möglich ist. Um dies zu vermeiden, müssen Sie Schritte unternehmen, wenn Sie die Benutzerdaten in Ihrer Datenbank speichern. Die von Ihnen bereitgestellte Funktion und das Beispiel beziehen sich auf das Rendern der Informationen, die bereits gespeichert wurden.
Ich hoffe das hilft und beantwortet deine Frage.
quelle