为什么撇号会使 Rails 5.1.5 请求解析崩溃?
Why is an apostrophe crashing the Rails 5.1.5 request parsing?
我们的生产 rails 服务器收到来自外部服务 (sparkpost) 的 post 请求(挂钩),格式如下
data: {
...
"subject": "Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!",
...
}
注意 apostrophe 字符'不是'。这会破坏 rails 请求堆栈:
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] no implicit conversion of nil into String excluded from capture: DSN not set
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] ActionDispatch::Http::Parameters::ParseError (no implicit conversion of nil into String):
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:115:in `rescue in parse_formatted_parameters'
为什么会这样?
apostrophe 似乎是一个有效的 unicode 字符。从 ' 更改为 ' 不再破坏 rails 堆栈。
请求的header是:
Accept application/json
Accept-Encoding gzip
Content-Length 3971
Content-Type application/json
Host 4ce93af4ed8b.ngrok.io
User-Agent SparkPost
X-Forwarded-For 52.37.3.48
X-Forwarded-Proto http
编辑:重现卷曲
curl --location --request GET 'http://localhost:3000/receive_sparkpost_hooks' \
--header 'Content-Type: application/json' \
--data-raw '[{"subject":"Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!"}]'
之前我们看到一些 unicode 字符(sparkpost 和 JSON 应该支持 UTF-8)我们正在崩溃 rails 堆栈并且我们已经过滤了他们出去使用
encode('ASCII', 'binary', invalid: :replace, undef: :replace, replace:
'')
人物看起来像
我可能认为我们正在以错误的方式处理这个问题,并且可以使用一些关于如何将数据提供给服务的建议,而服务又不会提供 rails API 格式错误的数据unicode 文本。
原因是字符串 (https://unicode-table.com/en/00A0/) 中存在一个不间断的 unicode 字符,但未通过问题文本中应用的过滤将其删除。
我们的生产 rails 服务器收到来自外部服务 (sparkpost) 的 post 请求(挂钩),格式如下
data: {
...
"subject": "Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!",
...
}
注意 apostrophe 字符'不是'。这会破坏 rails 请求堆栈:
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] no implicit conversion of nil into String excluded from capture: DSN not set
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] ActionDispatch::Http::Parameters::ParseError (no implicit conversion of nil into String):
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7]
[4ce93af4ed8b] [28a6b892-2c45-409b-90cf-3d1b4fa9b5f7] actionpack (5.1.7) lib/action_dispatch/http/parameters.rb:115:in `rescue in parse_formatted_parameters'
为什么会这样? apostrophe 似乎是一个有效的 unicode 字符。从 ' 更改为 ' 不再破坏 rails 堆栈。
请求的header是:
Accept application/json
Accept-Encoding gzip
Content-Length 3971
Content-Type application/json
Host 4ce93af4ed8b.ngrok.io
User-Agent SparkPost
X-Forwarded-For 52.37.3.48
X-Forwarded-Proto http
编辑:重现卷曲
curl --location --request GET 'http://localhost:3000/receive_sparkpost_hooks' \
--header 'Content-Type: application/json' \
--data-raw '[{"subject":"Your RedvanlyCategory: Men’s,<br>Redvanly Kent Pant, XL in Estate Blue arrived!"}]'
之前我们看到一些 unicode 字符(sparkpost 和 JSON 应该支持 UTF-8)我们正在崩溃 rails 堆栈并且我们已经过滤了他们出去使用
encode('ASCII', 'binary', invalid: :replace, undef: :replace, replace: '')
人物看起来像
我可能认为我们正在以错误的方式处理这个问题,并且可以使用一些关于如何将数据提供给服务的建议,而服务又不会提供 rails API 格式错误的数据unicode 文本。
原因是字符串 (https://unicode-table.com/en/00A0/) 中存在一个不间断的 unicode 字符,但未通过问题文本中应用的过滤将其删除。