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.
