是否可以确保请求来自特定域?

时间:2016-05-13 23:57:43

标签: ruby-on-rails http url controller request

我正在制作一个Rails投票站点,该站点应该具有非常准确的结果。用户使用POST链接投票。我努力确保用户只投票一次,并确切知道他们投票的内容。

但是我发现对结果感兴趣的第三方可以在他们自己的网站上建立POST链接,这指向我的投票路径。他们可能会以这种方式扭曲我的结果,例如通过添加误导性描述。

有没有办法确保请求只能来自我的域名?因此来自不同域的链接不会运行我控制器中的任何代码。

2 个答案:

答案 0 :(得分:3)

您需要检查各种各样的事情。首先是request.referer,它会告诉您将该链接引用到您网站的页面。如果它不是您的网站,则应拒绝该网站。

if URI(request.referer).host != my_host
    raise ArgumentError.new, "Invalid request from external domain"
end

但是,这仅保护您免受准确填充HTTP referer标头的Web客户端(浏览器)的影响。并且假设它完全来自网页。例如,有人可以通过电子邮件发送链接,电子邮件客户端根本不可能提供引用。

如果没有引用者,您也可以检查:

if request.referer.blank?
  raise ArgumentError.new, "Invalid request from unknown domain"
elsif URI(request.referer).host != my_host
  raise ArgumentError.new, "Invalid request from external domain"
end

通过简单的脚本来欺骗HTTP' referer'也很容易,所以即使你确实获得了一个有效的域名,你也需要进行其他检查以确保它&## 39;合法的POST。脚本小子一直在做这类事情,并且有十几行Ruby,python,perl,curl甚至VBA,你可以模拟真实用户的交互"。

您可能希望使用类似请求/响应密钥机制的内容。在此方法中,从您的网站提供的链接包含每次访问该网页的唯一密钥(您跟踪),并且只有拥有该密钥的人才能投票。

你如何识别选民也很重要。被动识别技术适用于非关键活动,例如提供广告或提出建议。然而,这种方法在一般人群中使用时经常会失去可测量百分比的时间。当你还考虑到人们实际上想要来破坏投票活动的事实时,很容易突然成为每个拥有良好概念的人的目标,并且打败了系统&#34 ;他们手上有一些空余时间。

尽早建立尽可能多的安全性,因为您需要的远远超出预期。在2012年总统选举期间,我被要求预先测试41个在线投票站点,并且能够在最初的24小时内打破其中的39个(其中6个在1小时内)。要过于谨慎。了解攻击者如何进入,而不仅仅是使用" normal"机制。不要发布有关您正在使用哪些技术的信息,即使在代码中也是如此。看到" Rails-isms" HTML或Javascript代码中的任何地方(甚至URL路径名)都会立即使攻击者在击败您的安全机制方面具有巨大优势。使用默默无闻对您有利,并尽可能在任何地方使用安全性。

注意:检查request.referer就像在银行保险库上放挂锁:它会阻止那些容易被劝阻的人,但是甚至不会使确定的个人放慢速度。

答案 1 :(得分:1)

您在此尝试阻止的内容基本上是cross-site request forgery。正如迈克尔正确指出的那样,检查Referer标题将不会给你带来任何好处。

一种流行的反措施是为每个用户提供一个单独的一次性令牌,该令牌随每个表单一起发送并存储在用户的会话中。如果在提交时提交的值与存储的值不匹配,则请求被拒绝。幸运的是,RoR似乎ship such a feature。看起来确实像一个单行。