Laravel与GraphQL有个约会(三)-安全性问题

信息泄露

我们在G raphQL中定义的Type,其实做的都是对数据库字段的一个映射。如果出现我们提供的API只需要返回Type类型的部分数据,但是黑客可能会找到规律获取数据库中一些敏感的信息,比如

image.png轻松获取你的token,或者像下面这样访问拿到你的隐私数据(电话号码,邮箱)

image.png

目前能想到的方式是对于敏感的信息部分加密:如果隐藏手机号中间四位,token:附带用户IP地址信息,并且加上时效性。

嵌套查询

影响GraphQL性能最关键的因素是N+1.如果黑客对api做更多的嵌套查询,会产生复杂的SQL来攻击服务器。如下:

其实在config/graphql.php有配置项,可以用来限制GraphQL Api的查询复杂度与查询深度。如下

Clipboard Image.png

querymaxcomplexity:和算法中的复杂度是类似的概念,在此处如果指定了querymaxcomplexity的值,当api请求的复杂度超过该阀值就会报错。但是与算法中的复杂度计算方法不同,该计算机制为:查询中的每个字段都累计一分,注意根节点也记一分,例如上面的graphql查询复杂度为17。然后将这些分数加起来与该阈值对比,如果累计值超过该阀值则不执行查询,而是报错。

 querymaxdepth:查询的深度,简单理解为返回的json的层级结构不超过多少层。

disable_introspection:内省就是根据我们定义的schema来自定补全,查询检验。默认的情况下是启用的,所以任何人都可以或者schema的完整描述。如果项目上线了可以考虑屏蔽这方面的功能。

Clipboard Image.png

之前提过 folklore/graphql是在webonyx/graphql-php基础上来使用,而我们这些安全配置参数最终都提现在webonyx/graphql-php中,这里不详细阐述底层的实现机制,大家可以找到Folklore\GraphQL\ServiceProvider类中的applySecurityRules()方法做为入口来阅读:

Clipboard Image.png

当然关于N+1问题在代码层面有很多解决方案:可以看看之前的一篇博客 https://www.haxibiao.com/blog/367,同时也有第三方的轮子,比如  https://github.com/vasily-kartashov/graphql-batch-processing通过batch来解决,但是是解决思路都是一样的。

参考文档:https://blog.doyensec.com/2018/05/17/graphql-security-overview.html

日记本

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

赞赏支持
被以下专题收入,发现更多相似内容