您需要检查各种事项。第一个是request.referer,它将告诉您将链接指向您网站的页面。如果它不是您的网站,您应该拒绝它。
if URI(request.referer).host != my_host
raise ArgumentError.new, "Invalid request from external domain"
end
但是,这只会保护您免受准确填充 HTTP referer 标头的 Web 客户端(浏览器)的影响。这是假设它完全来自网页。例如,有人可以通过电子邮件发送链接,而电子邮件客户端根本不可能提供推荐人。
在没有referer的情况下,你也可以检查一下:
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' 也很容易,因此即使您确实获得了一个有效的域,您也需要其他检查以确保它是一个合法的 POST。脚本小子一直在做这种事情,并且使用十几行 Ruby、python、perl、curl 甚至 VBA,您可以模拟“真实用户”的交互。
您可能想要使用请求/响应密钥机制之类的东西。在这种方法中,从您的网站提供的链接包含一个唯一的密钥(您跟踪该密钥),用于每次访问该页面,并且只有拥有该密钥的人才能投票。
您如何识别选民也很重要。被动识别技术适用于非关键活动,例如提供广告或提出建议。然而,当在一般人群中使用时,这种方法通常会在相当大的时间内失败。当您还考虑到人们实际上想要 破坏投票活动这一事实时,很容易突然成为每个拥有“击败系统”的好概念和一些空闲时间的人的目标。
尽早建立尽可能多的安全性,因为您需要的远远超出您的预期。在 2012 年总统选举期间,我被要求预先测试 41 个在线投票网站,并在最初的 24 小时内破解了其中的 39 个(其中 6 个在 1 小时内)。过于谨慎。了解攻击者如何进入,而不仅仅是使用“正常”机制。不要发布有关您正在使用的技术的信息,即使在代码中也是如此。在 HTML 或 Javascript 代码(甚至是 URL 路径名)的任何地方看到“Rails-isms”将立即使攻击者在击败您的安全机制方面获得巨大优势。使用默默无闻的优势,并尽可能使用安全性。
注意:检查request.referer 就像在银行金库上放了一把挂锁:它会阻止那些容易被劝阻的人,但甚至不会放慢坚定的人的脚步。