Очистить / отклонить пользовательские вводы, содержащие небезопасный HTML в GraphQL (JS) - PullRequest
0 голосов
/ 24 октября 2019

Я искал по этому поводу все выше и ниже, но я не могу найти что-либо релевантное по этому поводу, но есть ли хорошее решение для дезинфекции символов HTML в пользовательском вводе в мутации graphql?

Я точно знаю, что ввод, такой как name: "<script>{alert('foo')}</script>", принимается graphql (apollo-server-express в моем случае) как есть, но это не нормально. Конечно, фреймворки, такие как React, не будут устанавливать эту строку как html, поэтому она там «безопасна», но что, если конечная точка graphql используется сайтом, который встраивает строки как html?

Так кто-нибудь знает хорошее решение для этого? Я посмотрел на пару пакетов, но они в основном довольно маленькие, с небольшой активностью на них.

Другим решением может быть санация на уровне базы данных, например, sanitize-html , но я хотел посмотреть, было ли правильное решение на уровне схемы

1 Ответ

0 голосов
/ 24 октября 2019

Закончилась только очистка на уровне модели, создан общий класс Model, который очищает все в аргументах:

export default class Model {
  constructor(parent, args, context, info) {
    this.db = db;
    this.parent = null;
    this.args = null;
    this.context = null;
    this.info = null;

    this.#init(parent, args, context, info);
  }

  #init = (parent, args, context, info) => {
    this.parent = parent;
    this.args = this.#sanitizeObject(args);
    this.context = context;
    this.info = info;
  };

  #sanitizeObject = (args) => {
    let sanitizedArgs = {};

    Object.entries(args).forEach(([key, value]) => {
      if (Array.isArray(value)) {
        sanitizedArgs[key] = this.#sanitizeArray(value);
      } else if (typeof value === 'object') {
        sanitizedArgs[key] = this.#sanitizeObject(args[key]);
      } else {
        sanitizedArgs[key] = this.#sanitizeInput(value);
      }
    });

    return sanitizedArgs;
  };

  #sanitizeArray = (args) => {
    return args.map((value) => {
      if (Array.isArray(value)) {
        return this.#sanitizeArray(value);
      } else if (typeof value === 'object') {
        return this.#sanitizeObject(value);
      } else {
        return this.#sanitizeInput(value);
      }
    });
  };

  #sanitizeInput = (input) => {
    return DOMPurify.sanitize(input);
  };
}
...