带有GET请求的表单数据签名的奇怪行为

时间:2016-01-15 05:24:39

标签: ruby-on-rails laravel rsa haml signature

案例研究

我有2个应用( <table class='list'> <thead> <tr> <th class='idno'>ID No.</th> <th class='itemn'>Item</th> <th class='quant'>Quantity</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>Chocolate</td> <td>99</td> </tr> <tr> <td>2</td> <td>Bread</td> <td>99</td> </tr> </tbody> </table> <hr/> <table id="othertable"></table> =&gt;发件人和Rails =&gt;接收者),我使用私钥和公钥对数据进行签名,以确保两者之间的信息准确性请求。使用GET参数将数据从一个应用程序发送到另一个应用程序:

Laravel

问题

我在暂存服务器和本地服务器之间遇到奇怪的行为,这些行为与这些数据的签名有关。

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

Link generation

在本地服务器上,它是完全相同的格式化html(当然更改的数据除外)。顺便说一下,我正在使用HAML

回调网址是从装饰器生成的:

domain.com/callback?order_id=12&time=2015-10-01T22:38:20Z&signature=VX2WxlTaGK5N12GhZ5oqXU5h3wW/I70MYZhLbAYNQ79pFquuhdOerwBwqaq2BRuGyhKoY6VEHJkNnFjLAJkQD6Q5z4Vmk...

当点击登台时的链接时,我会被重定向到另一个实际验证签名的应用程序。每件事都有效。

但是,同样的事情不适用于语言环境服务器(我的机器)。单击链接时,签名包含空格(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

当然,由于签名无效,其他应用程序会拒绝该请求。 这是我的问题。完全相同的应用程序。完全相同的代码库和版本(a.k.a commit sha)。不同的行为。

我不知道如何重现它。我希望你们中的一些人已经经历过类似的情况并且可以给我一些暗示。

想法?

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

1 个答案:

答案 0 :(得分:2)

问题来自Haml及其ugly模式。在development中,默认设置为false,这会导致HTML代码被填充,并且不知何故弄乱了签名。

此处找到了相关的github问题https://github.com/haml/haml/issues/636https://github.com/haml/haml/issues/828

因此,为了解决这个问题,我创建了一个初始化程序,以默认启用它:

<强>配置/初始化/ haml.rb

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