pomaster 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -22
- package/catalog/archetypes/archetype.frontend.error_taxonomy.json +13 -5
- package/catalog/archetypes/archetype.frontend.feature_oriented.json +1 -1
- package/catalog/archetypes/archetype.state.async_command.json +4 -4
- package/catalog/catalog-lock.draft.json +1120 -104
- package/catalog/gates/gate.be.api.contract_checks.json +2 -1
- package/catalog/gates/gate.be.chg.contract_change_checks.json +2 -1
- package/catalog/gates/gate.chg.prechange_checks.json +2 -1
- package/catalog/gates/gate.web.api.request_checks.json +2 -1
- package/catalog/gates/gate.web.grid.checks.json +2 -1
- package/catalog/knowledge/knowledge.api.example_stable_error_code.json +2 -1
- package/catalog/knowledge/knowledge.chg.example_compat_window.json +2 -1
- package/catalog/knowledge/knowledge.chg.example_prop_migration.json +2 -1
- package/catalog/knowledge/knowledge.fp.api.field_drift_no_contract.json +2 -1
- package/catalog/knowledge/knowledge.fp.api.per_page_http_client.json +2 -1
- package/catalog/knowledge/knowledge.fp.be.contract_drift.json +2 -1
- package/catalog/knowledge/knowledge.fp.chg.page_local_padding.json +2 -1
- package/catalog/knowledge/knowledge.fp.grid.global_td_width.json +2 -1
- package/catalog/knowledge/knowledge.web.api.example_get_entity_list.json +2 -1
- package/catalog/knowledge/knowledge.web.grid.example_column_preset.json +2 -1
- package/catalog/policies/authority.be.api_contract_ownership.json +2 -1
- package/catalog/policies/authority.be.contract_ownership.json +2 -1
- package/catalog/policies/authority.chg.change_owners.json +2 -1
- package/catalog/policies/authority.web.api.request_owners.json +2 -1
- package/catalog/policies/authority.web.grid.ownership.json +2 -1
- package/catalog/policies/policy.ai.change_plan_first.json +91 -0
- package/catalog/policies/policy.ai.fact_inference_separation.json +91 -0
- package/catalog/policies/policy.ai.read_search_verify_before_write.json +92 -0
- package/catalog/policies/policy.ai.rule_relaxation_approval.json +91 -0
- package/catalog/policies/policy.api.backward_compat_defaults.json +2 -1
- package/catalog/policies/policy.api.contract_impl_consistency.json +2 -1
- package/catalog/policies/policy.api.no_informal_contract.json +2 -1
- package/catalog/policies/policy.arch.adr_immutable_history.json +91 -0
- package/catalog/policies/policy.arch.decision_tradeoff_record.json +2 -1
- package/catalog/policies/policy.arch.no_convenience_over_boundary.json +93 -0
- package/catalog/policies/policy.arch.prefer_verifiable_option.json +92 -0
- package/catalog/policies/policy.authz.no_gating_proxy_trust.json +99 -0
- package/catalog/policies/policy.authz.permission_scope_expansion_gate.json +99 -0
- package/catalog/policies/policy.authz.server_five_factor_verification.json +101 -0
- package/catalog/policies/policy.be.conc.prefer_db_constraints.json +97 -0
- package/catalog/policies/policy.be.db.expand_migrate_contract.json +97 -0
- package/catalog/policies/policy.be.idem.key_payload_conflict.json +97 -0
- package/catalog/policies/policy.be.model.single_boundary_conversion.json +97 -0
- package/catalog/policies/policy.be.sql.index_for_known_queries.json +97 -0
- package/catalog/policies/policy.be.state.single_rule_source.json +97 -0
- package/catalog/policies/policy.be.txn.short_locks_compensation.json +96 -0
- package/catalog/policies/policy.bound.search_first_entry_only.json +91 -0
- package/catalog/policies/policy.boundary.validate_in_encode_out.json +92 -0
- package/catalog/policies/policy.cache.failure_mode_guards.json +93 -0
- package/catalog/policies/policy.cache.lifecycle_definition.json +2 -1
- package/catalog/policies/policy.cache.schema_versioning.json +91 -0
- package/catalog/policies/policy.cfg.config_attribute_completeness.json +95 -0
- package/catalog/policies/policy.cfg.key_rename_dual_read.json +92 -0
- package/catalog/policies/policy.cfg.no_secret_dispersal.json +90 -0
- package/catalog/policies/policy.cfg.production_safe_defaults.json +92 -0
- package/catalog/policies/policy.cfg.schema_backed_config.json +92 -0
- package/catalog/policies/policy.chg.affect_templates.json +2 -1
- package/catalog/policies/policy.chg.breaking_versioning.json +2 -1
- package/catalog/policies/policy.chg.compat_migration_rollback.json +2 -1
- package/catalog/policies/policy.chg.deprecate_before_delete.json +2 -1
- package/catalog/policies/policy.chg.fix_at_root_cause_level.json +2 -1
- package/catalog/policies/policy.chg.no_unrelated_changes.json +91 -0
- package/catalog/policies/policy.chg.observable_evolution.json +2 -1
- package/catalog/policies/policy.chg.prechange_consumer_scan.json +2 -1
- package/catalog/policies/policy.chg.staged_rollout.json +2 -1
- package/catalog/policies/policy.chg.sync_contract_docs_tests.json +2 -1
- package/catalog/policies/policy.conflict.priority_ladder.json +2 -1
- package/catalog/policies/policy.contract.no_invented_facts.json +93 -0
- package/catalog/policies/policy.dep.admission_six_dimension_check.json +2 -1
- package/catalog/policies/policy.dep.build_path_supply_chain.json +93 -0
- package/catalog/policies/policy.dep.change_surface_review.json +2 -1
- package/catalog/policies/policy.dep.introduction_review.json +2 -1
- package/catalog/policies/policy.dep.no_untrusted_source_no_lock_bypass.json +92 -0
- package/catalog/policies/policy.dep.time_boxed_urgent_exception.json +91 -0
- package/catalog/policies/policy.deploy.no_dev_env_as_production_fact.json +91 -0
- package/catalog/policies/policy.deploy.operational_capabilities.json +93 -0
- package/catalog/policies/policy.deploy.runtime_fact_record.json +97 -0
- package/catalog/policies/policy.derived.single_implementation.json +2 -1
- package/catalog/policies/policy.err.failure_five_part_mapping.json +101 -0
- package/catalog/policies/policy.err.no_internal_detail_exposure.json +97 -0
- package/catalog/policies/policy.err.published_code_immutable.json +98 -0
- package/catalog/policies/policy.evid.acceptance_binds_verifiable_evidence.json +92 -0
- package/catalog/policies/policy.evid.no_silent_gate_removal.json +90 -0
- package/catalog/policies/policy.evid.no_unverifiable_pass.json +92 -0
- package/catalog/policies/policy.flag.cleanup_after_full_rollout.json +94 -0
- package/catalog/policies/policy.flag.consistent_off_state.json +92 -0
- package/catalog/policies/policy.flag.kill_switch.json +91 -0
- package/catalog/policies/policy.flag.lifecycle_metadata.json +93 -0
- package/catalog/policies/policy.flag.not_a_permission.json +92 -0
- package/catalog/policies/policy.gate.p0_non_bypassable.json +92 -0
- package/catalog/policies/policy.gate.risk_factors_confirmed.json +93 -0
- package/catalog/policies/policy.guard.no_check_weakening.json +92 -0
- package/catalog/policies/policy.integration.call_definition_minimum.json +95 -0
- package/catalog/policies/policy.integration.fault_containment.json +94 -0
- package/catalog/policies/policy.job.lifecycle_definition.json +96 -0
- package/catalog/policies/policy.job.no_unmanaged_execution.json +92 -0
- package/catalog/policies/policy.job.operational_features.json +93 -0
- package/catalog/policies/policy.obs.actionable_signals.json +93 -0
- package/catalog/policies/policy.obs.alert_with_owner.json +91 -0
- package/catalog/policies/policy.obs.context_field_baseline.json +91 -0
- package/catalog/policies/policy.obs.correlation_context_minimum.json +2 -1
- package/catalog/policies/policy.obs.no_sensitive_or_unbounded_logging.json +92 -0
- package/catalog/policies/policy.obs.no_sensitive_raw_values.json +93 -0
- package/catalog/policies/policy.obs.rum_dimension_whitelist.json +2 -1
- package/catalog/policies/policy.obs.signal_change_impact.json +91 -0
- package/catalog/policies/policy.obs.source_map_access_control.json +92 -0
- package/catalog/policies/policy.obs.telemetry_lifecycle_declared.json +93 -0
- package/catalog/policies/policy.obs.trace_correlation.json +91 -0
- package/catalog/policies/policy.perf.budget_change_retest.json +91 -0
- package/catalog/policies/policy.perf.evidence_binding.json +95 -0
- package/catalog/policies/policy.perf.observation_dimensions.json +94 -0
- package/catalog/policies/policy.proc.checklist_change_policy.json +91 -0
- package/catalog/policies/policy.proc.pre_code_declaration.json +2 -1
- package/catalog/policies/policy.proc.scope_drift_reclassify.json +91 -0
- package/catalog/policies/policy.prv.processing_scope_re_review.json +97 -0
- package/catalog/policies/policy.prv.sensitive_data_six_facts.json +102 -0
- package/catalog/policies/policy.registry.human_fields_validated_decorrelated.json +93 -0
- package/catalog/policies/policy.rel.no_irreversible_unmonitored_full_release.json +91 -0
- package/catalog/policies/policy.rel.observability_before_ship.json +91 -0
- package/catalog/policies/policy.rel.pre_release_confirmation.json +2 -1
- package/catalog/policies/policy.rel.process_change_needs_drill_audit.json +91 -0
- package/catalog/policies/policy.rel.traceable_build.json +93 -0
- package/catalog/policies/policy.role.domain_decision_authority.json +2 -1
- package/catalog/policies/policy.role.human_signs_for_ai.json +93 -0
- package/catalog/policies/policy.sec.authn_policy_unified.json +91 -0
- package/catalog/policies/policy.sec.no_client_side_trust.json +95 -0
- package/catalog/policies/policy.sec.no_longterm_security_disable.json +91 -0
- package/catalog/policies/policy.sec.no_script_readable_credentials.json +91 -0
- package/catalog/policies/policy.sec.no_secrets_in_client_surface.json +91 -0
- package/catalog/policies/policy.sec.relaxation_approval.json +92 -0
- package/catalog/policies/policy.sec.security_relaxation_gate.json +95 -0
- package/catalog/policies/policy.sec.third_party_execution_register.json +2 -1
- package/catalog/policies/policy.sec.trust_boundary_enforcement.json +96 -0
- package/catalog/policies/policy.sec.upload_download_server_recheck.json +91 -0
- package/catalog/policies/policy.sec.url_source_allowlist.json +91 -0
- package/catalog/policies/policy.spec.admission_criteria.json +2 -1
- package/catalog/policies/policy.spec.derived_view_regeneration.json +2 -1
- package/catalog/policies/policy.spec.draft_not_baseline.json +2 -1
- package/catalog/policies/policy.spec.family_conflict_precedence.json +93 -0
- package/catalog/policies/policy.spec.file_structure_contract.json +2 -1
- package/catalog/policies/policy.spec.freeze_before_use.json +93 -0
- package/catalog/policies/policy.spec.metadata_required.json +2 -1
- package/catalog/policies/policy.spec.post_dev_backfill_classify.json +2 -1
- package/catalog/policies/policy.spec.primary_source_basis.json +93 -0
- package/catalog/policies/policy.spec.procedural_record_not_surrogate.json +2 -1
- package/catalog/policies/policy.spec.semantic_identity.json +2 -1
- package/catalog/policies/policy.spec.unresolved_ledger_gate.json +2 -1
- package/catalog/policies/policy.stack.derived_store_not_authority.json +93 -0
- package/catalog/policies/policy.stack.dual_web_stack_boundary.json +93 -0
- package/catalog/policies/policy.stack.entry_chain_recorded.json +93 -0
- package/catalog/policies/policy.stack.entry_limits_aligned.json +94 -0
- package/catalog/policies/policy.stack.local_form_not_prod_fact.json +93 -0
- package/catalog/policies/policy.stack.multi_datastore_ownership.json +93 -0
- package/catalog/policies/policy.stack.no_implicit_selection.json +2 -1
- package/catalog/policies/policy.stack.persistence_coexistence_scope.json +93 -0
- package/catalog/policies/policy.stack.toolchain_versions_pinned.json +95 -0
- package/catalog/policies/policy.stack.upgrade_compat_verified.json +93 -0
- package/catalog/policies/policy.struct.module_entry_dependency_declared.json +92 -0
- package/catalog/policies/policy.struct.no_unexplained_top_level_dir.json +91 -0
- package/catalog/policies/policy.struct.reuse_proven_structure.json +91 -0
- package/catalog/policies/policy.test.control_nondeterminism_keep_diagnosis.json +91 -0
- package/catalog/policies/policy.test.isolation_and_cleanup.json +93 -0
- package/catalog/policies/policy.test.no_synthetic_stability.json +92 -0
- package/catalog/policies/policy.test.pyramid_and_ci_matrix.json +92 -0
- package/catalog/policies/policy.test.removal_justification.json +91 -0
- package/catalog/policies/policy.test.removal_needs_substitute_evidence.json +91 -0
- package/catalog/policies/policy.test.risk_driven_plan.json +92 -0
- package/catalog/policies/policy.test.stable_observable_assertions.json +92 -0
- package/catalog/policies/policy.tool.discoverable_toolchain.json +92 -0
- package/catalog/policies/policy.tool.no_hand_edit_generated_no_ci_drift.json +91 -0
- package/catalog/policies/policy.tool.no_vendored_body_edits.json +94 -0
- package/catalog/policies/policy.tool.scoped_scan_boundary.json +2 -1
- package/catalog/policies/policy.tool.upgrade_verify_lock_rollback.json +92 -0
- package/catalog/policies/policy.web.api.auth_app_client_split.json +2 -1
- package/catalog/policies/policy.web.api.client_change_impact.json +2 -1
- package/catalog/policies/policy.web.api.domain_api_only.json +2 -1
- package/catalog/policies/policy.web.api.error_normalization.json +2 -1
- package/catalog/policies/policy.web.api.generated_client.json +2 -1
- package/catalog/policies/policy.web.api.late_result_guard.json +2 -1
- package/catalog/policies/policy.web.api.mutation_idempotency.json +2 -1
- package/catalog/policies/policy.web.api.no_network_optimism.json +2 -1
- package/catalog/policies/policy.web.api.query_cancel_stale_drop.json +2 -1
- package/catalog/policies/policy.web.api.request_infrastructure.json +2 -1
- package/catalog/policies/policy.web.api.retry_discipline.json +2 -1
- package/catalog/policies/policy.web.api.session_recovery_split.json +2 -1
- package/catalog/policies/policy.web.api.single_http_client.json +2 -1
- package/catalog/policies/policy.web.api.single_loading_source.json +2 -1
- package/catalog/policies/policy.web.api.transport_vs_business.json +2 -1
- package/catalog/policies/policy.web.api.trusted_endpoint_source.json +2 -1
- package/catalog/policies/policy.web.api.typed_domain_naming.json +2 -1
- package/catalog/policies/policy.web.arch.layer_isolation.json +2 -1
- package/catalog/policies/policy.web.arch.naming_conventions.json +2 -1
- package/catalog/policies/policy.web.arch.public_api_barrel.json +2 -1
- package/catalog/policies/policy.web.chg.controlled_change_triggers.json +2 -1
- package/catalog/policies/policy.web.comp.no_trivial_or_god_component.json +91 -0
- package/catalog/policies/policy.web.comp.public_contract_completeness.json +93 -0
- package/catalog/policies/policy.web.copy.action_object_clarity.json +92 -0
- package/catalog/policies/policy.web.copy.enumerable_placement.json +91 -0
- package/catalog/policies/policy.web.copy.error_next_step.json +92 -0
- package/catalog/policies/policy.web.copy.suppression_ledger_discipline.json +2 -1
- package/catalog/policies/policy.web.grid.column_schema_fields.json +2 -1
- package/catalog/policies/policy.web.grid.config_isolation.json +2 -1
- package/catalog/policies/policy.web.grid.freeze_key_columns.json +2 -1
- package/catalog/policies/policy.web.grid.interaction_registry.json +2 -1
- package/catalog/policies/policy.web.grid.keyboard_clipboard.json +2 -1
- package/catalog/policies/policy.web.grid.schema_driven_shell.json +2 -1
- package/catalog/policies/policy.web.grid.schema_versioning.json +2 -1
- package/catalog/policies/policy.web.grid.server_ops_virtualization.json +2 -1
- package/catalog/policies/policy.web.grid.shell_change_matrix.json +2 -1
- package/catalog/policies/policy.web.grid.width_fix_ladder.json +2 -1
- package/catalog/policies/policy.web.handoff.state_matrix_full.json +94 -0
- package/catalog/policies/policy.web.i18n.copy_key_discipline.json +92 -0
- package/catalog/policies/policy.web.i18n.raw_value_for_compute.json +91 -0
- package/catalog/policies/policy.web.page.region_consistency.json +93 -0
- package/catalog/policies/policy.web.perf.budget_skeleton.json +2 -1
- package/catalog/policies/policy.web.style.ownership_matrix.json +2 -1
- package/catalog/policies/policy.web.track.attempt_result_correlation.json +91 -0
- package/catalog/policies/policy.web.track.consent_lifecycle.json +2 -1
- package/catalog/policies/policy.web.track.no_synthetic_actions.json +92 -0
- package/catalog/policies/policy.web.track.privacy_default_deny.json +2 -1
- package/catalog/policies/policy.web.track.stable_event_keys.json +2 -1
- package/catalog/policies/policy.web.track.typed_client_validation.json +91 -0
- package/catalog/policies/policy.web.uiux.provider_evidence_not_business_truth.json +2 -1
- package/catalog/policies/policy.wf.no_planned_as_verified.json +91 -0
- package/catalog/policies/policy.wf.task_facts_preconfirm.json +94 -0
- package/catalog/policies/profile.baseline.java_enterprise_default.json +96 -0
- package/catalog/sensors/sensor.browser.deterministic.json +2 -1
- package/catalog/sensors/sensor.browser.interactive.json +2 -1
- package/catalog/sensors/sensor.build.static.json +2 -1
- package/catalog/sensors/sensor.contract.conformance.json +2 -1
- package/catalog/sensors/sensor.performance.budget.json +2 -1
- package/catalog/sensors/sensor.production.metric.json +2 -1
- package/catalog/tools/seed_b6b_frontend.py +1424 -0
- package/catalog/tools/seed_b6c_backend.py +1495 -0
- package/catalog/tools/seed_b6d_baseline.py +620 -0
- package/catalog/tools/seed_b6e_evidence.py +1305 -0
- package/catalog/tools/seed_d3_review.py +1105 -0
- package/catalog/tools/seed_v06_batch2_materials.py +27 -18
- package/dist/bin.js +20514 -10735
- package/package.json +2 -1
- package/seeds/aggregation-manifest.json +691 -0
- package/seeds/baseline/backend/api-contract.md +26 -0
- package/seeds/baseline/backend/architecture.md +31 -0
- package/seeds/baseline/backend/data-access.md +31 -0
- package/seeds/baseline/backend/directory-structure.md +11 -0
- package/seeds/baseline/backend/integration-runtime.md +21 -0
- package/seeds/baseline/backend/quality.md +31 -0
- package/seeds/baseline/backend/stack.yaml +13 -0
- package/seeds/baseline/backend/transaction-concurrency.md +26 -0
- package/seeds/baseline/data/lineage.md +11 -0
- package/seeds/baseline/data/migration.md +11 -0
- package/seeds/baseline/data/model.md +31 -0
- package/seeds/baseline/data/precision-units.md +31 -0
- package/seeds/baseline/data/quality.md +31 -0
- package/seeds/baseline/frontend/api-and-error.md +21 -0
- package/seeds/baseline/frontend/architecture.md +26 -0
- package/seeds/baseline/frontend/design-system.md +21 -0
- package/seeds/baseline/frontend/directory-structure.md +16 -0
- package/seeds/baseline/frontend/quality.md +26 -0
- package/seeds/baseline/frontend/stack.yaml +17 -0
- package/seeds/baseline/frontend/state-and-data.md +26 -0
- package/seeds/baseline/manifest.yaml +32 -0
- package/seeds/baseline/platform/delivery.md +36 -0
- package/seeds/baseline/platform/environment.md +11 -0
- package/seeds/baseline/platform/observability.md +31 -0
- package/seeds/baseline/platform/security.md +26 -0
- package/seeds/manifest.json +1429 -0
- package/seeds/specs/evidence/accessibility.md +89 -0
- package/seeds/specs/evidence/architecture.md +89 -0
- package/seeds/specs/evidence/browser-e2e.md +91 -0
- package/seeds/specs/evidence/build.md +91 -0
- package/seeds/specs/evidence/business-acceptance.md +89 -0
- package/seeds/specs/evidence/complexity-crap.md +97 -0
- package/seeds/specs/evidence/contract.md +89 -0
- package/seeds/specs/evidence/coverage.md +91 -0
- package/seeds/specs/evidence/data-migration.md +91 -0
- package/seeds/specs/evidence/dead-code-duplicate.md +89 -0
- package/seeds/specs/evidence/dependency-supply-chain.md +89 -0
- package/seeds/specs/evidence/index.md +55 -0
- package/seeds/specs/evidence/mutation.md +89 -0
- package/seeds/specs/evidence/performance.md +89 -0
- package/seeds/specs/evidence/release.md +91 -0
- package/seeds/specs/evidence/runtime-observability.md +91 -0
- package/seeds/specs/evidence/security.md +89 -0
- package/seeds/specs/evidence/typecheck-lint.md +91 -0
- package/seeds/specs/evidence/unit-component-integration.md +91 -0
- package/seeds/specs/evidence/visual-regression.md +89 -0
- package/seeds/specs/hard/stacks/antdesign/antdesign-ui-overlay.md +48 -0
- package/seeds/specs/hard/stacks/antdesign/index.md +20 -0
- package/seeds/specs/hard/stacks/css/css-system-overlay.md +52 -0
- package/seeds/specs/hard/stacks/css/index.md +20 -0
- package/seeds/specs/hard/stacks/geist/geist-design-system-overlay.md +48 -0
- package/seeds/specs/hard/stacks/geist/index.md +20 -0
- package/seeds/specs/hard/stacks/java/index.md +20 -0
- package/seeds/specs/hard/stacks/java/java-language-overlay.md +35 -0
- package/seeds/specs/hard/stacks/jpa/index.md +20 -0
- package/seeds/specs/hard/stacks/jpa/jpa-persistence-overlay.md +35 -0
- package/seeds/specs/hard/stacks/kubernetes-ingress/index.md +20 -0
- package/seeds/specs/hard/stacks/kubernetes-ingress/kubernetes-ingress-overlay.md +35 -0
- package/seeds/specs/hard/stacks/messaging/index.md +20 -0
- package/seeds/specs/hard/stacks/messaging/messaging-reliability-overlay.md +35 -0
- package/seeds/specs/hard/stacks/mybatis/index.md +20 -0
- package/seeds/specs/hard/stacks/mybatis/mybatis-persistence-overlay.md +35 -0
- package/seeds/specs/hard/stacks/mysql/index.md +20 -0
- package/seeds/specs/hard/stacks/mysql/mysql-database-overlay.md +35 -0
- package/seeds/specs/hard/stacks/nginx/index.md +20 -0
- package/seeds/specs/hard/stacks/nginx/nginx-proxy-overlay.md +35 -0
- package/seeds/specs/hard/stacks/postgresql/index.md +20 -0
- package/seeds/specs/hard/stacks/postgresql/postgresql-database-overlay.md +35 -0
- package/seeds/specs/hard/stacks/redis/index.md +20 -0
- package/seeds/specs/hard/stacks/redis/redis-cache-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-batch/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-batch/spring-batch-job-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-boot/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-boot/spring-boot-application-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-mvc/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-mvc/spring-mvc-web-overlay.md +35 -0
- package/seeds/specs/hard/stacks/spring-webflux/index.md +20 -0
- package/seeds/specs/hard/stacks/spring-webflux/spring-webflux-reactive-overlay.md +35 -0
- package/seeds/specs/hard/stacks/tomcat/index.md +20 -0
- package/seeds/specs/hard/stacks/tomcat/tomcat-runtime-overlay.md +35 -0
- package/seeds/specs/hard/stacks/vue3/index.md +20 -0
- package/seeds/specs/hard/stacks/vue3/vue3-framework-overlay.md +71 -0
- package/seeds/specs/hard/themes/ai-generated-code.md +171 -0
- package/seeds/specs/hard/themes/api-contract-and-error-semantics.md +532 -0
- package/seeds/specs/hard/themes/architecture-and-module-boundaries.md +323 -0
- package/seeds/specs/hard/themes/data-and-transactions.md +582 -0
- package/seeds/specs/hard/themes/engineering-toolchain-and-dependencies.md +333 -0
- package/seeds/specs/hard/themes/environment-and-configuration.md +196 -0
- package/seeds/specs/hard/themes/frontend-state-and-client-data.md +342 -0
- package/seeds/specs/hard/themes/index.md +374 -0
- package/seeds/specs/hard/themes/integration-and-async-runtime.md +331 -0
- package/seeds/specs/hard/themes/internationalization-and-copywriting.md +350 -0
- package/seeds/specs/hard/themes/observability-and-analytics.md +305 -0
- package/seeds/specs/hard/themes/page-composition-and-browser-environment.md +554 -0
- package/seeds/specs/hard/themes/performance-and-capacity.md +226 -0
- package/seeds/specs/hard/themes/permission-and-authorization.md +168 -0
- package/seeds/specs/hard/themes/privacy-and-data-lifecycle.md +176 -0
- package/seeds/specs/hard/themes/release-and-feature-flags.md +237 -0
- package/seeds/specs/hard/themes/security.md +372 -0
- package/seeds/specs/hard/themes/task-governance-and-acceptance.md +554 -0
- package/seeds/specs/hard/themes/testing-and-verification.md +266 -0
- package/seeds/specs/hard/themes/ui-presentation-and-design.md +670 -0
- package/seeds/specs/hard/themes/value-semantics-and-domain-data.md +339 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
---
|
|
2
|
+
seed_source: packages/cli/seeds/aggregation-manifest.json
|
|
3
|
+
seed_source_sha256: 039b637ccffacdfe3ce30d85e193f4b38928fcdfb16efdc4eb255e35e05af91f
|
|
4
|
+
seed_version: B7-THEME
|
|
5
|
+
lane: [frontend, backend]
|
|
6
|
+
status: CURRENT
|
|
7
|
+
authority_scope: mixed_required_and_advisory
|
|
8
|
+
applies_to: [frontend, backend]
|
|
9
|
+
related_evidence_specs: []
|
|
10
|
+
related_tools: []
|
|
11
|
+
legacy_id: theme:release-and-feature-flags
|
|
12
|
+
criticality: critical # 聚合注记:取源最高;info 性注记非执行语义
|
|
13
|
+
injection_mode: triggered # 聚合注记:来源同值;info 性注记非执行语义
|
|
14
|
+
stages: [prepare, check, release] # 聚合注记:来源 stages 并集;info 性注记非执行语义
|
|
15
|
+
triggers: [release, rollback, versioning] # 聚合注记:来源 triggers 并集;info 性注记非执行语义
|
|
16
|
+
requires: [] # 聚合注记:来源 requires 并集(全空)
|
|
17
|
+
x-aggregation: # 聚合来源(D6):逐源 vendor pin(sha256 与卡 vendor_pin 同值)
|
|
18
|
+
- seed_source: pomaster/components/frontend-hard-spec/assets/universal/33-release-versioning-protocol.md
|
|
19
|
+
sha256: aae0557f4935bac24d04e37ebde5638471b709ff568fea0d13de35bd5dd404af
|
|
20
|
+
seed_version: B6B-2
|
|
21
|
+
- seed_source: pomaster/components/frontend-hard-spec/assets/universal/36-feature-flag-protocol.md
|
|
22
|
+
sha256: ba6cf2d5607ba54d9864cd6c07899d2e13a8d33ea248fbd7469b92c23474f474
|
|
23
|
+
seed_version: B6B-2
|
|
24
|
+
- seed_source: pomaster/components/backend-hard-spec/assets/universal/32-release-versioning-rollback-protocol.md
|
|
25
|
+
sha256: 26a6a23928fc24338f69fb34199ecdea5f654e21534a76ac53a7c0b78030b3c8
|
|
26
|
+
seed_version: B6C
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# 发布与开关
|
|
30
|
+
|
|
31
|
+
> **聚合纪律**:本文档 12 节正文规则行逐字取自 frontmatter x-aggregation 所列来源协议(节内按「端 → 源编号升序」以加粗来源行分块,源内标题与层级原样保留),零新增、零改写、零删除;新增文本仅限文档标题、本注记与逐节来源行。
|
|
32
|
+
|
|
33
|
+
## Scope
|
|
34
|
+
|
|
35
|
+
**源:FE 33 版本与发布协议(pomaster/components/frontend-hard-spec/assets/universal/33-release-versioning-protocol.md)**
|
|
36
|
+
|
|
37
|
+
P2。定义版本标识、分支/提交、灰度、回滚、公共 API 兼容和发布证据。
|
|
38
|
+
|
|
39
|
+
**源:FE 36 Feature Flag 协议(pomaster/components/frontend-hard-spec/assets/universal/36-feature-flag-protocol.md)**
|
|
40
|
+
|
|
41
|
+
P2。定义功能开关来源、命名、灰度范围、关闭表现、默认值和生命周期。
|
|
42
|
+
|
|
43
|
+
**源:BE 32 发布、版本与回滚协议(pomaster/components/backend-hard-spec/assets/universal/32-release-versioning-rollback-protocol.md)**
|
|
44
|
+
|
|
45
|
+
规范版本、灰度、开关、发布记录、兼容窗口、回滚和数据库演进。
|
|
46
|
+
|
|
47
|
+
## Non-Scope
|
|
48
|
+
|
|
49
|
+
**源:FE 33 版本与发布协议**
|
|
50
|
+
|
|
51
|
+
不替代验收门禁、组织发布平台和基础设施部署流程。
|
|
52
|
+
|
|
53
|
+
**源:FE 36 Feature Flag 协议**
|
|
54
|
+
|
|
55
|
+
不替代权限、业务状态和环境配置。
|
|
56
|
+
|
|
57
|
+
**源:BE 32 发布、版本与回滚协议**
|
|
58
|
+
|
|
59
|
+
不替代具体平台操作手册或证据验收协议。
|
|
60
|
+
|
|
61
|
+
## Terms
|
|
62
|
+
|
|
63
|
+
**源:FE 33 版本与发布协议**
|
|
64
|
+
|
|
65
|
+
- App Version:可关联提交、构建、环境和 source map 的版本。
|
|
66
|
+
- Gray Release:受控用户/环境范围内逐步发布。
|
|
67
|
+
- Rollback:恢复到已验证版本和兼容状态。
|
|
68
|
+
|
|
69
|
+
**源:FE 36 Feature Flag 协议**
|
|
70
|
+
|
|
71
|
+
- Flag Key:稳定唯一的开关键。
|
|
72
|
+
- Targeting:按环境、用户、角色或组织控制命中。
|
|
73
|
+
- Kill Switch:紧急关闭新能力的开关。
|
|
74
|
+
|
|
75
|
+
**源:BE 32 发布、版本与回滚协议**
|
|
76
|
+
|
|
77
|
+
可回退包括代码回滚、配置恢复、流量撤回和数据 roll-forward 的组合能力。
|
|
78
|
+
|
|
79
|
+
## MUST
|
|
80
|
+
|
|
81
|
+
**源:FE 33 版本与发布协议 · §MUST**
|
|
82
|
+
|
|
83
|
+
- 每个构建有可观测版本和来源。
|
|
84
|
+
- 发布前契约、测试、安全、配置、监控和回滚满足门禁。
|
|
85
|
+
- 高风险变更定义灰度和停止条件。
|
|
86
|
+
- 回滚同时考虑前端资源、接口、缓存、任务和数据兼容。
|
|
87
|
+
- 公共 breaking change 先 deprecated 并提供迁移期。
|
|
88
|
+
|
|
89
|
+
**源:FE 36 Feature Flag 协议 · §MUST**
|
|
90
|
+
|
|
91
|
+
- 每个 flag 有 owner、目的、默认值、目标范围、期限和清理日期。
|
|
92
|
+
- 入口、路由和后台请求在关闭时一致停用。
|
|
93
|
+
- 获取失败使用保守默认值。
|
|
94
|
+
- Flag 与权限同时通过才允许操作。
|
|
95
|
+
- 全量稳定后删除临时判断和旧路径。
|
|
96
|
+
|
|
97
|
+
**源:BE 32 发布、版本与回滚协议 · §MUST**
|
|
98
|
+
|
|
99
|
+
- 发布前必须确认版本、依赖顺序、兼容、观测、停止条件和恢复路径。
|
|
100
|
+
|
|
101
|
+
## MUST NOT
|
|
102
|
+
|
|
103
|
+
**源:FE 33 版本与发布协议 · §MUST NOT**
|
|
104
|
+
|
|
105
|
+
- MUST NOT 无版本标识发布。
|
|
106
|
+
- MUST NOT 无回滚上线破坏性变化。
|
|
107
|
+
- MUST NOT 直接删除公共 API。
|
|
108
|
+
- MUST NOT 发布后才补监控和 source map。
|
|
109
|
+
|
|
110
|
+
**源:FE 36 Feature Flag 协议 · §MUST NOT**
|
|
111
|
+
|
|
112
|
+
- MUST NOT 在多个页面手写同一判断。
|
|
113
|
+
- MUST NOT 将 flag 当权限或业务状态。
|
|
114
|
+
- MUST NOT 使用无 owner、无期限的永久临时 flag。
|
|
115
|
+
- MUST NOT 关闭 UI 却继续触发后台请求。
|
|
116
|
+
|
|
117
|
+
**源:BE 32 发布、版本与回滚协议 · §MUST NOT**
|
|
118
|
+
|
|
119
|
+
- 不得在无法恢复数据或无监控信号时进行不可逆全量发布。
|
|
120
|
+
|
|
121
|
+
## SHOULD
|
|
122
|
+
|
|
123
|
+
**源:FE 33 版本与发布协议 · §SHOULD**
|
|
124
|
+
|
|
125
|
+
- SHOULD 自动生成变更摘要和发布证据。
|
|
126
|
+
- SHOULD 使用 Feature Flag 降低高风险上线范围。
|
|
127
|
+
|
|
128
|
+
**源:FE 36 Feature Flag 协议 · §SHOULD**
|
|
129
|
+
|
|
130
|
+
- SHOULD 支持灰度、回滚、监控和实验审计。
|
|
131
|
+
- SHOULD 对关键写操作提供 kill switch。
|
|
132
|
+
|
|
133
|
+
**源:BE 32 发布、版本与回滚协议 · §SHOULD**
|
|
134
|
+
|
|
135
|
+
- 应采用小批量灰度、可撤回开关和前后版本并行兼容。
|
|
136
|
+
|
|
137
|
+
## Contract
|
|
138
|
+
|
|
139
|
+
**源:FE 33 版本与发布协议 · §Contract**
|
|
140
|
+
|
|
141
|
+
```text
|
|
142
|
+
Version, Commit, BuildTime, Environment, Changes,
|
|
143
|
+
Flags, Migration, Monitoring, Rollback, Owner
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**源:FE 36 Feature Flag 协议 · §Contract**
|
|
147
|
+
|
|
148
|
+
```text
|
|
149
|
+
FlagKey, Owner, Default, Targeting, Fallback,
|
|
150
|
+
StartAt, EndAt, CleanupAt, Metrics
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**源:BE 32 发布、版本与回滚协议 · §Contract**
|
|
154
|
+
|
|
155
|
+
发布记录必须包含变更范围、产物 hash、步骤、门禁、指标、Owner 与结果。
|
|
156
|
+
|
|
157
|
+
## Checklist
|
|
158
|
+
|
|
159
|
+
**源:FE 33 版本与发布协议 · §Checklist**
|
|
160
|
+
|
|
161
|
+
- [ ] 版本可追踪。
|
|
162
|
+
- [ ] 门禁和契约通过。
|
|
163
|
+
- [ ] 灰度与回滚可执行。
|
|
164
|
+
- [ ] deprecated/迁移完整。
|
|
165
|
+
|
|
166
|
+
**源:FE 36 Feature Flag 协议 · §Checklist**
|
|
167
|
+
|
|
168
|
+
- [ ] 默认和失败行为安全。
|
|
169
|
+
- [ ] UI/路由/请求一致。
|
|
170
|
+
- [ ] 不绕过权限。
|
|
171
|
+
- [ ] 有清理日期。
|
|
172
|
+
|
|
173
|
+
**源:BE 32 发布、版本与回滚协议 · §Checklist**
|
|
174
|
+
|
|
175
|
+
- [ ] 应用、数据库、配置、消息、缓存与消费者版本已对齐。
|
|
176
|
+
|
|
177
|
+
## Examples
|
|
178
|
+
|
|
179
|
+
**源:FE 33 版本与发布协议 · §Examples**
|
|
180
|
+
|
|
181
|
+
### 内容示例,可删除
|
|
182
|
+
|
|
183
|
+
公共组件新 API 与旧 API 并存一个迁移周期,再在版本公告后删除旧 API。
|
|
184
|
+
|
|
185
|
+
**源:FE 36 Feature Flag 协议 · §Examples**
|
|
186
|
+
|
|
187
|
+
### 内容示例,可删除
|
|
188
|
+
|
|
189
|
+
新编辑器 flag 关闭后回到旧编辑器,相关新 API 不再调用。
|
|
190
|
+
|
|
191
|
+
**源:BE 32 发布、版本与回滚协议 · §Examples**
|
|
192
|
+
|
|
193
|
+
- 先发布兼容读写版本,完成数据迁移后再清理旧契约。
|
|
194
|
+
|
|
195
|
+
## Anti-patterns
|
|
196
|
+
|
|
197
|
+
**源:FE 33 版本与发布协议 · §Anti-patterns**
|
|
198
|
+
|
|
199
|
+
静态资源已回滚,但新缓存 schema 和后台任务仍不兼容旧页面。
|
|
200
|
+
|
|
201
|
+
**源:FE 36 Feature Flag 协议 · §Anti-patterns**
|
|
202
|
+
|
|
203
|
+
组件中散落环境判断,开关关闭后深链接仍能访问新功能。
|
|
204
|
+
|
|
205
|
+
**源:BE 32 发布、版本与回滚协议 · §Anti-patterns**
|
|
206
|
+
|
|
207
|
+
- 把数据库回滚等同于逆向执行破坏性 migration。
|
|
208
|
+
|
|
209
|
+
## Ownership
|
|
210
|
+
|
|
211
|
+
**源:FE 33 版本与发布协议 · §Ownership**
|
|
212
|
+
|
|
213
|
+
发布 Owner 负责流程,模块 Owner 负责兼容,平台 Owner 负责回滚和监控。
|
|
214
|
+
|
|
215
|
+
**源:FE 36 Feature Flag 协议 · §Ownership**
|
|
216
|
+
|
|
217
|
+
功能 Owner 维护业务生命周期,平台 Owner 维护系统,安全/权限 Owner 审查边界。
|
|
218
|
+
|
|
219
|
+
**源:BE 32 发布、版本与回滚协议 · §Ownership**
|
|
220
|
+
|
|
221
|
+
发布责任人执行门禁,Backend 提供兼容与恢复证据。
|
|
222
|
+
|
|
223
|
+
## Change Policy
|
|
224
|
+
|
|
225
|
+
**源:FE 33 版本与发布协议 · §Change Policy**
|
|
226
|
+
|
|
227
|
+
版本和发布策略变化必须同步 CI/CD、门禁、文档和责任人。
|
|
228
|
+
|
|
229
|
+
**源:FE 36 Feature Flag 协议 · §Change Policy**
|
|
230
|
+
|
|
231
|
+
Flag 语义和目标规则变化必须记录;转长期配置时迁移到正式配置系统。
|
|
232
|
+
|
|
233
|
+
**源:BE 32 发布、版本与回滚协议 · §Change Policy**
|
|
234
|
+
|
|
235
|
+
发布流程和阻断门禁变化必须通过演练与审计后生效。
|
|
236
|
+
|
|
237
|
+
> **语言节**:本主题无语言节挂点(缺席诚实);规则本体即上文通用节。
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
---
|
|
2
|
+
seed_source: packages/cli/seeds/aggregation-manifest.json
|
|
3
|
+
seed_source_sha256: 039b637ccffacdfe3ce30d85e193f4b38928fcdfb16efdc4eb255e35e05af91f
|
|
4
|
+
seed_version: B7-THEME
|
|
5
|
+
lane: [frontend, backend]
|
|
6
|
+
status: CURRENT
|
|
7
|
+
authority_scope: mixed_required_and_advisory
|
|
8
|
+
applies_to: [frontend, backend]
|
|
9
|
+
related_evidence_specs: []
|
|
10
|
+
related_tools: []
|
|
11
|
+
legacy_id: theme:security
|
|
12
|
+
criticality: critical # 聚合注记:取源最高;info 性注记非执行语义
|
|
13
|
+
injection_mode: triggered # 聚合注记:来源同值;info 性注记非执行语义
|
|
14
|
+
stages: [prepare, implement, check, release] # 聚合注记:来源 stages 并集;info 性注记非执行语义
|
|
15
|
+
triggers: [security, api-input, authentication, authorization, file-processing, secrets] # 聚合注记:来源 triggers 并集;info 性注记非执行语义
|
|
16
|
+
requires: [] # 聚合注记:来源 requires 并集(全空)
|
|
17
|
+
x-aggregation: # 聚合来源(D6):逐源 vendor pin(sha256 与卡 vendor_pin 同值)
|
|
18
|
+
- seed_source: pomaster/components/frontend-hard-spec/assets/universal/04-security-protocol.md
|
|
19
|
+
sha256: 4d9bb6bd34a64fcc3e362c969492bc326533e16ef4c6d2284dc01442733504e6
|
|
20
|
+
seed_version: B6B-1
|
|
21
|
+
- seed_source: pomaster/components/backend-hard-spec/assets/universal/10-security-protocol.md
|
|
22
|
+
sha256: 56387f03edd35df50a5a701f4daab174b744d490663393f43331cf5401149f67
|
|
23
|
+
seed_version: B6C
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
# 安全
|
|
27
|
+
|
|
28
|
+
> **聚合纪律**:本文档 12 节正文规则行逐字取自 frontmatter x-aggregation 所列来源协议(节内按「端 → 源编号升序」以加粗来源行分块,源内标题与层级原样保留),零新增、零改写、零删除;新增文本仅限文档标题、本注记与逐节来源行。
|
|
29
|
+
|
|
30
|
+
## Scope
|
|
31
|
+
|
|
32
|
+
**源:FE 04 安全协议(pomaster/components/frontend-hard-spec/assets/universal/04-security-protocol.md)**
|
|
33
|
+
|
|
34
|
+
P0。从访问控制与威胁防御视角约束前端代码:XSS/CSRF/CSP、认证/token 生命周期、授权边界、输入校验、敏感数据脱敏、依赖与供应链、传输安全、第三方脚本/iframe/postMessage、客户端存储、错误信息泄露。本协议聚焦前端/客户端可治理项;后端安全、基础设施安全、隐私政策与组织安全流程不替代。
|
|
35
|
+
|
|
36
|
+
与 `universal:16-error-handling-protocol` 的边界:安全只审计错误信息泄露风险,完整错误处理策略见 16。
|
|
37
|
+
与 `universal:17-permission-protocol` 的边界:安全聚焦“敏感数据不下发”和“前端表现不能替代后端强制授权”,权限 UI 规则见 17。
|
|
38
|
+
与 `universal:40-analytics-protocol` 的边界:埋点 schema 与去重由 40 负责,安全只审计埋点/日志中不得出现敏感原值。
|
|
39
|
+
与 `universal:44-privacy-data-lifecycle-protocol` 的边界:数据是否该收集、保留多久由 44 负责,安全负责防止未授权访问与脱敏。
|
|
40
|
+
与 `universal:45-browser-storage-protocol` 的边界:存储介质选择与隔离策略由 45 负责,安全负责凭据/敏感数据不得持久化到脚本可读存储。
|
|
41
|
+
|
|
42
|
+
**源:BE 10 安全协议(pomaster/components/backend-hard-spec/assets/universal/10-security-protocol.md)**
|
|
43
|
+
|
|
44
|
+
规范认证、鉴权、输入与文件校验、注入防护、密钥和安全默认值。
|
|
45
|
+
|
|
46
|
+
## Non-Scope
|
|
47
|
+
|
|
48
|
+
**源:FE 04 安全协议**
|
|
49
|
+
|
|
50
|
+
不替代后端鉴权、服务端校验、安全审计、基础设施安全、隐私政策和组织安全流程。
|
|
51
|
+
|
|
52
|
+
**源:BE 10 安全协议**
|
|
53
|
+
|
|
54
|
+
不替代隐私保留规则或具体基础设施加固 Overlay。
|
|
55
|
+
|
|
56
|
+
## Terms
|
|
57
|
+
|
|
58
|
+
**源:FE 04 安全协议**
|
|
59
|
+
|
|
60
|
+
- Threat Defense:防止常见 Web 攻击的纵深防御集合。
|
|
61
|
+
- Dangerous Sink:把字符串解释为 HTML、脚本、URL、CSS 或导航目标的浏览器入口。
|
|
62
|
+
- Sanitization:按白名单清洗不可信内容。
|
|
63
|
+
- Third-party Execution:在本页面 origin 或受信 iframe 中执行的外部脚本、标签或组件。
|
|
64
|
+
- CSP:Content-Security-Policy,默认采用严格策略。
|
|
65
|
+
- PII:可用于识别个人身份的数据。
|
|
66
|
+
- Sensitive Data:受隐私、业务或权限保护的数据。
|
|
67
|
+
- SRI:Subresource Integrity,外部资源完整性校验。
|
|
68
|
+
|
|
69
|
+
**源:BE 10 安全协议**
|
|
70
|
+
|
|
71
|
+
信任边界是数据或调用从较低信任域进入较高权限域的位置。
|
|
72
|
+
|
|
73
|
+
## MUST
|
|
74
|
+
|
|
75
|
+
**源:FE 04 安全协议 · §MUST**
|
|
76
|
+
|
|
77
|
+
- 建立项目级安全 Owner,对 12 个安全维度(SEC-01~SEC-12)建立要求、检查点和异常审批流程。
|
|
78
|
+
- 统一定义 token、cookie、CSRF、退出和刷新策略。
|
|
79
|
+
- 所有输入、URL、文件名、消息和 HTML 默认不可信。
|
|
80
|
+
- 不可信数据必须在进入系统时校验,并在输出到不同上下文时使用对应的编码、净化或安全类型;类型声明不能替代运行时校验。
|
|
81
|
+
- 字段脱敏、复制、导出和日志必须遵守数据权限。
|
|
82
|
+
- 上传和下载必须由服务端再次校验权限、类型和范围。
|
|
83
|
+
- 安全失败必须采用保守默认行为。
|
|
84
|
+
- Cookie 会话必须明确 `Secure`、`HttpOnly`、`SameSite`、Domain、Path 和生命周期;状态变更请求必须有正式 CSRF 防护,不能只依赖 SameSite。
|
|
85
|
+
- 跨窗口消息必须固定 `targetOrigin`,接收端校验 `origin`、`source` 和消息 schema;消息内容只按数据处理。
|
|
86
|
+
- return URL、外链、下载地址和资源 URL 必须限制为安全协议及受信来源,不得由不可信参数直接决定。
|
|
87
|
+
- 第三方脚本、iframe 和标签必须记录 Owner、来源、权限、数据范围、完整性/版本、CSP 与撤除方式,并遵循最小能力原则。
|
|
88
|
+
- 注销、切换账号/租户、权限变化或会话失效时必须清除敏感缓存、存储、订阅、Worker 和长连接。
|
|
89
|
+
|
|
90
|
+
### SEC-01 XSS / 输出编码 / 危险 sink 管控
|
|
91
|
+
|
|
92
|
+
- MUST 将用户、URL、API、存储、第三方消息来源的数据视为不可信输入。
|
|
93
|
+
- MUST 在输出到 HTML、JavaScript、URL、CSS、SVG、style 属性前使用对应上下文编码。
|
|
94
|
+
- MUST NOT 使用 `v-html` / `innerHTML` / `dangerouslySetInnerHTML` 渲染不可信内容;富文本必须使用白名单 sanitizer。
|
|
95
|
+
- MUST NOT 将不可信数据拼接到 `eval`、`setTimeout`、`setInterval`、`new Function`、`<script>`、内联事件处理器。
|
|
96
|
+
- MUST 对富文本/markdown 渲染建立白名单标签与属性清单,禁止 `<script>`、`<style>`、事件属性及未知协议。
|
|
97
|
+
- MUST 使用 Trusted Types 作为纵深防御。
|
|
98
|
+
- MUST 在组件/页面级声明是否需要渲染外部 HTML,并记录 owner 与 sanitizer 策略。
|
|
99
|
+
|
|
100
|
+
### SEC-02 CSRF / 状态变更请求防护
|
|
101
|
+
|
|
102
|
+
- MUST 所有状态变更请求(POST/PUT/PATCH/DELETE)具备 CSRF 防护,不能只依赖 SameSite Cookie。
|
|
103
|
+
- MUST 使用双重提交 cookie 或同步器 token;token 必须每次会话/请求不可预测且由后端验证。
|
|
104
|
+
- MUST 在表单提交、AJAX/Fetch、上传、批量操作、GraphQL mutation 中携带 CSRF token。
|
|
105
|
+
- MUST 将 Cookie 显式设置为 `SameSite=Lax` 或 `SameSite=Strict`;跨域 `SameSite=None` 必须同时设置 `Secure`。
|
|
106
|
+
- MUST 对 AJAX/API 请求使用自定义头,利用浏览器跨域预检限制简单请求被 CSRF 利用。
|
|
107
|
+
- MUST NOT 将 CSRF token 放进 URL 查询参数或持久化到可被脚本读取的存储。
|
|
108
|
+
- MUST 在登录、切换租户、敏感操作后轮换 CSRF token。
|
|
109
|
+
|
|
110
|
+
### SEC-03 CSP / 安全响应头
|
|
111
|
+
|
|
112
|
+
- MUST 部署 CSP,默认 `default-src 'self'`;脚本/样式/img/font/connect/frame 按业务最小白名单开放。
|
|
113
|
+
- MUST 禁止 `'unsafe-inline'` 与 `'unsafe-eval'`;如无法避免,必须使用 nonce 或 hash,并记录例外。
|
|
114
|
+
- MUST 配置 `X-Content-Type-Options: nosniff`、`X-Frame-Options: DENY/SAMEORIGIN`(或 CSP `frame-ancestors`)、`Referrer-Policy: strict-origin-when-cross-origin` 或更严。
|
|
115
|
+
- MUST 配置 `Permissions-Policy` 限制未使用的浏览器能力。
|
|
116
|
+
- MUST 对 CSP 采用 report-only → enforce 渐进收紧策略,并有 owner 审批放宽。
|
|
117
|
+
- MUST NOT 在联调或生产中长期使用 CSP-Report-Only 作为规避手段。
|
|
118
|
+
- MUST 在页面级声明是否允许内嵌 iframe、是否允许加载第三方脚本,并映射到 CSP 指令。
|
|
119
|
+
|
|
120
|
+
### SEC-04 认证 / Token 生命周期
|
|
121
|
+
|
|
122
|
+
- MUST 使用 `HttpOnly`、`Secure`、`SameSite` Cookie 存储 session identifier。
|
|
123
|
+
- MUST 实现 refresh token 轮换与绑定机制,检测并撤销 reuse。
|
|
124
|
+
- MUST 在 token 即将过期前使用 silent refresh 或显式重新认证,不得在 URL 中传递 token。
|
|
125
|
+
- MUST 实现统一登出:清除服务端会话、客户端内存 token、触发所有标签页/Worker 登出事件。
|
|
126
|
+
- MUST NOT 在源码、环境变量模板、日志、错误消息、URL、LocalStorage、URL fragment 中暴露 access/refresh token / client secret。
|
|
127
|
+
- MUST 对密码/MFA/生物识别输入框禁用自动填充例外需经审批,并确保表单通过 HTTPS 提交。
|
|
128
|
+
- MUST 在切换账号/租户、权限变化、长时间无操作、检测到异常时要求重新认证。
|
|
129
|
+
|
|
130
|
+
### SEC-05 授权 / 前端能力隐藏 vs 后端强制
|
|
131
|
+
|
|
132
|
+
- MUST 明确每个页面/路由/按钮/API 所需 capability/permission,前端仅做 UI 呈现,最终授权由后端执行。
|
|
133
|
+
- MUST NOT 用前端隐藏菜单或按钮替代后端鉴权。
|
|
134
|
+
- MUST 后端返回字段按权限脱敏,前端不得获取全量敏感数据后再自行过滤或仅 CSS 隐藏。
|
|
135
|
+
- MUST 对“可直达 URL”执行页面级权限守卫,无权限时展示一致拒绝状态。
|
|
136
|
+
- MUST 在权限降低、角色变化、租户切换后刷新或降级页面状态,不能保留旧权限渲染。
|
|
137
|
+
- MUST 对导出、删除、审批、批量操作等高影响动作增加二次确认或后端 challenge。
|
|
138
|
+
|
|
139
|
+
### SEC-06 输入校验 / 输出净化
|
|
140
|
+
|
|
141
|
+
- MUST 将客户端校验仅视为 UX 辅助,服务端校验为权威;前端仍需执行同步/异步校验以提升体验。
|
|
142
|
+
- MUST 对所有输入执行白名单校验(类型、长度、范围、格式、枚举、业务规则),拒绝而非清洗恶意输入。
|
|
143
|
+
- MUST 对 URL、return URL、重定向目标、下载地址、iframe src 使用受信白名单。
|
|
144
|
+
- MUST 对文件名、扩展名、MIME 类型进行白名单校验,上传/下载需后端二次校验。
|
|
145
|
+
- MUST 对结构化输入(JSON、CSV、粘贴、拖放)执行 schema 校验。
|
|
146
|
+
- MUST NOT 在 URL 中放置敏感参数、token、内部 ID 或用户输入原文。
|
|
147
|
+
- MUST 对输出到 HTML/URL/CSS/JS 的内容按 SEC-01 执行上下文编码。
|
|
148
|
+
|
|
149
|
+
### SEC-07 敏感数据脱敏 / PII 处理
|
|
150
|
+
|
|
151
|
+
- MUST 在页面/组件/表格/详情中按数据分类与字段权限对敏感字段脱敏。
|
|
152
|
+
- MUST 对 PII 建立字段级敏感度标签。
|
|
153
|
+
- MUST NOT 将敏感原值写入浏览器 console、日志、埋点、错误监控、剪贴板、URL、localStorage、下载文件。
|
|
154
|
+
- MUST 对复制、导出、打印功能实施权限控制与脱敏策略;高敏感字段导出需审计与额外授权。
|
|
155
|
+
- MUST 在传输过程中使用 TLS 1.2+ 加密敏感数据。
|
|
156
|
+
- MUST 与 44-privacy 协议协同:安全负责防未授权访问与脱敏,privacy 负责是否该收集/保留多久。
|
|
157
|
+
|
|
158
|
+
### SEC-08 依赖与供应链
|
|
159
|
+
|
|
160
|
+
- MUST 使用 lockfile 并对依赖变更执行 diff 评审。
|
|
161
|
+
- MUST 在 CI 中运行 SCA 扫描,阻断存在高严重度 CVE 的依赖。
|
|
162
|
+
- MUST 对 CDN/外部脚本使用 SRI hash,禁止引入无完整性校验的第三方脚本。
|
|
163
|
+
- MUST 维护允许使用的包范围/owner 清单;禁止从个人仓库、未验证 npm 镜像或 Git URL 直接安装生产依赖。
|
|
164
|
+
- MUST 对关键依赖做签名/发布来源验证(npm provenance、GitHub verified commits)。
|
|
165
|
+
- MUST 在 package.json 中区分 dependencies / devDependencies;生产包不得包含开发/构建工具。
|
|
166
|
+
- MUST 对废弃、长期未维护、许可证冲突的依赖建立淘汰计划。
|
|
167
|
+
- MUST NOT 将生产凭据、内部 registry token 写入 package manager 配置或源码。
|
|
168
|
+
|
|
169
|
+
### SEC-09 传输安全
|
|
170
|
+
|
|
171
|
+
- MUST 所有页面、API、静态资源、WebSocket、SSE 通过 HTTPS / WSS 传输;禁止明文 HTTP 生产流量。
|
|
172
|
+
- MUST 配置 HSTS,包含 `includeSubDomains` 与合理 `max-age`(建议 ≥ 1 年)。
|
|
173
|
+
- MUST 配置 TLS 1.2+;HTTPS 页面不得加载 HTTP 资源(混合内容)。
|
|
174
|
+
- MUST 在开发/测试环境中不得通过关闭证书校验绕过 HTTPS(除非短期本地沙箱并有审批)。
|
|
175
|
+
- MUST 对敏感 API 启用 certificate transparency 监控与异常证书告警。
|
|
176
|
+
|
|
177
|
+
### SEC-10 第三方脚本 / iframe / postMessage / 点击劫持
|
|
178
|
+
|
|
179
|
+
- MUST 维护第三方脚本、iframe、widget、SDK 清单,记录 owner、来源域、权限范围、数据范围、版本、SRI、CSP 与撤除方式。
|
|
180
|
+
- MUST 对 iframe 使用 `sandbox` 属性,并按需限制 `allow` 权限。
|
|
181
|
+
- MUST 对 `postMessage` 固定 `targetOrigin`,接收端校验 `origin`、`source` 与消息 schema;不得将消息内容直接作为 HTML/代码执行。
|
|
182
|
+
- MUST 使用 `X-Frame-Options: DENY/SAMEORIGIN` 或 CSP `frame-ancestors` 防止点击劫持。
|
|
183
|
+
- MUST 对第三方脚本执行最小能力原则。
|
|
184
|
+
- MUST 在用户撤回同意或第三方 SDK 不再需要时停止加载并清理其状态/缓存。
|
|
185
|
+
- MUST NOT 使用 `postMessage('*')` 或在跨窗口消息中直接执行 eval/innerHTML。
|
|
186
|
+
|
|
187
|
+
### SEC-11 客户端存储安全
|
|
188
|
+
|
|
189
|
+
- MUST 明确每个持久化项的 StorageClass、用途、隔离键、过期时间、清理触发器(见 45-browser-storage-protocol)。
|
|
190
|
+
- MUST 禁止将 session identifier、refresh token、access token、secret、密码等价凭据持久化到 localStorage/sessionStorage/IndexedDB(除非经安全 Owner 批准的短期例外)。
|
|
191
|
+
- MUST 对从 localStorage/sessionStorage/IndexedDB 读取的数据执行 schema、身份、租户、权限校验;失败保守重置。
|
|
192
|
+
- MUST 在注销、切换账号/租户、权限降低、数据目的撤回时清除或重新隔离相关数据。
|
|
193
|
+
- MUST 对跨标签页共享数据定义冲突、通知、版本与一致性策略;不得用客户端存储证明身份或权限。
|
|
194
|
+
- SHOULD 短生命周期状态优先保留在内存;需要跨刷新持久化时优先选择 HttpOnly Cookie,其次才是脚本可读取存储。
|
|
195
|
+
|
|
196
|
+
### SEC-12 错误信息泄露
|
|
197
|
+
|
|
198
|
+
- MUST 将后端错误归一化为稳定 code、用户安全文案与 traceId;不得向用户展示堆栈、SQL、内部路径、配置项、敏感参数。
|
|
199
|
+
- MUST 禁止在错误消息、Toast、Modal、URL、日志、监控 payload 中暴露 token、密码、PII、内部 ID。
|
|
200
|
+
- MUST 对 401/403/404/409/422/429/5xx 分别处理,避免通过错误差异泄露权限/存在性信息。
|
|
201
|
+
- MUST 在前端异常捕获(Error Boundary、window.onerror、unhandledrejection)中过滤敏感字段后再上报监控。
|
|
202
|
+
- MUST 提供安全的用户反馈渠道(traceId / 客服入口)。
|
|
203
|
+
- 完整错误处理语义见 16-error-handling-protocol;security 只审计信息泄露风险。
|
|
204
|
+
|
|
205
|
+
### 分层安全责任(按目录层级)
|
|
206
|
+
|
|
207
|
+
安全是架构期横切能力,按目录层级分担责任;每层有明确的检查点与禁止行为。层级划分与 `09-module-boundary-protocol` 一致。
|
|
208
|
+
|
|
209
|
+
- **app 层 — 全局安全策略与初始化**:配置 CSP/安全响应头、全局错误处理、认证 SDK 初始化、logout/tenant-switch 广播;统一安全上下文与 traceId。MUST NOT 在应用入口无差别关闭 CSP/证书校验/CSRF 作为联调便利;MUST NOT 将全局 token 或 secret 注入应用级 provider。
|
|
210
|
+
- **platform 层 — 状态与网络层安全**:HTTP client 统一注入 CSRF/token/安全头;全局状态库存储划分安全等级;路由守卫集中处理权限降级。MUST NOT 在全局 store 中存放凭据或完整敏感对象;MUST NOT 让业务请求自行决定 CSRF/token 头格式。
|
|
211
|
+
- **api 层 — 请求安全契约**:每个 API 调用按分类携带正确的 token/CSRF/trace-id;请求/响应敏感字段脱敏;错误响应不泄露内部信息。MUST NOT 在 URL/日志中打印 token;MUST NOT 用前端隐藏替代后端鉴权。
|
|
212
|
+
- **domain 层 — 计算与转换安全**:复杂计算/转换对不可信输入执行白名单校验;异步任务状态机记录安全事件;数据导出/打印权限校验。MUST NOT 在 domain 层直接拼接用户输入到 URL/CSS/JS;MUST NOT 在 domain 层直接读取 localStorage 凭据。
|
|
213
|
+
- **feature 层 — 页面级安全**:每个页面声明 CSP/第三方执行/敏感字段/权限守卫需求;页面内 return URL、外链、iframe、postMessage 按白名单执行;错误展示使用归一化文案。MUST NOT 页面单独发明不兼容的 token 存储或错误格式;MUST NOT 页面直接 import 未经清单化的第三方脚本。
|
|
214
|
+
- **shared 层 — 组件与工具安全**:公共组件暴露安全属性(sanitizer_policy、mask_rule、allowed_actions);工具函数提供上下文编码/URL 白名单/敏感字段过滤。MUST NOT 把组件内部调试日志当正式安全审计;MUST NOT 在共享库中硬编码业务 secret 或页面级 capability。
|
|
215
|
+
|
|
216
|
+
**源:BE 10 安全协议 · §MUST**
|
|
217
|
+
|
|
218
|
+
- 所有信任边界必须执行服务端校验、最小权限、失败关闭和安全审计。
|
|
219
|
+
|
|
220
|
+
## MUST NOT
|
|
221
|
+
|
|
222
|
+
**源:FE 04 安全协议 · §MUST NOT**
|
|
223
|
+
|
|
224
|
+
- MUST NOT 渲染未经清洗的 HTML。
|
|
225
|
+
- MUST NOT 将 secret、token 或生产凭据写入源码、URL、日志或公开变量。
|
|
226
|
+
- MUST NOT 将 session identifier、refresh token 或等价凭据持久化到可被脚本读取的存储,除非存在经安全 Owner 批准且有期限的例外。
|
|
227
|
+
- MUST NOT 用前端隐藏替代后端鉴权。
|
|
228
|
+
- MUST NOT 在监控或埋点记录敏感原值。
|
|
229
|
+
- MUST NOT 对敏感消息使用 `postMessage('*')`,或把跨窗口消息直接解释为 HTML/代码。
|
|
230
|
+
- MUST NOT 以关闭 CSP、CSRF、证书校验、输入校验或浏览器安全策略作为长期联调方案。
|
|
231
|
+
- MUST NOT 在状态变更请求中缺少 CSRF 防护。
|
|
232
|
+
- MUST NOT 将 token/secret/PII 放入 URL、console、剪贴板、下载文件或错误消息。
|
|
233
|
+
- MUST NOT 加载无 SRI/无来源清单的第三方脚本或 iframe。
|
|
234
|
+
- MUST NOT 用 localStorage/sessionStorage 证明身份、权限或同意状态。
|
|
235
|
+
|
|
236
|
+
**源:BE 10 安全协议 · §MUST NOT**
|
|
237
|
+
|
|
238
|
+
- 不得信任前端隐藏、客户端校验、代理头或用户提供的资源归属。
|
|
239
|
+
|
|
240
|
+
## SHOULD
|
|
241
|
+
|
|
242
|
+
**源:FE 04 安全协议 · §SHOULD**
|
|
243
|
+
|
|
244
|
+
- SHOULD 使用由 report-only 逐步收紧到 enforce 的 CSP、受控 sanitizer/Trusted Types、依赖安全扫描和短期下载 URL;CSP 是纵深防御,不能替代输出编码和净化。
|
|
245
|
+
- SHOULD 对外部静态资源使用自托管、完整性校验或受控沙箱,并限制 iframe 能力和未使用的浏览器权限。
|
|
246
|
+
- SHOULD 对高风险输入、文件和权限变化建立专项测试。
|
|
247
|
+
- SHOULD 对关键页面/组件/API 建立安全需求登记册(security-requirements)并指派 owner。
|
|
248
|
+
- SHOULD 在 CI 中集成静态安全扫描(eslint-plugin-security / Semgrep)和 SCA。
|
|
249
|
+
- SHOULD 将 security 需求纳入 page-tech-spec §12 非功能需求与运行边界。
|
|
250
|
+
|
|
251
|
+
**源:BE 10 安全协议 · §SHOULD**
|
|
252
|
+
|
|
253
|
+
- 应采用参数化接口、集中密钥管理和可轮换凭据。
|
|
254
|
+
|
|
255
|
+
## Contract
|
|
256
|
+
|
|
257
|
+
**源:FE 04 安全协议 · §Contract**
|
|
258
|
+
|
|
259
|
+
```text
|
|
260
|
+
SecurityRequirement, Scope, Dimension, Priority, Status, Owner,
|
|
261
|
+
SanitizerPolicy, SinkAllowlist, CsrfMechanism, SameSitePolicy, CspMode,
|
|
262
|
+
CspPolicyHash, AllowedScriptSources, AllowedStyleSources, PermissionsPolicy,
|
|
263
|
+
SessionStorage, RefreshStrategy, BackendEnforcement, FrontendPresentation,
|
|
264
|
+
SensitiveFields, MaskingRule, InputSchemaId, RedirectAllowlist,
|
|
265
|
+
FileAllowlistExtensions, LockfileRequired, ScaTool, SriRequiredFor,
|
|
266
|
+
AllowedRegistries, HttpsRequired, HstsMaxAgeSeconds, MinTlsVersion,
|
|
267
|
+
ThirdPartyId, AllowedOrigins, IframeSandbox, PostMessageTargetOrigin,
|
|
268
|
+
FrameAncestorsPolicy, StorageClass, AllowedDataTypes, ForbiddenDataTypes,
|
|
269
|
+
CleanupTriggers, ErrorNormalization, SafeFields, ForbiddenFields,
|
|
270
|
+
MonitoringRedaction
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
分层安全责任契约(按目录层级,与 `09-module-boundary-protocol` 一致):
|
|
274
|
+
|
|
275
|
+
```text
|
|
276
|
+
Layer, Responsibility, CheckPoint, Forbidden
|
|
277
|
+
app, 全局安全策略与初始化, CSP/安全头配置 + 全局错误处理 + 认证初始化 + logout广播, 入口关闭CSP/证书校验/CSRF || 注入全局token/secret
|
|
278
|
+
platform, 状态与网络层安全, HTTP统一安全头 + 全局store分级 + 路由权限守卫, store存凭据 || 业务请求自决CSRF/token格式
|
|
279
|
+
api, 请求安全契约, token/CSRF/trace-id正确携带 + 敏感字段脱敏 + 错误不泄露, URL/日志打印token || 前端隐藏替后端鉴权
|
|
280
|
+
domain, 计算与转换安全, 输入白名单校验 + 异步任务安全事件 + 导出权限校验, domain拼接用户输入到URL/CSS/JS || domain读localStorage凭据
|
|
281
|
+
feature, 页面级安全, 页面CSP/第三方/敏感字段/权限守卫 + returnURL白名单 + 归一化错误, 页面自造token存储/错误格式 || 直接import未清单第三方脚本
|
|
282
|
+
shared, 组件与工具安全, 组件安全属性 + 编码/白名单/过滤工具, 调试日志当安全审计 || 硬编码业务secret或capability
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**源:BE 10 安全协议 · §Contract**
|
|
286
|
+
|
|
287
|
+
安全设计必须列出资产、威胁、控制、失败语义、日志限制和验证证据。
|
|
288
|
+
|
|
289
|
+
## Checklist
|
|
290
|
+
|
|
291
|
+
**源:FE 04 安全协议 · §Checklist**
|
|
292
|
+
|
|
293
|
+
- [ ] 项目级安全 Owner 已指派,12 个维度(SEC-01~SEC-12)要求/检查点/异常审批已建立。
|
|
294
|
+
- [ ] XSS:不可信输入输出编码、危险 sink 管控、富文本 sanitizer/Trusted Types 已确认。
|
|
295
|
+
- [ ] CSRF:状态变更请求带 token、Cookie SameSite/Secure、token 不在 URL。
|
|
296
|
+
- [ ] CSP:严格策略、安全响应头、Permissions-Policy、report-only→enforce 路径已确认。
|
|
297
|
+
- [ ] 认证:token 存储最小化、refresh token 轮换、统一登出、异常重新认证。
|
|
298
|
+
- [ ] 授权:前端仅 UI 呈现,后端强制;敏感字段由后端脱敏;直达 URL 有权限守卫。
|
|
299
|
+
- [ ] 输入校验:白名单校验、return URL/重定向/文件名白名单、结构化输入 schema 校验。
|
|
300
|
+
- [ ] 敏感数据:字段级敏感度标签、脱敏规则、复制/导出/打印权限、传输加密。
|
|
301
|
+
- [ ] 供应链:lockfile + SCA、SRI、registry 白名单、依赖淘汰计划。
|
|
302
|
+
- [ ] 传输:HTTPS/WSS、HSTS、TLS 1.2+、混合内容阻断。
|
|
303
|
+
- [ ] 第三方执行:清单化、iframe sandbox/postMessage origin、点击劫持防护、最小能力。
|
|
304
|
+
- [ ] 客户端存储:凭据不持久化到脚本可读存储、读取校验、清理触发器。
|
|
305
|
+
- [ ] 错误泄露:错误归一化、不暴露堆栈/内部路径/token/PII、监控脱敏。
|
|
306
|
+
- [ ] 分层安全责任已按 app/platform/api/domain/feature/shared 分担。
|
|
307
|
+
|
|
308
|
+
**源:BE 10 安全协议 · §Checklist**
|
|
309
|
+
|
|
310
|
+
- [ ] 认证、鉴权、输入、输出、文件、secret 与审计路径已检查。
|
|
311
|
+
|
|
312
|
+
## Examples
|
|
313
|
+
|
|
314
|
+
**源:FE 04 安全协议 · §Examples**
|
|
315
|
+
|
|
316
|
+
登录表单提交后服务端返回 `HttpOnly; Secure; SameSite=Strict` 的 session cookie;前端在内存中保存短期 access token,refresh token 由后端 Cookie 存储并自动轮换;登出时调用 revoke 接口并触发 BroadcastChannel 清理所有标签页状态。
|
|
317
|
+
|
|
318
|
+
搜索框输入先经前端白名单校验长度/字符集,服务端再次校验;查询参数中的关键字经 URL 编码,渲染到结果列表时经 HTML entity 编码;结果中的富文本由后端给出白名单 HTML,前端使用 DOMPurify 二次清洗并配置 Trusted Types policy。
|
|
319
|
+
|
|
320
|
+
列表页导出按钮触发下载前,前端校验用户具备 `EXPORT` capability,后端再次校验并返回一次性签名下载 URL(短期有效),文件名与 MIME 类型经白名单校验;导出审计日志记录操作人但不包含敏感明细。
|
|
321
|
+
|
|
322
|
+
第三方客服 widget 必须在第三方执行清单登记,iframe 使用 `sandbox="allow-scripts"` 并限制 `allow` 权限,postMessage 仅向 `https://trusted-cdn.example.com` 发送且接收端校验 origin;widget 停用后立即从 CSP/页面中移除。
|
|
323
|
+
|
|
324
|
+
**源:BE 10 安全协议 · §Examples**
|
|
325
|
+
|
|
326
|
+
- 下载接口同时验证操作权限、数据范围和资源归属。
|
|
327
|
+
|
|
328
|
+
## Anti-patterns
|
|
329
|
+
|
|
330
|
+
**源:FE 04 安全协议 · §Anti-patterns**
|
|
331
|
+
|
|
332
|
+
把 access token 放进 URL 或 localStorage,导致 XSS 可直取凭据。
|
|
333
|
+
|
|
334
|
+
前端按角色名硬编码隐藏按钮,未调用后端鉴权,用户可直接构造请求执行敏感操作。
|
|
335
|
+
|
|
336
|
+
使用 `v-html` 渲染用户输入,依赖“用户不会输入恶意代码”假设,最终被 XSS。
|
|
337
|
+
|
|
338
|
+
生产环境关闭 CSP 或将 `'unsafe-inline'`/`'unsafe-eval'` 作为默认策略。
|
|
339
|
+
|
|
340
|
+
将 CSRF token 作为 URL 参数或存入 sessionStorage,被第三方脚本读取。
|
|
341
|
+
|
|
342
|
+
从 localStorage 读取 `userRole` 并据此判断权限,未验证来源与 freshness。
|
|
343
|
+
|
|
344
|
+
错误提示直接展示后端返回的堆栈或 SQL,泄露内部实现。
|
|
345
|
+
|
|
346
|
+
HTTPS 页面加载 HTTP 图片/脚本,触发混合内容并绕过 CSP 边界。
|
|
347
|
+
|
|
348
|
+
**源:BE 10 安全协议 · §Anti-patterns**
|
|
349
|
+
|
|
350
|
+
- 把 token、密码或敏感 payload 写入日志与异常。
|
|
351
|
+
|
|
352
|
+
## Ownership
|
|
353
|
+
|
|
354
|
+
**源:FE 04 安全协议 · §Ownership**
|
|
355
|
+
|
|
356
|
+
安全 Owner 负责政策、12 维度基线和异常审批;平台 Owner 负责 CSP/安全头/HTTP client 安全拦截;业务与后端 Owner 负责数据权限与后端强制;前端 Owner 负责页面级安全呈现与组件安全属性;DevOps Owner 负责传输层与证书管理。
|
|
357
|
+
|
|
358
|
+
**源:BE 10 安全协议 · §Ownership**
|
|
359
|
+
|
|
360
|
+
服务端拥有最终安全判断,安全评审者维护阻断门禁。
|
|
361
|
+
|
|
362
|
+
## Change Policy
|
|
363
|
+
|
|
364
|
+
**源:FE 04 安全协议 · §Change Policy**
|
|
365
|
+
|
|
366
|
+
任何安全放宽必须经过风险评估、批准和期限;高危问题修复优先于交互便利性。新增第三方脚本、放宽 CSP、引入新的 token 存储方式、允许敏感字段明文展示或改变默认安全失败模式,必须走 `universal:change-governance-protocol` 的受控变更流程。
|
|
367
|
+
|
|
368
|
+
**源:BE 10 安全协议 · §Change Policy**
|
|
369
|
+
|
|
370
|
+
放宽安全控制必须经过显式风险审批、范围限制和到期复审。
|
|
371
|
+
|
|
372
|
+
> **语言节**:本主题无语言节挂点(缺席诚实);规则本体即上文通用节。
|