Как бороться с неверной последовательностью байтов для пользовательского ввода через промежуточное ПО Rack? - PullRequest
2 голосов
/ 27 октября 2011

Итак, некоторые пользователи нашей системы копируют и вставляют текст в мое приложение. В своих журналах я иногда замечаю это:

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'

А вот детали запроса. Обратите внимание на недопустимые символы.

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

Проблема в том, что кодировки символов отключены. Мое приложение настроено для UTF-8, и я считаю, что они отправляют символы ASCII. Мне нужен способ отфильтровать это, чтобы я мог избежать вышеуказанной ошибки.

Обратите внимание, что ошибка возникает еще до того, как она попадает в мое приложение. Поэтому я предполагаю, что лучшим решением является промежуточное программное обеспечение Rack, которое фильтрует пользовательский ввод для обеспечения правильного кодирования.

Есть идеи, как лучше всего это сделать? Я на 100% в порядке, если недопустимые символы заменяются знаком вопроса. Или ответ отправляется обратно, говоря, что на вашем входе есть недопустимые символы. Прямо сейчас они просто получают общую ошибку, и при запросах ajax они ничего не получают.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2011

Убедитесь, что все ваши представления имеют такую ​​строку:

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

Любой браузер будет отправлять данные формы, закодированные в соответствии с кодировкой HTML.Поэтому не имеет значения, откуда пользователи копируют данные, браузер позаботится о преобразовании данных в UTF8 после публикации.

0 голосов
/ 01 ноября 2011
...