2016-12-28 2 views
2

В угловой документации JS безопасности написано, используя $ часов, чтобы посмотреть значение пользователя контент небезопасна:

Есть несколько способов, что шаблоны и выражение можно управлять: ...

Передача выражение генерируемого пользователем содержимого в вызовах следующих методов на сферу: ...

$ смотреть (userContent, ...)

Что вы знаете о userContent? Если я смотрю ngModel значение поля ввода пользователя, это userContent? Является ли форма в скрипке небезопасной?

+0

Вот jsfiddle: https://jsfiddle.net/un55cprk/ – user1131522

ответ

0

С $ watch вы можете следить за любой ng-моделью. Например, у вас есть 1 график и выше, у вас есть раскрывающийся список из года в год, месяц до даты, квартал к настоящему времени. Теперь скажите, имя выпадающей модели dateChange Теперь вы можете следить за датой. Измените так, чтобы всякий раз, когда в dateChange появляется обновление, функция $ watch узнает, и вы можете затем обновить данные графика с уважением к выбору

+0

Я знаю, для чего используется '$ watch'! Я хочу знать, что является прецедентом плохого использования '$ watch', которые открывают ваше приложение для атак XSS. – Rachmaninoff

3

$watch экспрессия ограничена формой eval, где выражение анализируется с помощью выражения AngularJS синтаксического анализа и оценены в отношении текущей области.

Хотя анализатор выражений AngularJS имеет меры безопасности против оценки произвольного JS-кода с реальным eval, угрозы безопасности все еще могут существовать, а известные уязвимости могут быть потенциально использованы в старых версиях рамок.

Это означает, что выражение $on.constructor('alert(1)')() не может быть оценено и не создаст угрозу безопасности в любой современной версии AngularJS. Но учитывая, что услуга $window была раскрыта в масштабе (что является обычной практикой для контроллеров ES6), можно оценить выражение $window.alert(1).

Это не может представлять угрозу безопасности:

$scope.$watch('myValue', function() { 
    console.log($scope.myValue); 
}); 

Это может представлять угрозу безопасности:

$scope.$watch($scope.myValue, function() { 
    console.log($scope.myValue); 
}); 
+0

спасибо за ваш ответ, если я привяжу 'myVar' к текстовому полю ввода, и пользователь введет какой-нибудь javascript, который вызывает проблему? – Rachmaninoff

+0

Это безопасно, если вы делаете '$ watch ('myVar', ...)', а не '$ watch ($ scope.myVar, ...)' (что не имело бы желаемого эффекта). – estus

+0

у нас есть много '$ watch ($ scope.myVar, ...)' во всем нашем приложении, что нам теперь нужно? – Rachmaninoff

 Смежные вопросы

  • Нет связанных вопросов^_^