Ruby on rails GET请求下表单数据签名的奇怪行为 案例研究

Ruby on rails GET请求下表单数据签名的奇怪行为 案例研究,ruby-on-rails,laravel,rsa,haml,signature,Ruby On Rails,Laravel,Rsa,Haml,Signature,我有两个应用程序(Rails=>发送方和Laravel=>接收方),其中我使用私钥和公钥对数据进行签名,以确保请求之间信息的准确性。使用GET参数将数据从一个应用发送到另一个应用: domain.com/callback?order_id=12&time=2015-10-01T22:38:20Z&signature=VX2WxlTaGK5N12GhZ5oqXU5h3wW/I70MYZhLbAYNQ79pFquuhdOerwBwqaq2BRuGyhKoY6VEHJkNnFjLAJk

我有两个应用程序(
Rails
=>发送方和
Laravel
=>接收方),其中我使用私钥和公钥对数据进行签名,以确保请求之间信息的准确性。使用GET参数将数据从一个应用发送到另一个应用:

domain.com/callback?order_id=12&time=2015-10-01T22:38:20Z&signature=VX2WxlTaGK5N12GhZ5oqXU5h3wW/I70MYZhLbAYNQ79pFquuhdOerwBwqaq2BRuGyhKoY6VEHJkNnFjLAJkQD6Q5z4Vmk...
问题 关于这些数据的签名,暂存服务器和本地服务器之间有一个奇怪的行为

在登台测试时,生成链接(GET)看起来像(来自chrome的源代码):

在本地服务器上,它的格式与html完全相同(当然,数据会发生变化)。顺便说一下,我用的是HAML

回调URL是从装饰程序生成的:

def url_to_store
  params    = url_params.to_a.map { |a| a.join('=') }.join('&')
  signature = Shield::Crypto.new(params).signature
  "#{object.referer}?#{params}&signature=#{signature}"
end

def url_params
  {
    order_id:       object.id,
    transaction_id: object.transaction_id,
    user_id:        object.user_id,
    status:         object.status,
    time:           Time.now.utc.iso8601,
    reference:      object.success? ? object.reference : ''
  }
end
当点击登台的链接时,我被重定向到另一个应用程序,该应用程序实际上验证了签名。万事俱备

但是,同样的情况不适用于区域设置服务器(我的机器)。单击链接时,签名包含空格(
%20
):

这当然会让另一个应用拒绝请求,因为签名无效这是我的问题。完全相同的应用程序。完全相同的代码基础和版本(又称提交sha)。不同的行为

我不知道如何复制它。我希望你们中的一些人已经经历过类似的情况,可以给我一个提示

想法


注意:我使用完全相同的回调url(本地PHP应用程序)来测试登台和本地服务器。我不认为问题来自PHP应用程序。可能与Rails调试相关的东西?

问题来自
Haml
,它是
丑陋的
模式。在
development
中,它默认设置为
false
,这会导致HTML代码变为pad,并以某种方式干扰签名

相关的github问题已在此处和此处找到

为了修复它,我创建了一个初始值设定项,将其作为默认值启用:

config/initializers/haml.rb

require 'haml/template'
Haml::Template.options[:ugly] = true
require 'haml/template'
Haml::Template.options[:ugly] = true