数据属性和脚本注入

Data-Attributes and Script Injection

对于我的 rails 应用程序,我相当广泛地使用了数据属性,因为它很简单,而且网站从未被期望完成或发布,只是我为了个人乐趣而做的事情。原始 HTML 的一个简短示例是

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

然后我可以通过以下方式在 coffeescript 中访问 'id':

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

我想知道这种数据属性的使用是否可能使网站容易受到人们在其开发人员控制台中编辑数据属性的攻击。此外,如果有更好的方法来访问 jQuery 中的数据,如果有人能指出正确的方向,我将不胜感激。谢谢!

是的,你是对的。人们可以修改它。但这并不是 data- 属性所独有的;人们可以修改 anything 并向您的服务器发送带有 any 参数的 any 请求。

您应该始终验证来自客户端的数据。一直,一直,一直。我经常看到有 url 的应用程序,例如 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

我不一定建议您像上例那样"manually"。对于 Rails 上的 Ruby,有两个著名的 gem 可以帮助解决这个问题:

  • Pundit;这就是我要推荐的。它简单、优雅且灵活。
  • CanCan;也用了很多。它比 Pundit 更复杂,而且我发现它实际上并没有提供更多的功能。不过,您的里程可能会有所不同。