2016-02-24 31 views
0

对于我的rails应用程序,我使用的数据属性相当广泛,因为它很容易,并且网站从未被期望完成或发布,只是我个人乐趣所做的一些事情。原始HTML的一个简单的例子是数据属性和脚本注入

<span class="player-name" data-id="4" >Example Player</span> 

然后我可以访问CoffeeScript中的“身份证”以下列方式:

id = $('.player-name').data('id') 

我在想,如果这个利用率数据的属性可能潜在通过编辑开发人员控制台中的数据属性的人员使网站易受攻击。此外,如果有更好的方法来访问jQuery中的数据,我将不胜感激,如果有人能指出我在正确的方向。谢谢!

+1

来自客户端的任何数据都应该在服务器端进行验证。考虑到该警告,就安全性而言,通过数据属性提供的数据与传递给服务器的用户提供的值没有什么不同。 – MarsAtomic

回答

0

是的,你说得对。人们可以修改这个。但是这对于data-属性并不是唯一的;人们可以修改什么并发送任何请求与任何参数到您的服务器。

您应该总是验证来自客户端的数据。永远,永远,永远。我经常看到应用程序中有一个网址,例如http://example.com/orders/42,其中42修改为666导致我查看陌生人的订单。哎呀!通过AJAX请求,假冒数据需要更多的努力,但不是很多。人们可以(也将会!)修改客户端上的任何内容:URL,HTML,JavaScript,CSS等,因此总是错误依赖于安全性。

实际上,这意味着从Rails应用程序中的数据库中获取对象后,您应该总是检查当前登录的用户是否被允许查看此对象。例如,在一个控制器,你可以做线沿线的东西:

def show 
    # Fetch it from the DB 
    some_object = SomeObject.find params[:id] 

    # Make sure the current user is authorized! 
    raise if some_object.player_id != logged_in_player.id 

    # ..your controller code.. 
end 

我并不建议你这样做“手动”就像上面的例子。对于Ruby on Rails,有两个知名宝石可以帮助解决这个问题:

  • Pundit;这是我会推荐的。它简单,优雅,灵活。
  • CanCan;也用了很多。这比专家更复杂,我发现它实际上并没有提供更多的功能。虽然你的里程可能会有所不同。
+0

听起来不错,谢谢你的洞察力! – John