Estoy mirando este episodio de Railscast y me pregunto por qué escape_javascript
se necesita la llamada aquí:
$("#reviews").append("<%= escape_javascript(render(:partial => @review)) %>");
¿Para qué se escape_javascript
usa?
De acuerdo con los documentos de Rails :
escape_javascript (javascript)
Escape del operador devuelve y comillas simples y dobles para segmentos de JavaScript.
Pero eso no significa mucho para mí.
Respuestas:
¿Porque no desea que los usuarios publiquen JavaScript que el navegador realmente ejecuta?
fuente
Es más fácil de entender si divide el código en dos partes.
La primera parte
$("#reviews").append("<%= ... %>");
es javascript con erb. Esto significa que<%= ... %>
será reemplazado por lo que devuelva el código ruby que contiene. El resultado de ese reemplazo debe ser javascript válido, de lo contrario arrojará un error cuando el cliente intente procesarlo. Así que eso es lo primero: necesitas JavaScript válido .Otra cosa a tener en cuenta es que lo que sea que ruby genere debe estar contenido dentro de una cadena de JavaScript con comillas dobles: observe las comillas dobles alrededor del
<%= ... %>
. Esto significa que el JavaScript generado se verá así:Ahora examinemos la parte rubí dentro del
<%= ... %>
. ¿Quérender(:partial => @review)
hacer? Está renderizando un parcial, lo que significa que podría representar cualquier tipo de código: html, css ... ¡o incluso más javascript!Entonces, ¿qué sucede si nuestro parcial contiene algún html simple, como este?
¿Recuerdas que tu javascript estaba tomando una cadena entre comillas dobles como parámetro? Si simplemente reemplazamos el
<%= ... %>
con el código de ese parcial, entonces tenemos un problema, ¡inmediatamente después de quehref=
hay una comilla doble! El javascript no será válido:Para que esto no suceda, desea escapar de estos caracteres especiales para que su cadena no se corte; necesita algo que genere esto en su lugar:
Esto lo que
escape_javascript
hace. Se asegura de que la cadena devuelta no "rompa" JavaScript. Si lo usa, obtendrá el resultado deseado:¡Saludos!
fuente
escape_for_javascript
, ya que a menudo se escapa de otro código (html, por ejemplo) para que no rompa javascript.escape_javascript()
ahora tiene un método más corto: simplej()
(al menos en Rails 4).los usuarios pueden publicar código malicioso (usuarios maliciosos) que, si no se escapan, se ejecutarán potencialmente, lo que les permitirá controlar su aplicación.
prueba esto:
no estoy realmente familiarizado con la sintaxis de los rieles, pero si no escapa
variable
, aparecerá un cuadro de alerta, y no creo que ese sea el comportamiento previsto.fuente
Si miras la fuente aquí , será mucho más claro.
Esta función cumple las siguientes dos cosas:
Sustituye los caracteres en la cadena de entrada con los definidos en JS_ESCAPE_MAP
El propósito de esto es asegurarse de que el código JavaScript esté serializado correctamente sin interferir con la cadena externa dentro de la cual se está incrustando. Por ejemplo, si tiene una cadena de JavaScript entre comillas dobles, todas las comillas para los literales de cadena deben estar entre comillas simples para evitar que el código se rompa.
Cuando usa escape_javascript, generalmente se incrusta dentro de otra cadena o html existente dinámicamente. Debes asegurarte de que hacer esto no hará que toda tu página no se procese.
Algunos aspectos de esta respuesta se señalaron en otras respuestas, pero quería reunir todos los elementos, incluida la diferencia entre el escape de JavaScript y el escape de HTML. Además, algunas respuestas aluden que esta función ayuda a evitar la inyección de script. No creo que ese sea el propósito de esta función. Por ejemplo, en su revisión si su revisión tiene alerta ('hola allí'), solo agregarlo al nodo no activará la ventana emergente. No lo está incrustando dentro de una función que se activa al cargar la página o mediante algún otro evento. Simplemente tener alerta ('hola') como parte de su html no significa que se ejecutará como javascript.
Dicho esto, no estoy negando que la inyección de script no sea posible. Pero para evitar eso, debe tomar medidas cuando tome los datos del usuario y los almacene en su base de datos. La función y el ejemplo que proporciona están relacionados con la representación de la información, que ya se guardó.
Espero que esto ayude y responda tu pregunta.
fuente