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