Skip to content

Bảo mật GraphQL ​

Module GraphQL tích hợp sẵn các luật bảo vệ truy vấn. Mọi luật chạy trong bước kiểm tra truy vấn, trước khi resolver nào thực thi — truy vấn độc hại bị trả về 400 và không bao giờ chạm tới tầng dữ liệu.

Cấu hình ​

ts
import { GraphQLModule } from '@galaxy-stack/orbit-graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: true,
      introspection: false,        // tắt __schema/__type trên production
      security: {
        maxDepth: 10,              // độ sâu selection tối đa
        maxComplexity: 1000,       // độ phức tạp tích lũy tối đa
        maxAliases: 30,            // số alias tối đa mỗi truy vấn
        fieldCosts: { posts: 5 },  // chi phí theo field
        listFactors: { posts: 10 } // hệ số nhân của list
      },
    }),
  ],
})
export class AppModule {}

Các luật bảo vệ ​

LuậtMặc địnhChống lại
Giới hạn độ sâu10Truy vấn lồng sâu làm cạn resolver stack
Giới hạn độ phức tạp1000Truy vấn đắt tiền; field dạng list nhân chi phí theo hệ số fan-out
Giới hạn alias30Alias bombing (alias cùng field hàng trăm lần)
Chặn introspectiontắt trừ khi introspection: falseRò rỉ schema trên production

Giới hạn độ sâu ​

Đếm mỗi tầng field được chọn (bao gồm fragment). __typename không tính. Truy vấn vượt maxDepth sẽ bị từ chối:

graphql
# Với maxDepth: 3, truy vấn này bị chặn (5 tầng)
{ post { author { posts { author { posts { title } } } } } }

Phân tích độ phức tạp ​

Mỗi field mặc định tốn 1 điểm. Selection bên trong field list được nhân với hệ số list (mặc định 10) để mô hình hoá N+1. Gán chi phí cao cho các field gốc đắt tiền:

ts
security: {
  maxComplexity: 500,
  fieldCosts: { search: 20 },
  listFactors: { posts: 15 },
}

Tắt introspection trên production ​

ts
GraphQLModule.forRoot({
  introspection: process.env.NODE_ENV !== 'production',
});

Với introspection: false, mọi truy vấn chạm vào __schema hoặc __type trả về:

json
{ "errors": [{ "message": "GraphQL introspection is disabled." }] }

Playground chỉ được phục vụ trên GET /graphql khi playground: true — hãy tắt cả hai trên production.

Released under the MIT License.