2011-10-27 3 views
2

Ainsi, certains utilisateurs de notre système copient et collent du texte dans mon application. Dans mes journaux, je remarquerai occasionnellement ceci:Comment traiter une séquence d'octets invalide pour l'entrée de l'utilisateur via le middleware Rack?

ArgumentError (invalid byte sequence in US-ASCII): 
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `=~' 
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `!~' 
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `blank?' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:202:in `nonempty_ok_response?' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:188:in `handle_conditional_get!' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:141:in `prepare!' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:540:in `send_response' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:534:in `process' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/filters.rb:606:in `process_with_filters' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:391:in `process' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:386:in `call' 
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/routing/route_set.rb:438:in `call' 

Et voici les détails de la demande. Notez les caractères invalides.

Parameters: {"attendee"=>{"segment"=>"Middle Market \xE2\x80\x93 West Region"}} 

Le problème est que les codages de caractères sont désactivés. Mon application est configurée pour UTF-8, et je crois qu'ils envoient des caractères ASCII. J'ai besoin d'un moyen de filtrer cela afin que je puisse éviter l'erreur ci-dessus.

Notez que l'erreur est déclenchée avant même qu'il ne parvienne à mon application. Par conséquent, je suppose que la meilleure solution est Rack middleware qui filtre l'entrée de l'utilisateur pour assurer son encodage correct.

Une idée sur la meilleure façon d'accomplir cela? Je suis 100% bien si les caractères invalides sont remplacés par un point d'interrogation. Ou une réponse est renvoyée indiquant que votre entrée a des caractères non valides. En ce moment, ils ont juste une erreur générique, et sur les requêtes ajax ils n'ont rien.

Merci.

+0

Est-ce une demande de navigateur? –

+0

"Mon application est configurée pour UTF-8, et je crois qu'ils envoient des caractères ASCII." S'ils envoient des "caractères ASCII", ils envoient également des "caractères UTF-8". Toute chaîne d'octets ASCII est un bytestring UTF-8 valide. – Thanatos

Répondre

0

Assurez-vous que tous vos points de vue ont une ligne comme celui-ci:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Tout navigateur envoie des données sous forme codée comme spécifié par le charset du HTML. Peu importe où les utilisateurs copient-collent les données, le navigateur se chargera de convertir les données en UTF8.

+0

Oui, j'ai cette méta-balise exacte. Ma conjecture est que Microsoft a décidé de ne pas l'honorer. Mais cette balise meta est sur chacune de mes pages. Et ce serait génial si c'était aussi simple. –

Questions connexes