如何通过Rack中间件处理用户输入的无效字节序列?

时间:2011-10-27 17:24:06

标签: ruby utf-8 character-encoding user-input 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'

以下是请求详情。注意无效字符。

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

问题是角色编码是关闭的。我的应用程序是为UTF-8设置的,我相信他们正在发送ASCII字符。我需要一种方法来过滤这个,以便我可以避免上述错误。

请注意,错误是在它到达我的应用程序之前引发的。因此,我假设最好的解决方案是Rack中间件,用于过滤用户输入以确保其正确编码。

有关实现这一目标的最佳方法吗?如果无效字符被问号替换,我会100%罚款。或者发回一个回复,说你的输入有无效字符。现在他们只是得到了一般错误,而在ajax请求中他们什么也得不到。

感谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

确保所有观看的内容都是这样的:

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

任何浏览器都会发送由HTML的字符集指定的表单数据。因此,无论用户从哪里复制粘贴数据,浏览器都会负责将数据转换为UTF8。