在我的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
时就可以了。但是,当我添加了另一个d
,search=%dd
或search=a%dd
时,它会返回Action Controller: Exception caught
- invalid byte sequence in UTF-8
。
问题是,如何通过invalid byte sequence in UTF-8
错误?
答案 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中的其他字符必须为百分比编码。