【问题标题】:Data-Attributes and Script Injection数据属性和脚本注入
【发布时间】:2016-02-29 17:19:46
【问题描述】:

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

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

然后我可以通过以下方式访问coffeescript中的“id”:

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

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

【问题讨论】:

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

标签: html ruby-on-rails coffeescript xss javascript-injection


【解决方案1】:

是的,你是对的。人们可以修改它。但这并不是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

我不一定建议您像上面的示例中那样“手动”执行此操作。对于 Ruby on Rails,有两个著名的 gem 可以帮助解决这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2019-08-11
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多