Как сделать внешний код «безопасным» для запуска? Просто забанить eval ()? - PullRequest
6 голосов
/ 11 апреля 2009

Мне бы хотелось, чтобы члены сообщества могли предоставлять свой собственный код javascript для использования другими, потому что воображение пользователей в целом намного больше, чем все, что я мог придумать.

Но это поднимает неотъемлемый вопрос безопасности, особенно когда цель состоит в том, чтобы разрешить запуск внешнего кода.

Итак, я могу просто запретить eval() от представлений и покончить с этим? Или есть другие способы оценить код или вызвать массовую панику в javascript?

Есть и другие вещи, которые нельзя запретить, но моя главная проблема заключается в том, что, если я не смогу предотвратить выполнение строк, можно обойти любые другие фильтры, которые я вставлю для определенных методов. Выполнимо, или я должен прибегнуть к требованию автора предоставить интерфейс веб-службы?

Ответы [ 6 ]

12 голосов
/ 11 февраля 2014

Поскольку теперь стала доступна HTML5 , вы можете использовать песочницу для ненадежного кода JavaScript.

Шпаргалка по безопасности OWASP HTML5 1008 * комментариев к рамкам с песочницей :

  • Используйте атрибут песочницы iframe для ненадежного контента.
  • Атрибут песочницы iframe включает ограничения на содержимое в пределах iframe. Следующие ограничения активны, когда установлен атрибут песочницы:

    1. Вся разметка считается уникальной.

    2. Все формы и скрипты отключены.

    3. Все ссылки не могут быть нацелены на другие контексты просмотра.
    4. Все функции, которые запускаются автоматически, блокируются.
    5. Все плагины отключены.

      Можно получить детальный контроль над возможностями iframe, используя значение атрибута sandbox.

  • В старых версиях пользовательских агентов, где эта функция не поддерживается, этот атрибут будет игнорироваться. Используйте эту функцию в качестве дополнительного уровня защиты или проверьте, поддерживает ли браузер фреймы с песочницей, и отображает ненадежный контент, только если поддерживается.

  • Помимо этого атрибута, для предотвращения атак Clickjacking и нежелательных кадров рекомендуется использовать заголовок X-Frame-Options, который поддерживает значения deny и same-origin. Другие решения, такие как установка рамки if(window!== window.top) { window.top.location = location; }, не рекомендуются.

Вы можете разрешить выполнение сценариев при сохранении других ограничений. Однако вы должны убедиться, что сценарии запускаются из домена, отличного от вашего основного содержимого, чтобы предотвратить атаки XSS со стороны злоумышленника, перенаправляющего пользователя на загрузку страницы напрямую (т.е. не через IFrame). *

Это ограничит использование сценариями eval для атаки на ваш основной домен, но, возможно, это также помешает сценариям быть достаточно мощными для ваших нужд. Любое взаимодействие с вашим основным доменом должно быть через Window.postMessage. Если это слишком ограничительно, то ответ @ bobince по-прежнему содержит лучшие предложения для обходных путей.

Пожалуйста, смотрите мой другой ответ , чтобы узнать, как можно безопасно реализовать песочницу.

8 голосов
/ 11 апреля 2009

Или есть другие способы оценки кода

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

  • новая функция ('code') ()
  • document.write ( '% 3Cscript> код% 3C / скрипт>')
  • document.createElement ( 'сценарий'). AppendChild (document.createTextNode ( 'код'))
  • window.setTimeout ('code', 0);
  • window.open (...). Eval ( 'код')
  • location.href = 'JavaScript: код'
  • в IE, style / node.setExpression ('someproperty', 'code')
  • в некоторых браузерах, node.onsomeevent = 'code';
  • в старых браузерах, Object.prototype.eval ('code')

или вызвать массовую панику в javascript?

Хорошо, createElement ('iframe'). Src = 'http: //evil.iframeexploitz.ru/aff=2345' - это одна из худших атак, которые вы можете ожидать ... но на самом деле, когда скрипт имеет контроль, он может делать все, что может пользователь на вашем сайте. Это может заставить их публиковать «Я большой старый педофил!» Тысячу раз на ваших форумах, а затем удалять свою учетную запись. Например.

Должен ли я прибегнуть к требованию автора предоставить интерфейс веб-службы?

Да или:

  • ничего не делать и разрешить пользователям, желающим эту функцию, загрузить GreaseMonkey
  • Проверяйте каждый сценарий самостоятельно
  • используйте свой собственный (потенциально JavaScript-подобный) мини-язык, над которым вы фактически владеете

пример последнего, который может вас заинтересовать: Google Caja . Я не совсем уверен, что доверю этому; это тяжелая работа, и у них наверняка были некоторые дыры в безопасности, но это лучшее из того, что есть, если вы действительно должны использовать этот подход.

5 голосов
/ 11 апреля 2009

На самом деле нет никакого способа, которым разрешение произвольного выполнения Javascript может быть безопасным. На самом деле, любая фильтрация, которую вы предоставляете для предотвращения злонамеренного кода, будет лишать законного кода доступ к аналогичным функциям или данным. Я не думаю, что то, что вы хотите сделать, выполнимо таким образом.

1 голос
/ 11 апреля 2009

Нет, вы практически не можете помешать предоставленному пользователем коду Javascript запускать что угодно - даже запрет eval() не может помешать ему запускать произвольные программы (это может быть сам интерпретатор Javascript, в этом случае он просто реализует) eval() функция и многие другие способы - например, она может добавить HTML с некоторыми обработчиками событий в строковой форме, а затем выполнить их, может document.write() новый сценарий и т. д.).

Если вашему сайту не нужен этот пользовательский JS для запуска на компьютерах других пользователей, я бы просто добавил большое жирное предупреждение, добавил бы некоторый человеческий контроль (который мог бы пометить мошеннический код как таковой), возможно, некоторое антивирусное программное обеспечение на сервере (не знаю много об этом).

0 голосов
/ 18 января 2015

Вам необходимо выполнить ненадежный код в изолированной среде. Это означает создание iframe с атрибутом sandbox (см. в этой статье ) и дополнительное создание веб-работника внутри этого фрейма (чтобы код выполнялся в отдельном потоке и не зависал в интерфейсе пользователя). в случае, если пользователь представил что-то странное).

Если вам нужно каким-либо образом взаимодействовать с песочницей кода описанным способом, можно использовать механизм обмена сообщениями . Это немного сложно, но есть несколько библиотек, упрощающих задачу, в том числе созданная мной: https://github.com/asvd/jailed

0 голосов
/ 11 апреля 2009

Фильтрация eval, вероятно, не работает. Я полагаю, что вы можете взломать это так: window['ev' + 'al']('alert("hello world");');. Конечно, вы можете заменить функцию eval ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...