Tiếng Việt

Codex Security TypeScript SDK

Chạy các lượt quét Codex Security từ TypeScript, chọn mục tiêu và nhà cung cấp, kiểm tra kết quả và quản lý vòng đời quét.

Sử dụng Codex Security TypeScript SDK để chạy các lượt quét bảo mật trên kho lưu trữ và các thay đổi mã từ ứng dụng hoặc công cụ dành cho nhà phát triển của bạn. SDK trả về các phát hiện đã định kiểu, thông tin chi tiết về phạm vi bao phủ và đường dẫn đến artifact quét. Đối với các lượt quét dài hơn, SDK hỗ trợ kiểm tra preflight, giới hạn chi phí, callback tiến trình và hủy bỏ.

SDK sử dụng các mô-đun ECMAScript (ESM) và chạy phía máy chủ với Node.js 22 trở lên. Việc quét cũng yêu cầu Python 3.10 trở lên.

Thiết lập SDK

Cài đặt SDK:

npm install @openai/codex-security

Trước khi bắt đầu quét, hãy đặt OPENAI_API_KEY hoặc CODEX_API_KEY, sử dụng một phiên đăng nhập Codex hiện có được lưu trong tệp hoặc cấu hình Amazon Bedrock bằng thông tin xác thực AWS và các giá trị ghi đè model_providermodel rõ ràng.

Để có kết quả tốt nhất, hãy sử dụng tài khoản đã được xác minh cho Trusted Access for Cyber. Việc đăng nhập hoặc cung cấp API key không cấp Trusted Access.

Chạy một lượt quét

Tạo một client CodexSecurity, chạy lượt quét kho lưu trữ tiêu chuẩn và đóng client khi công việc hoàn tất. Truyền outputDir để chọn một thư mục kết quả riêng tư bên ngoài Git worktree bao quanh.

Nếu bạn bỏ qua outputDir, Codex Security sẽ lưu kết quả trong thư mục trạng thái lâu dài của riêng mình. Kết quả có thể bao gồm đoạn trích mã nguồn và chi tiết về lỗ hổng, vì vậy hãy chọn quyền và chính sách lưu giữ phù hợp.



const security = new CodexSecurity();

try {
  const result = await security.run("/path/to/repository", {
    outputDir: "/path/outside/repository/results",
  });

  console.log(result.reportPath);
  console.log(result.coverage.completeness);
  console.log(result.findings.findings.length);
} finally {
  await security.close();
}

run bắt đầu quét, chờ hoàn tất, xác thực các artifact đã niêm phong và trả về một ScanResult. close giải phóng môi trường chạy cô lập và hỗ trợ các lần gọi lặp lại.

Kiểm tra đầu vào bằng preflight

Sử dụng preflight để kiểm tra kho lưu trữ, mục tiêu, chế độ, vị trí đầu ra và cấu hình Codex trước khi bắt đầu quét:

const plan = await security.preflight("/path/to/repository", {
  target: ["services/billing", "packages/auth"],
  outputDir: "/path/outside/repository/results",
});

console.log(plan.repository);
console.log(plan.target.kind);
console.log(plan.mode);
console.log(plan.outputDir);

Preflight không thay đổi môi trường chạy Codex và thông tin xác thực. Nó cũng để việc phát hiện plugin và Python cho chính quá trình quét thực hiện. Điều này khiến preflight hữu ích để kiểm tra đầu vào của người dùng trước một thao tác kéo dài hoặc cần thông tin xác thực.

Để xem trước việc lưu trữ đối với một thư mục kết quả hiện có, hãy đặt archiveExisting: true:

const plan = await security.preflight("/path/to/repository", {
  outputDir: "/path/outside/repository/results",
  archiveExisting: true,
});

console.log(plan.archiveDir);

archiveDir được trả về cho biết trước cách đặt tên bản lưu trữ. Đường dẫn cuối cùng có thể khác vì run tạo đích duy nhất của riêng nó. Ghi lại đường dẫn bản lưu trữ thực tế bằng onOutputArchived:

await security.run("/path/to/repository", {
  outputDir: "/path/outside/repository/results",
  archiveExisting: true,
  onOutputArchived(archiveDir) {
    console.log("Archived results:", archiveDir);
  },
});

Quá trình quét lưu trữ các kết quả trước đó và bắt đầu với một thư mục đầu ra trống.

Chọn mục tiêu quét

SDK hỗ trợ mục tiêu là kho lưu trữ, đường dẫn, diff đã commit và cây làm việc. Mục tiêu mặc định là toàn bộ kho lưu trữ.

Quét các đường dẫn đã chọn

Truyền một mảng đường dẫn bên trong kho lưu trữ:

const result = await security.run("/path/to/repository", {
  target: ["services/billing", "packages/auth"],
});

Đường dẫn có thể xác định tệp hoặc thư mục. SDK phân giải từng đường dẫn bên trong kho lưu trữ và loại bỏ các mục trùng lặp.

Quét các thay đổi đã commit

Sử dụng DiffTarget.refs để quét các thay đổi đã commit giữa hai bản sửa đổi Git có sẵn cục bộ:



const target = DiffTarget.refs({
  base: "origin/main",
  head: "HEAD",
});

const result = await security.run("/path/to/repository", { target });

Phần đầu mặc định là HEAD. Mục tiêu diff yêu cầu đối số kho lưu trữ là thư mục gốc của Git worktree.

Quét cây làm việc

Sử dụng DiffTarget.workingTree để quét các thay đổi đã stage và chưa stage so với một bản sửa đổi gốc:

const target = DiffTarget.workingTree({ base: "HEAD" });
const result = await security.run("/path/to/repository", { target });

Phần gốc mặc định là HEAD. Hãy tải các bản sửa đổi đã chọn trước khi bắt đầu quét diff hoặc cây làm việc.

Chọn chế độ chuyên sâu

Đặt mode: "deep" cho một lượt quét kho lưu trữ hoặc đường dẫn cần xem xét rộng hơn:

const result = await security.run("/path/to/repository", {
  target: ["services/billing"],
  mode: "deep",
});

Chế độ chuyên sâu hỗ trợ mục tiêu là kho lưu trữ và đường dẫn. Sử dụng chế độ tiêu chuẩn cho các lượt quét diff và cây làm việc.

Thêm cơ sở tri thức bảo mật

Truyền tài liệu kiến trúc, mô hình mối đe dọa hoặc chính sách bảo mật thông qua knowledgeBasePaths:

const result = await security.run("/path/to/repository", {
  knowledgeBasePaths: [
    "/path/to/architecture.md",
    "/path/to/security-policies",
  ],
});

SDK chấp nhận tệp hoặc thư mục và tìm kiếm đệ quy trong thư mục. Các định dạng tài liệu được hỗ trợ là .md, .markdown, .txt, .pdf.docx. SDK từ chối các đường dẫn đầu vào là liên kết, bỏ qua các mục thư mục là liên kết và giữ nội dung tài liệu đã trích xuất bên ngoài kết quả quét đã lưu.

Đặt ngân sách quét

Đặt maxCostUsd để dừng lượt quét khi chi phí mô hình ước tính vượt quá giới hạn. Sử dụng onCost để theo dõi chi phí trong khi quét:

const result = await security.run("/path/to/repository", {
  maxCostUsd: 5,
  onCost(cost) {
    console.log(cost.estimatedUsd);
  },
});

console.log(result.cost?.estimatedUsd);

Giới hạn này là một ước tính, không phải mức trần chi tiêu tuyệt đối. Các yêu cầu đang được xử lý có thể hoàn tất với chi phí cao hơn. Nếu lượt quét vượt giới hạn, SDK sẽ ném ScanCostLimitExceededError và lưu giữ các kết quả hiện có.

Làm việc với kết quả quét

ScanResult cung cấp các tài liệu có cấu trúc, siêu dữ liệu quét và đường dẫn artifact:

Thuộc tính Nội dung
manifest Manifest quét đã niêm phong, bao gồm mục tiêu, phạm vi, trình tạo và bản ghi artifact.
findings Tài liệu phát hiện. Đọc các đối tượng phát hiện từ findings.findings.
coverage Các khu vực đã xem xét, phần loại trừ, công việc bị hoãn, câu hỏi chưa giải quyết và mức độ hoàn chỉnh.
scanDir Thư mục quét.
threadId Mã định danh luồng Codex của lượt quét.
turnResult Trạng thái lượt, phản hồi và siêu dữ liệu sử dụng hiện có.
cost Chi phí mô hình và token ước tính, hoặc null khi không có dữ liệu.
reportPath Đường dẫn đến report.md.
manifestPath Đường dẫn đến scan-manifest.json.
findingsPath Đường dẫn đến findings.json.
coveragePath Đường dẫn đến coverage.json.
artifactsDir Thư mục artifact hỗ trợ.
sarifPath Đường dẫn SARIF đã tạo, hoặc null khi không có SARIF.
pluginVersion Phiên bản do trình tạo lượt quét ghi lại.

Sử dụng trực tiếp các phát hiện và phạm vi bao phủ có cấu trúc:

for (const finding of result.findings.findings) {
  const location = finding.locations[0];
  if (location === undefined) continue;

  console.log(
    finding.severity.level,
    `${location.path}:${location.startLine}`,
    finding.title
  );
}

for (const deferred of result.coverage.deferred) {
  console.log(deferred.id, deferred.reason);
}

Mức độ hoàn chỉnh của phạm vi bao phủ là complete, partial hoặc unknown. Hãy xem xét các khu vực bị hoãn, phần loại trừ và câu hỏi chưa giải quyết trước khi dùng một lượt quét làm bằng chứng cho quyết định bảo mật.

result.toJSON() trả về manifest, các phát hiện, phạm vi bao phủ, mã định danh lượt quét và luồng, reportPath, artifactsDir, sarifPath cùng siêu dữ liệu lượt trong một đối tượng sẵn sàng cho JSON.

Theo dõi hoặc hủy lượt quét

Truyền các callback ScanOptions để báo cáo lúc bắt đầu quét, tiến trình worker và các lần thử kết nối lại:

const result = await security.run("/path/to/repository", {
  outputDir: "/path/outside/repository/results",
  onScanStarted() {
    console.log("Scan started");
  },
  onWorkerStatus(status) {
    console.log(status.kind, status);
  },
  onReconnect(attempt, maxAttempts) {
    console.log(`Reconnect attempt ${attempt} of ${maxAttempts}`);
  },
  onObserverError(observer, error) {
    console.error(`${observer} failed`, error);
  },
});

console.log(result.reportPath);

Truyền một AbortSignal khi yêu cầu hủy đến từ một request, bộ điều khiển job hoặc thời gian chờ:



const controller = new AbortController();

try {
  const scan = security.run("/path/to/repository", {
    outputDir: "/path/outside/repository/results",
    signal: controller.signal,
  });

  controller.abort();
  await scan;
} catch (error) {
  if (error instanceof ScanInterruptedError) {
    console.error(error.scanDir);
  } else {
    throw error;
  }
}

Một lượt quét bị gián đoạn có thể để lại đầu ra một phần trong scanDir. Hãy lưu giữ thư mục đó khi cần điều tra kết quả.

Các ứng dụng hiển thị tiến trình thiết lập quét cũng có thể sử dụng các callback vòng đời ScanOptions:

Callback Được gọi khi
onOutputArchived(archiveDir) Kết quả hiện có được chuyển vào thư mục lưu trữ.
onOutputDirReady(scanDir) Thư mục quét riêng tư đã sẵn sàng.
onScanStarted() Quá trình thiết lập quét hoàn tất và bắt đầu thực thi.
onReconnect(attempt, maxAttempts) SDK thử kết nối lại một luồng quét đã ngắt kết nối.
onWorkerStatus(status) Trạng thái preflight hoặc điều phối của worker thay đổi.
onCost(cost) Đã có bản ước tính chi phí quét cập nhật.
onObserverError(observer, error) Một callback vòng đời quét khác phát sinh lỗi.

Cấu hình môi trường chạy và thông tin xác thực

Truyền cấu hình môi trường chạy khi bạn cần một plugin, trình thông dịch hoặc thiết lập Codex cụ thể:

const security = new CodexSecurity({
  pluginPath: "/path/to/codex-security-plugin",
  pythonPath: "/path/to/python",
  codexOverrides: {
    model: "gpt-5.6-terra",
    model_reasoning_effort: "high",
  },
});

pluginPath chấp nhận một thư mục plugin hoặc tệp ZIP. pythonPath chọn trình thông dịch plugin. codexOverrides hợp nhất các giá trị được hỗ trợ vào cấu hình Codex cô lập. Theo mặc định, các lượt quét sử dụng gpt-5.6-sol với mức nỗ lực suy luận cực cao. Đặt modelmodel_reasoning_effort trong codexOverrides để sử dụng một mô hình hoặc mức nỗ lực suy luận khác. Để sử dụng Amazon Bedrock, hãy đặt model_providermodel trong codexOverrides.

Client cũng cung cấp các phương thức xác thực được hỗ trợ:

Phương thức Mục đích
loginApiKey(apiKey) Xác thực môi trường chạy cô lập bằng API key.
loginChatGPT() Bắt đầu luồng đăng nhập qua trình duyệt và trả về một login handle.
loginChatGPTDeviceCode() Bắt đầu luồng đăng nhập bằng mã thiết bị và trả về một login handle.
account() Trả về trạng thái xác thực hiện tại.
logout() Xóa thông tin xác thực cô lập.

Một login handle cung cấp waitForInstructions, authUrl, verificationUrl, userCode, waitcancel để ứng dụng có thể trình bày và hoàn tất luồng đăng nhập đã chọn. SDK có thể tái sử dụng một phiên đăng nhập Codex được lưu trong tệp. API key phù hợp cho CI và tự động hóa phía máy chủ.

Khi cả API key lẫn phiên đăng nhập đã lưu đều có sẵn, SDK mặc định sử dụng API key. Để sử dụng phiên đăng nhập ChatGPT của bạn, hãy chọn phiên đó cho lượt quét:

const result = await security.run("/path/to/repository", {
  auth: "chatgpt",
});

Đặt auth: "api-key" để bắt buộc dùng API key từ môi trường. preflight chấp nhận cùng tùy chọn auth.

Xử lý lỗi quét

Bắt lớp lỗi được xuất tương ứng với hành động mà ứng dụng của bạn có thể thực hiện:

Lỗi Ý nghĩa
AuthenticationRequiredError Một lượt quét cần thông tin xác thực được hỗ trợ.
ConfigurationError Cấu hình Codex hoặc một giá trị ghi đè không phù hợp.
InvalidTargetError Kho lưu trữ, đường dẫn, chế độ hoặc mục tiêu Git không phù hợp.
OutputDirectoryError Vị trí đầu ra hoặc quyền của vị trí đó không phù hợp.
OutputInsideProtectedRootError Thư mục đầu ra nằm trong kho lưu trữ hoặc worktree được quét.
PluginPythonUnavailableError Không có trình thông dịch Python khả dụng.
PluginBootstrapError Không thể khởi động môi trường chạy plugin.
ScanCostLimitExceededError Lượt quét đã vượt quá giới hạn chi phí ước tính.
IncompleteScanError Lượt quét kết thúc trước khi tạo ra kết quả bắt buộc.
ContractValidationError Một lượt quét đã hoàn tất trả về lỗi hợp đồng có cấu trúc.
ScanInterruptedError Một lần gián đoạn đã dừng lượt quét và có thể để lại đầu ra một phần.

Tiếp tục với hướng dẫn bắt đầu nhanh về CLI, hướng dẫn CI hoặc tài liệu tham chiếu CLI.