【问题标题】:%dd, %ff .... invalid byte sequence in UTF-8%dd, %ff .... UTF-8 中的无效字节序列
【发布时间】:2016-02-26 06:50:11
【问题描述】:

在我的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

当参数search=%d 它返回Bad Request 这没关系。但是当我添加另一个d、search=%dd 或search=a%dd 时,它会返回Action Controller: Exception caught - invalid byte sequence in UTF-8。

问题是,我怎样才能通过invalid byte sequence in UTF-8错误?

【问题讨论】:

  • en.wikipedia.org/wiki/Percent-encoding :: 也就是说,在URL中使用%ff需要转义。
  • 如何在 rails 中捕捉或拯救这些 Percent encoding?
  • 问题不是“如何在 rails 中转义”,而是“如何将其传递给 rails”。您可能想阅读并理解我提供的链接中写的内容。另外,请分享您尝试访问的确切 URL 和您的控制器代码,以处理这种情况。
  • 我更新了我上面的问题

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


【解决方案1】:

来自Wiki:

百分比编码,也称为 URL 编码,是一种在特定情况下将信息编码为统一资源标识符 (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 转义(后者显然是百分比编码的百分号本身。)

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

上面将发送%dd查询到rails。

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

[保留字符列表]

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

【讨论】:

    猜你喜欢
    • 2015-07-04
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2011-02-28
    • 2016-07-05
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多