Как стать автором
Обновить

Комментарии 25

Use habracut, Luke!
Исправьте на Мы не хотим, чтобы пользовательские скрипты не делали ничего плохого
(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»
Вы уж извините, но гитхабу я не верю, я и сам туда могу залить все что угодно.
Поверьте тогда оригиналу (pdf, 2.5Мб) параграф 12.14 (конец 96й страницы)
Да, так верю, не переключает область видимости =)
зато есть область видимости функции. в данном примере а — локальная для анонимной функции, и как я понял через этот баг можно заменить глобально определенную а.
Может просто задача стоит неверно? Зачем такое может понадобиться?
Я хочу для своей игрушки сделать апи искуственного интеллекта на 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.
НЛО прилетело и опубликовало эту надпись здесь
Это не в публичной части сайта к сожалению, используется в качестве макросов в системе коллективной разработке для автоматизации ряда задач. Вот пример псевдокода который добавляет в интерфейсе кнопки скачки для всех непустых папок в дереве:

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 итоговый не привожу, там жесть полная… красиво сделать не получилось.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации