Уязвимость AngularJS 1.5 для IBM Mobilefirst
Кажется, у меня проблемы с объединением приложения MFP hybrid (no cordova) и angular 1.5. То же самое приложение с angular 1.4.9 отлично работает, но если я переключусь на угловое значение 1.5, я получаю эту ошибку:
Error: [$injector:modulerr] Failed to instantiate module ng due to:
TypeError: Cannot set property 'aHrefSanitizationWhitelist' of null
at $$SanitizeUriProvider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:17272:35)
at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)
at Object.instantiate (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4621:14)
at provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4435:36)
at http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:367:32
at forEach (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:337:20)
at Object.provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4425:9)
at ngModule (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:2476:16)
at Object.invoke (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4606:19)
at runInvokeQueue (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4499:35)
http://errors.angularjs.org/1.5.0/$injector/modulerr?p0=ng&p1=TypeError%3A%…%2FHelloWorld%2Fandroid%2F1.0%2Fdefault%2Fvendor%2Fangular5.js%3A4499%3A35)
кто-нибудь подскажет, что это может быть?
Ответы
Ответ 1
У меня была такая же проблема, когда я обновился до angular 1.5.0.
Проблема оказалась с пользовательской реализацией Function.prototype.bind
, которая была у нас в нашем коде, похоже, что это мешает той, которая определена в angular.
Возьмите вторую строку в своем стеке ошибок
at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)
Я думаю, что worklight.js может иметь реализацию prototype.bind
, которая несовместима с той, что находится в angular (см. https://code.angularjs.org/1.5.0/docs/api/ng/function/angular.bind)
Ответ 2
Также видим это на плагине MFP 8.0 cordova.
Ответ 3
Как уже упоминалось, это может быть вызвано полифониями для Function.prototype.bind. В частности, это, по-видимому, вызвано тем, что неправильно обрабатывает вызов функции как конструктора с новым. Простые реализации всегда могут возвращать связанный объект независимо от вызова, тогда как ожидание состоит в том, что новый оператор превалирует над привязкой, а вновь созданный объект возвращается вместо него.
например.
// create an object to bind to
var alt = {
message: 'I am the alternate'
};
// our function
function myFunc() {
console.log( this.message );
};
// bind our alternate object to this for myFunc
myFunc.bind( alt );
Стандартный вызов запускается как ожидаемый
myFunc(); // output 'I am the alternate'
Вызов через новый не как Ожидаемый (это тот, который разбивает angular 1.5)
new myFunc(); // also outputs 'I am the alternate'</jscodeblock>
Ожидаемое поведение заключается в том, что новый вызов будет возвращать новый объект, а не связанный.
Если вам нужен polyfill для Function.prototype.bind, убедитесь, что он правильно обрабатывает этот сценарий, например, тот, который найден в MDN.