2010-05-08 6 views
0

Je suis très novice dans Ruby on Rails et je n'ai jamais vraiment écrit de JavaScript, donc les aides construites étaient comme un petit coin de paradis. Cependant, j'ai récemment appris que l'utilisation des méthodes d'aide crée un "javascript gênant", donc je fais un petit refactoring pour sortir tout ce code désordonné de mon avis. J'utilise également l'API Prototype pour comprendre ce que toutes ces fonctions font.Comment implémenter un programme d'exécution périodique 'sûr' sans utiliser les aides Rails?

En ce moment, j'ai:

<%= periodically_call_remote(:url => {:action => "tablerefresh", :id => 1 }, :frequency => '5', :complete => "load('26', 'table1', request.responseText)")%> 

qui produit:

<script type="text/javascript"> 
    //<![CDATA[ 
    new PeriodicalExecuter(function() {new Ajax.Request('/qrpsdrail/grids/tablerefresh/1', {asynchronous:true, evalScripts:true, onComplete:function(request){load('26', 'table1', request.responseText)}, parameters:'authenticity_token=' + encodeURIComponent('dfG7wWyVYEpelfdZvBWk7MlhzZoK7VvtT/HDi3w7gPM=')})}, 5) 
    //]]> 
</script> 

Ma préoccupation est que le "encodeURIComponent" et la présence de "authenticity_token" sont générés par Rails. Je suppose que ceux-ci sont utilisés pour assurer la validité d'une demande. (Faire en sorte qu'une requête provienne d'une session actuellement active?)

Si tel est le cas, comment puis-je l'implémenter dans application.js "en toute sécurité"? Il semble que la méthode intégrée, bien qu'intrusive, ajoute une sécurité bénéfique. Merci d'avance à tous ceux qui répondent. Rails génère un jeton d'authentification pour se protéger contre les attaques XSS.

Répondre

2

Voir: ActionController::RequestForgeryProtection Vous pouvez l'éteindre mais, vous avez raison, il est beaucoup plus sûr de l'utiliser.

La solution la plus facile qui vient à l'esprit serait de mettre juste le jeton d'authentification quelque part en haut de votre page:

<% javascript_tag do %> 
<%= "var AUTH_TOKEN=encodeURIComponent(#{form_authenticity_token.inspect});" %> 
<% end %> 

Il est importun, mais au moins vous pouvez utiliser librement la variable auth_token dans votre fichier application.js.

+0

Merci, c'est exactement ce dont j'ai besoin pour faire ce travail. Alors vraiment la seule façon de faire cette demande de protection contrefaçon XSS est une méthode envahissante? Puisque les fichiers .js ne sont jamais analysés par Rails? – Robbie

+0

Oui, vous devez générer une nouvelle clé avec chaque requête et votre js doit être mis en cache. Vous pouvez également essayer quelque chose de plus créatif comme le cacher dans un noeud DOM, etc., mais une seule étiquette de script ne devrait pas être une telle pénalité. Il a été question d'intégrer un script discret dans Rails 3, vous voudrez peut-être voir ce qu'ils font pour cela. – jdeseno

Questions connexes