2016-02-24 3 views
0

Для моего приложения rails я использую атрибуты данных довольно широко, так как это было легко, и сайт никогда не ожидал, что он будет закончен или опубликован, просто что-то, что я сделал для личной забавы. Краткий пример исходного HTML будетData-Attributes и Script Injection

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

Я тогда мог получить доступ к «идентификатор» в CoffeeScript следующим образом:

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

мне было интересно, если это использование данных-атрибутов может потенциально сделать сайт уязвимым для атак через людей, редактирующих атрибут данных в своей консоли разработчика. Также, если есть лучший подход к доступу к данным в jQuery, я был бы очень признателен, если бы кто-то мог указать мне в правильном направлении. Благодаря!

+1

Любые данные, поступающие со стороны клиента, должны быть подтверждены на стороне сервера. Учитывая это предостережение, данные, предоставляемые с помощью атрибутов данных, не отличаются от предоставленного пользователем значения, которое передается на сервер в отношении безопасности. – MarsAtomic

ответ

0

Да, вы правы. Люди могут это изменить. Но это вряд ли уникально для атрибутов data-; люди могут изменить что угодно и отправить любой запрос с любой параметров на ваш сервер.

Вы должны всегда проверять данные, поступающие от клиентов. Всегда, всегда, всегда. Слишком часто я видел приложения, где у меня есть 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 есть два известных камня:

  • Pundit; это то, что я бы рекомендовал. Это просто, элегантно и гибко.
  • CanCan; также использовал много. Это сложнее, чем Pundit, и я обнаружил, что на самом деле он не предоставляет больше возможностей. Однако ваш пробег может отличаться.
+0

Звучит неплохо, спасибо за понимание! – John