gpt4 book ai didi

graphql - 在 graphql(JS) 中清理/拒绝包含不安全 html 的用户输入

转载 作者:行者123 更新时间:2023-12-05 06:23:18 25 4
gpt4 key购买 nike

我一直在上下搜索这个,但我找不到任何相关的东西,但是是否有一个很好的解决方案来清理 graphql 突变中用户输入中的 html 字符?

我知道一个事实,像 name: "<script>{alert('foo')}</script>" 这样的输入被 graphql(在我的例子中是 apollo-server-express)接受,但那不行。当然,像 React 这样的框架不会将该字符串设置为 html,因此它在那里是“安全的”,但是如果 graphql 端点被一个将字符串嵌入为 html 的站点使用怎么办?

所以有人知道解决这个问题的好方法吗?我看过几个包裹,但它们大多很小,上面几乎没有事件。

另一种解决方案是在数据库级别进行清理,例如 sanitize-html , 但我想看看在模式级别是否有合适的解决方案

最佳答案

最后只是在模型级别进行清理,创建了一个通用模型类,它清理了 args 中的所有内容:

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);
};
}

关于graphql - 在 graphql(JS) 中清理/拒绝包含不安全 html 的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58532756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com