valu / wp-graphql-lock
为 wp-graphql 查询锁定
Requires (Dev)
- lucatume/wp-browser: ^2.2
- valu/wp-testing-tools: ^0.3.5
This package is auto-updated.
Last update: 2024-09-12 18:13:03 UTC
README
此插件通过实现持久化 GraphQL 查询,为 WPGraphQL 提供查询锁定功能。
持久化 GraphQL 查询允许 GraphQL 客户端发送查询的哈希值而不是完整查询;如果服务器之前已见过该查询,则可以满足请求。
一旦服务器知道所有可能的查询,该插件就可以锁定它,禁止任何可能有害的不希望查询。这可以大大提高服务器安全性,甚至在某些情况下可以保护未修补的漏洞。
或者,您可以使用 GraphQL Code Generator 插件 从您的客户端源代码中预生成查询 ID,并使用 graphql_lock_load_query
过滤器加载这些 ID。
除了启用查询锁定,这还节省了网络开销,并使得使用 GET
请求而不是 POST
请求成为可能。GET
请求的主要好处是它们可以被轻松地缓存在边缘(例如,使用 Varnish、nginx 等)。
此插件需要 WPGraphQL 0.2.0 或更高版本。
兼容性
Apollo Client 提供了持久化查询的简单实现
https://github.com/apollographql/apollo-link-persisted-queries#automatic-persisted-queries
此插件旨在与该实现兼容,但将与任何发送 queryId
与 query
一起的客户端一起工作。请确保您的客户端也使用乐观请求发送 operationName
。
实现
当客户端提供一个查询哈希或 ID 时,该查询将被持久化在自定义帖子类型中。默认情况下,此帖子类型仅对管理员在仪表板中可见。
查询 ID 不区分大小写(即,MyQuery
和 myquery
是等效的)。
安装
如果您使用 composer,您可以从 Packagist 安装它
composer require valu/wp-graphql-lock
否则,您可以从 Github 克隆它到您的插件,使用稳定分支
cd wp-content/plugins
git clone --branch stable https://github.com/valu-digital/wp-graphql-lock.git
过滤器
graphql_lock_load_query
- 从自定义位置加载查询
- 查询 ID 作为第二个参数传递
示例
add_filter( 'graphql_lock_load_query', function( string $query, string $query_id ) { $queries = json_decode( file_get_contents( __DIR__ . '/.persisted-query-ids/server.json' ), true ); return $queries[ $query_id ] ?? null; }, 10, 2 );
注意:您应优先使用隐藏目录/文件以避免通过您的 web 服务器暴露锁定文件。
graphql_lock_post_type
- 默认值:
'graphql_query'
- 用于持久化查询的自定义帖子类型。如果为空,则不会持久化查询。
graphql_lock_show_in_graphql
- 默认值:
false
- 是否将通过 GraphQL 暴露自定义帖子类型。启用它允许了解哪些查询被持久化。
query PersistedQueryQuery { persistedQueries { nodes { id title content(format: RAW) } } }
如果您想进一步自定义自定义帖子类型,请过滤 register_post_type_args
。
锁定模式
当它处于活动状态时,无法保存新查询,只能使用已保存的查询。这可以大大提高安全性,因为攻击者不能向端点发送任意查询。
可以通过将 graphql_lock_locked
选项设置为 true 来激活锁定模式
update_option( 'graphql_lock_locked', true );
add_filter( 'option_graphql_lock_locked', function() { return 'production' === WP_ENV; }, 10 , 1 );
设置
有一个设置屏幕用于管理选项
致谢
此插件基于 Quartz 持久化查询插件。