Как я могу сделать внешний код 'безопасным' работать? Просто запретите оценку ()?

Вы можете использовать новые ключевые слова Javascript async и await

Сначала сделайте getSomeData асинхронным, что также требует от него возврата обещания:

  private async getSomeData(): Promise<DataObjectArray[]> {
    return this.myService.something().map((response: Response) => {
      return response.children;
    });
  }

, затем ожидайте функция в compileData:

let someData = await this.getSomeData();

Однако это означает, что compileData, поскольку он возвращает результат, должен быть также асинхронным. Это означает, что вам нужно добавить ключевое слово async и изменить тип на Promise<DifferentDataArray[]>.

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

Ваша полная функция compileData:

 public async compileData(): Promise<DifferentDataArray[]> {

   // get some stuff from a config, then make service call
    let someData = await this.getSomeData();

    /* If I have a promise returned, someData errors saying not an array type */
    for (let oneData of someData){
      /* loop through config data + service data making a return object array */
   }
    return this.dataCollection;
  }


  public compileData(): DifferentDataArray[] {

   // get some stuff from a config, then make service call
    let someData = this.getSomeData();

    /* If I have a promise returned, someData errors saying not an array type */
    for (let oneData of someData){
      /* loop through config data + service data making a return object array */
   }
    return this.dataCollection;
  }
6
задан Phil H 11 April 2009 в 10:42
поделиться

4 ответа

Или Существуют и другие способы оценки кода

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

  • новая функция ('code') ()
  • document.write ('% 3Cscript> code% 3C / script>')
  • document.createElement (' script '). appendChild (document.createTextNode (' code '))
  • window.setTimeout (' code ', 0);
  • window.open (...). eval (' code ')
  • location.href = 'javascript: code'
  • в 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 . Я не совсем уверен, что доверю этому; это тяжелая работа, и у них наверняка были некоторые дыры в безопасности, но это лучшее из того, что есть, если вы действительно должны использовать этот подход.

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

Да или:

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

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

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

Да или:

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

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

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

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

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

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

8
ответ дан 8 December 2019 в 03:54
поделиться

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

5
ответ дан 8 December 2019 в 03:54
поделиться

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

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

1
ответ дан 8 December 2019 в 03:54
поделиться

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

0
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: