javascript - Varför använda escape_javascript innan man renderar en partial?


Jag tittar på det här Railscast-avsnittet och undrar varför anropet till escape_javascript behövs här:

$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");

Vad används escape_javascript till?

Enligt Rails-dokumentationen:

escape_javascript(javascript)

Escapa vagnreturer samt enkla och dubbla citattecken för JavaScript-segment.

Men det betyder inte mycket för mig.

Svar #1

Det är lättare att förstå om du delar upp koden i två delar.

Den första delen $ ("#reviews").append("<%= ... %>"); är javascript med erb. Detta betyder att <%= ... %> kommer att ersättas med vad än ruby-koden inuti den returnerar. Resultatet av den ersättningen måste vara giltig javascript, annars kommer det att ge ett fel när klienten försöker bearbeta det. Så det är det första: du behöver giltig javascript.

En annan sak att ta hänsyn till är att vad än Ruby genererar måste vara innehållet i en Javascript-sträng med dubbla citattecken - notera de dubbla citattecknen kring <%= ... %>. Detta betyder att den genererade Javascript kommer att se ut så här:

$("#reviews").append("...");

Nu låt oss undersöka Ruby-delen inuti <%= ... %>. Vad gör render(:partial => @review)? Det renderar en partial - vilket betyder att det kan rendera vilken typ av kod som helst - HTML, CSS ... eller till och med mer JavaScript!

Så, vad händer om vår del innehåller lite enkel HTML, som den här?

<a href="/mycontroller/myaction">Action!</a> 

Kom ihåg att din javascript tog en sträng med dubbla citationstecken som parameter? Om vi helt enkelt ersätter <%= ... %> med koden för den delningen, då har vi ett problem - direkt efter href= finns ett dubbelt citationstecken! Javascript kommer inte att vara giltigt:

// Without escaping, you get a broken javascript string at href
$("#reviews").append("<a href="/mycontroller/myaction">Action!</a>");

För att detta inte ska hända vill du undkomma dessa specialtecken så att din sträng inte kapas - du behöver något som genererar detta istället:

<a href=\"/mycontroller/myaction\">Action!</a>

Detta är vad escape_javascript gör. Det säkerställer att strängen som returneras inte kommer att "bryta" javascript. Om du använder det kommer du att få önskat resultat:

$("#reviews").append("<a href=\"/mycontroller/myaction\">Action!</a>")

Hälsningar!

Svar #2

användare kan posta skadlig kod (skadliga användare) som om den lämnas okodad kan köras, vilket tillåter användare att kontrollera din applikation.

prova detta:

<% variable = '"); alert("hi there' %>
$("#reviews").append("<%= variable %>");

inte riktigt bekant med syntaxen i Rails, men om du inte undviker variable så kommer en alert-ruta att visas, och jag tror inte att det är avsedd beteende.

Relaterade artiklar