%dd,%ff .... UTF-8中的无效字节序列

时间:2016-02-26 06:50:12

标签: ruby-on-rails ruby regex ruby-on-rails-4 utf-8

在我的rails应用中,当我在url参数中添加%dd%ff时,为什么会返回invalid byte sequence in UTF-8

我有一个正则表达式^[a-zA-Z0-9_]+$来捕获字符串是否包含字母+数字+下划线。然后,当我在我的url参数中添加%dd%ff时,会返回invalid byte sequence in UTF-8错误。

%dd%ff的含义是什么?

更新:

我的控制器:

def search
  regex = '^[a-zA-Z0-9_]+$'
  @search = params[:search]
  unless @search.match(alpha_num_under_regex).nil?
   @users = User.find_by_name(@search)
   render 'api/v1/users/show', status: 200, formats: :json
else
  @users = []
  render 'api/v1/users/show', status: 422, formats: :json
end

我的网址:

localhost:3000/api/v1/users/show?search=%dd

当params search=%d返回Bad Request时就可以了。但是,当我添加了另一个dsearch=%ddsearch=a%dd时,它会返回Action Controller: Exception caught - invalid byte sequence in UTF-8

问题是,如何通过invalid byte sequence in UTF-8错误?

1 个答案:

答案 0 :(得分:1)

来自Wiki

  

百分比编码,也称为网址编码,是在某些情况下对统一资源标识符(URI)中的信息进行编码的机制。虽然它被称为URL编码,但实际上它更普遍地用在主统一资源标识符(URI)集中,其包括统一资源定位符(URL)和统一资源名称(URN)。因此,它也用于准备application/x-www-form-urlencoded媒体类型的数据,这通常用于在HTTP请求中提交HTML表单数据。

查询search=%dd根据以上处理/解释为search=<BYTE_WITH_ORD_VALUE_0xDD>。 Ruby期望此字符串为UTF-8,但0xDD不是有效的UTF-8符号。

为了避免这个问题并传递预期的内容,应该通过替换%%25来明确地对搜索查询进行URL转义(后者显然是百分比编码的百分号本身。)< / p>

localhost:3000/api/v1/users/show?search=%25dd

以上内容会向导轨发送%dd个查询。

NB 为了安全起见,应根据上面链接的文章中指定的通用规则构建网址查询:

  

[保留字符列表]

     

URI中的其他字符必须为百分比编码。