Pull to refresh

Comments 25

Исправьте на Мы не хотим, чтобы пользовательские скрипты не делали ничего плохого
(function () {
var a = 0;
try {
throw 1;
} catch (a) {
}
alert(a); // alerts 1 on IE 6 and 7 (IE 8 not tested)
})();
Я вот не совсем понял — это баг? По мне так вполне нормальный код: Человек обьявил переменную, а потом ей присвоил обьект исключения. Что удивительного?
Почему себя браузеры ведут по разному — другой вопрос.
Данный баг позволяет изменить неявным способом глобальную переменную в IE <= 8. В примере переменная «а» подменяется на 1, но по стандарту переменная «а» должна быть локальной для блока catch (a) {}
Начнем с того что в примере а не глобальная. А с другой стороны на сколько я знаю в JS нет разделения на блоки, как например, в C#. Можно ссылочку на инфу о стандарте этом? Интересно.
es5.github.com/#x12.14 чуть ниже «The production Catch» см. пункт 3 и ниже.
Let catchEnv be the result of calling NewDeclarativeEnvironment passing oldEnv as the argument
т.е. создаем свой «catchEnv» основываясь на «oldEnv»
Вы уж извините, но гитхабу я не верю, я и сам туда могу залить все что угодно.
Да, так верю, не переключает область видимости =)
зато есть область видимости функции. в данном примере а — локальная для анонимной функции, и как я понял через этот баг можно заменить глобально определенную а.
Может просто задача стоит неверно? Зачем такое может понадобиться?
Я хочу для своей игрушки сделать апи искуственного интеллекта на JavaScript. Пользователи его пишут, а я к ним просто обращаюсь с запросом.
Да, редкая задача. Обычно проще создать псевдоязык для работы с API приложения, а тут так не получится :(
Я использую другой подход, пользователь пишет свои плагины на псевдокоде с синтаксисом javascript и неким своим апи, а потом код транслируется в нормальный js и исполняется. Имхо, самое оптимальное.
Псевдокод проблематично отлаживать лучше уж использовать ADsafe
а зачем удалять «оператор [], Date и Math.random»?
Оператор [] плох тем, что в него можно передать переменную -> затруднен статический анализ.
[ ] subscript operator except when the subscript is a positive numeric literal or string literal.
— Lookup of dynamic properties could provide access to the restricted members. Use the ADSAFE.get and ADSAFE.set methods instead.
А свободный доступ к Date и Math.random опасен тем, что виджеты могут их переписать -> изменить логику других виджетов.
— Access to these sources of non-determinism is restricted in order to make it easier to determine how widgets behave.
Но ведь так само можно переписать String, Array, Number, etc.
Они глобальные переменные — блокируются в первую очередь. Хотя и Date и Math.random тоже глобалы — не могу знать почему Крокфорд вынес их отдельно.
Если включить в JsLint «Safe Subset» и «ADsafe» то любое обращение к ним блокируется.
понятно. а как создать массив, если нельзя использовать ни new Array ни []?
Квадратные скобки могут означать как литерал, порождающий массив так и оператор скобочного доступа к свойству объекта. Вот в случае скобочного доступа он запрещен, кроме массивов.

Данный код проходит валидацию без ошибок с флагами /*jslint adsafe: true, safe: true, fragment: true, maxerr: 50, indent: 4 */:
<div id="SUDOKU_">
<script>
    ADSAFE.id("SUDOKU_");
</script>
<script>
    ADSAFE.go('SUDOKU_', function (dom, lib) {
        "use strict";
        var a = [1, 2, 3, 4],
            b = 'join';

        a[1] = 100; // Ok
        a.map(function () {
            return 4;
        }); // Ok
        a[b](); // Error
    });
</script>
Понятно, спасибо) Имхо, вполне ужасно. Лучше песочницу через что-то типа WebWorkers или iFrame.
UFO just landed and posted this here
Это не в публичной части сайта к сожалению, используется в качестве макросов в системе коллективной разработке для автоматизации ряда задач. Вот пример псевдокода который добавляет в интерфейсе кнопки скачки для всех непустых папок в дереве:

var filesTree = data.getCollection("files", true);
var interface = pages.getPage("svn_tree").interface;
filesTree.asList().foreach(function (item, i) {
if (item.isFolder && item.childs.length) {
item.set("zipped", sys.command("return sys.zip(item.path, md5(item.path)).path"));
interface.append("action.download", "data.svn_tree.item.actions", "item.zipped");
}
});
sys.export(filesTree);
sys.export(interface);


Да, кстати, этот код ничего совсем не меняет. Код создает задачу, а уже задача исполняется централизованно специальным процессором, который проверяет права и прочее при исполнении действий, это второй уровень безопасности. Потому что программисту например может быть запрещено вносить изменения в данные, но можно работать с интерфейсом. Данный код плох тем, что тут разрешений почти нет, можно было сделать проще добавив поле в модель данных, тогда при каждом добавлении файла допустим к нему поле само бы приписывалось, а так код исполняется при каждом обновлении, ну может потом кто-то перепишет, это двумя строчками делается.

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

JavaScript итоговый не привожу, там жесть полная… красиво сделать не получилось.
UFO just landed and posted this here
Sign up to leave a comment.

Articles