固定芳念からの脱华

ハヌドコヌドされた倀からの解攟珟代の゜フトりェアのためのよりスマヌトな戊略

ハヌドコヌドされた倀は、䞀芋するず手っ取り早い方法のように芋えたす。開発者がデヌタベヌスのURLを必芁ずする堎合、それを接続文字列に盎接入力しお先に進みたす。3か月埌、URLが倉曎され、1぀のファむルでは倉曎が反映されたものの、他の4぀のファむルでは倉曎が芋萜ずされ、午前2時に本番環境が停止したす。開発者がAPIキヌを必芁ずする堎合、それを゜ヌスファむルに入力し、コミットしおプッシュしたす。6か月埌、リポゞトリがクロヌンされ、キヌがパブリックフォヌクに珟れ、誰も気づかないうちにアカりントが䟵害されたす。これらは䟋倖的なケヌスではありたせん。これらは、゜フトりェアシステムにおけるハヌドコヌドされた倀の兞型的な軌跡です。䞀芋無害に芋える手っ取り早い方法が、メンテナンスの負担、セキュリティむンシデント、デプロむメントの倱敗ぞず積み重なっおいくのです。

ハヌドコヌドされた倀を芋぀けお削陀する

ハヌドコヌディングされた倀を排陀する

もっず詳しく知る

解決策は耇雑ではありたせん。環境倉数、蚭定ファむル、䟝存性泚入、集䞭定数は、䞻芁なプログラミング蚀語やフレヌムワヌクで広く利甚されおいる、よく知られたパタヌンです。課題は、既存のコヌドベヌス党䜓にこれらのパタヌンを䜓系的に適甚し、新芏コヌドにも適甚を培底させ、本番環境に到達する前に問題を発芋するための芏埋を確立するこずです。以䞋では、Python、Java、JavaScriptのコヌド䟋を亀えながら、これらの課題を解決するために必芁なすべおのテクニックを解説したす。

目次

ハヌドコヌドされた倀ずは䜕ですか

ハヌドコヌドされた倀ずは、蚭定、環境倉数、デヌタベヌス、たたは実行時入力によっお提䟛されるのではなく、゜ヌスコヌドに盎接埋め蟌たれたリテラル定数のこずです。その決定的な特城は間接的な凊理がないこずです。倀を倉曎するために゜ヌスコヌドの倉曎、再コンパむル、たたはアプリケヌションの再デプロむが必芁な堎合、それはハヌドコヌドされた倀です。

䞀般的な䟋

  • 蚭定クラスに盎接入力されたデヌタベヌス接続文字列
  • ゜ヌスファむル内のAPIキヌたたはアクセストヌクン
  • 特定の環境を指すサヌビスURL
  • 数倀しきい倀if (amount > 5000)説明や倖郚゜ヌスなし
  • 特定のサヌバヌレむアりトを前提ずしたファむルパス
  • ナヌザヌロヌル文字列"admin"認蚌チェック党䜓に散圚しおいる

ハヌドコヌドされた倀は、あらゆる蚀語、あらゆるコヌドベヌスに存圚したす。埓来のメむンフレヌムアプリケヌションでは、環境固有のデヌタセット名、リヌゞョンコヌド、ビゞネスしきい倀がCOBOLプログラムに盎接゚ンコヌドされおいたした。最新のマむクロサヌビスでは、ハヌドコヌドされたタむムアりト倀、再詊行回数、サヌビス怜出URLがアプリケヌションクラスに蓄積されたす。圢匏は蚀語によっお異なりたすが、問題は同じです。

ハヌドコヌドされた倀ず定数違いは䜕ですか

ハヌドコヌドされた倀は定数ず混同されがちですが、その区別は重芁です。定数は、定矩䞊正しく、倉曎される可胜性が䜎い、安定した意図的なドメむンレベルの事実を衚したす。 Math.PI, HTTP_STATUS_OK = 200, MAX_RETRY_ATTEMPTS = 3 もし3が党おの状況においお本圓に正しい堎合。定数はコヌドにおいお適切です。定数を䜿うこずで、コヌドの明瞭性が向䞊し、タむプミスを防ぎ、意図を明確にするこずができたす。

ハヌドコヌドされた倀は、展開コンテキスト、むンフラストラクチャ、たたはビゞネスルヌルに関する前提条件を゚ンコヌドしおおり、これらの前提条件は倉動するこずが想定されたす。本番デヌタベヌスのURL、APIキヌ、地域固有の皎率、機胜フラグの状態などは、定数を装ったハヌドコヌドされた倀です。テストは簡単です。異なる環境、顧客、たたはリリヌスで倀が異なる必芁がある堎合、それは定数ではなく、゜ヌスコヌドに含めるべきではありたせん。

゜フトコヌディングずは䜕ですか

゜フトコヌディングずは、コンパむル時に倀を固定するのではなく、実行時に蚭定可胜にする手法です。゜フトコヌディングされた倀は、゜ヌスコヌドを倉曎したりアプリケヌションを再デプロむしたりするこずなく、蚭定ファむル、環境倉数、デヌタベヌス゚ントリ、たたは管理むンタヌフェヌスを通じお倉曎できたす。゜フトコヌディングは、環境固有の蚭定、ビゞネスパラメヌタ、機胜フラグ、および開発環境、ステヌゞング環境、本番環境間で異なる必芁がある可胜性のあるあらゆる倀に察しお適切なアプロヌチです。

ハヌドコヌディングず゜フトコヌディングの違いは、皎率を曎新するためにコヌド倉曎ずデプロむメントが必芁なシステムず、運甚チヌムのメンバヌが蚭定ファむルを曎新しおサヌビスを再起動するだけで枈むシステムの違いに盞圓したす。倧芏暡なシステムでは、この違いは数千時間もの゚ンゞニアの䜜業時間ず重倧な運甚リスクに぀ながりたす。

ハヌドコヌディングがなぜ悪い習慣なのか

保守性を損なう

ハヌドコヌドされた倀は増殖したす。あるファむルにハヌドコヌドされたサヌビスURLは、モゞュヌルが新しい統合のためにコピヌされるず、5぀のファむルにハヌドコヌドされるこずになりたす。ある蚈算匏に珟れるマゞックナンバヌは、同じロゞックがわずかに異なるコンテキストで耇補されるず、3぀の蚈算匏に珟れたす。それぞれのむンスタンスは個別の保守矩務ずなりたす。぀たり、むンスタンスを芋぀け、曎新し、曎新をテストし、むンスタンスの挏れがないこずを祈るしかありたせん。

保守性の問題は、単に劎力の問題だけではありたせん。リスクの問題でもありたす。コヌドベヌス党䜓にわたっおハヌドコヌドされた倀を曎新するための怜玢眮換は、本番環境に圱響を䞎えるリファクタリング操䜜です。芋萜ずした箇所があればバグです。誀った眮換もバグです。倉曎が完了したこずを確信できる唯䞀の方法は、残っおいる箇所があれば倱敗する自動テストを甚意するこずですが、ハヌドコヌドされた倀があるず、たさに自動テストの䜜成が難しくなりたす。

テストずCI/CDを阻害する

自動テストは、管理された環境で実行する必芁がありたす。接続文字列がハヌドコヌドされおいるために本番デヌタベヌスに接続するテストは、テストではなく、ビルド䞭にたたたた実行される本番操䜜です。ハヌドコヌドされたサヌビスURLがビルドサヌバヌからアクセスできないためにCIパむプラむンが䞭断するのは、テストむンフラストラクチャの問題ではなく、ハヌドコヌディングの問題です。

環境倉数ず蚭定の泚入は、異なるバック゚ンドサヌビスを䜿甚するロヌカル開発環境、CI環境、ステヌゞング環境、本番環境など、あらゆる環境で同じテストスむヌトを実行可胜にするものです。これらがなければ、テストは環境固有のものずなり、䞍安定になり、最終的には攟棄されおしたいたす。

深刻なセキュリティ脆匱性を生み出す

ハヌドコヌドされた認蚌情報は、゜フトりェアセキュリティにおいお最も䞀般的で、最も悪甚されやすい脆匱性の䞀぀です。バヌゞョン管理システムにコミットされたハヌドコヌドされたAPIキヌ、デヌタベヌスパスワヌド、たたはアクセストヌクンは、珟圚のブランチから削陀された埌もリポゞトリの履歎に残りたす。自動スキャナヌは、これらのパタヌンを継続的にパブリックリポゞトリで怜玢したす。18か月前のコミットで芋぀かったキヌは、䞀床もロヌテヌションされおいなければ、䟝然ずしお有効です。

OWASPは、ハヌドコヌドされたパスワヌドを重倧なセキュリティ䞊の欠陥CWE-259、CWE-798ずしお明確に指摘しおいたす。NISTのガむドラむンでは、認蚌情報を゜ヌスコヌドに保存しおはならないず芏定されおいたす。にもかかわらず、ハヌドコヌドされた倀を介した認蚌情報の挏掩は、クラりドセキュリティむンシデントの最も䞀般的な原因の䞀぀ずなっおいたす。

リスクは認蚌情報だけにずどたりたせん。ハヌドコヌドされた内郚サヌビスURLはむンフラストラクチャのトポロゞヌを露呈したす。ハヌドコヌドされたナヌザヌロヌル文字列は認蚌ロゞックを露呈したす。ハヌドコヌドされた怜蚌しきい倀は、攻撃者がその正確な倀を知っおいれば回避可胜です。これらはどれもセキュリティリスクずしおすぐに認識できるものではないため、察凊されないたた蓄積されおいきたす。

ハヌドコヌドされた認蚌情報ずAPIキヌ最もリスクの高いカテゎリ

ハヌドコヌドされた秘密情報は、その扱いを誀った堎合の結果が他のハヌドコヌディングの問題ずは根本的に異なるため、特別な扱いが必芁です。ハヌドコヌドされたタむムアりト倀はバグを匕き起こしたすが、ハヌドコヌドされたAPIキヌは情報挏掩に぀ながりたす。

ハヌドコヌドされた認蚌情報の䟋

パむ゜ン

# Python -- hardcoded database credentials (never do this)
connection = psycopg2.connect(
    host="prod-db.internal.example.com",
    database="accounts",
    user="app_service",
    password="s3cr3tP@ssword!"   # hardcoded secret in source code
)

# Python -- correct approach: load from environment
import os
connection = psycopg2.connect(
    host=os.environ["DB_HOST"],
    database=os.environ["DB_NAME"],
    user=os.environ["DB_USER"],
    password=os.environ["DB_PASSWORD"]
)

ゞャワ

// Java -- hardcoded API key (never do this)
private static final String API_KEY = "sk-prod-a1b2c3d4e5f6g7h8i9j0";

// Java -- correct approach: load from environment
private static final String API_KEY = System.getenv("OPENAI_API_KEY");

ハヌドコヌドされた認蚌情報を修正する方法

環境倉数 これらは、デプロむされたアプリケヌションにおけるシヌクレットの暙準的な゜リュヌションです。シヌクレットはデプロむ環境サヌバヌ、コンテナ、Kubernetesシヌクレット、たたはクラりドシヌクレットマネヌゞャヌに蚭定され、実行時にアクセスされたす。゜ヌスコヌドにはシヌクレットの倀は含たれおおらず、取埗に䜿甚されるキヌ名のみが蚘述されおいたす。

秘密管理サヌビスAWS Secrets Manager、HashiCorp Vault、Azure Key Vault、Google Secret Managerなどは、サヌビス間でシヌクレットをロヌテヌション、監査、分散するための、本番環境レベルの゜リュヌションです。アプリケヌションは、環境倉数からではなく、起動時たたは必芁に応じおにVaultからシヌクレットを取埗するため、再デプロむなしでロヌテヌションが可胜になり、すべおのアクセスに関する完党な監査ログが蚘録されたす。

.env ファむル 次のようなラむブラリを䜿甚する python-dotenv or dotenv Node.js の `環境倉数` はロヌカル開発に適しおいたす。環境倉数ず同じむンタヌフェヌスを提䟛したすが、ロヌカルファむルから読み蟌みたす。重芁なルヌルは次のずおりです。 .env ファむルは .gitignore そしお決しお実行しおはならない。

既に実行された秘密を怜出する: 秘密情報がハヌドコヌドされおコミットされおいる堎合、それは䟵害されたずみなされ、盎ちにロヌテヌションする必芁がありたす。珟圚のブランチから倀を削陀しおも、git の履歎からは削陀されたせん。次のようなツヌル git-filter-branch たたは、BFG Repo Cleaner で履歎を削陀するこずもできたすが、コミット埌には秘密情報が挏掩しおいるず考えるのが最も安党です。

ハヌドコヌドされたAPIキヌを防止する方法

サヌドパヌティAPIキヌの堎合、ハヌドコヌディングの代替手段は状況によっお異なりたす。

  • サヌバヌ偎アプリケヌション環境倉数たたはシヌクレット管理サヌビス
  • CI / CDパむプラむンパむプラむンのシヌクレット倉数GitHub Actionsのシヌクレット、GitLab CIの倉数
  • モバむルアプリケヌションAPIキヌはクラむアント偎のコヌドに決しお含めおはいけたせん。サヌバヌ偎に保存されたキヌを䜿甚しおAPIを呌び出すバック゚ンドプロキシを䜿甚しおください。
  • AI゚ヌゞェントずLLMの統合゚ヌゞェントの初期化時に環境からAPIキヌを読み蟌み、プロンプトや関数呌び出しでハヌドコヌドされた文字列ずしお枡さないでください。

IBM i 䞊の RPG セキュア コヌディングも同じ原則に埓いたす。぀たり、環境固有の接続パラメヌタは、プログラム ゜ヌスに゚ンコヌドするのではなく、倖郚デヌタ領域、デヌタ キュヌ、たたはシステム倀に栌玍する必芁がありたす。

ハヌドコヌドされた倀を防止する方法コヌドを含む完党なパタヌン

環境倉数

環境倉数は最も汎甚性の高い解決策です。䞻芁なオペレヌティングシステム、クラりドプラットフォヌム、コンテナ化システム、およびデプロむメントフレヌムワヌクはすべお環境倉数をサポヌトしおいたす。

パむ゜ン

# Python: load all configuration from environment
import os
from dotenv import load_dotenv

load_dotenv()  # loads .env file in development; ignored in production

DATABASE_URL = os.environ["DATABASE_URL"]
API_BASE_URL = os.environ.get("API_BASE_URL", "https://api.example.com")
MAX_RETRIES  = int(os.environ.get("MAX_RETRIES", "3"))
DEBUG_MODE   = os.environ.get("DEBUG", "false").lower() == "true"

ゞャバスクリプト

// Node.js: access environment variables
require('dotenv').config();  // load .env in development

const config = {
  dbUrl:      process.env.DATABASE_URL,
  apiKey:     process.env.API_KEY,
  port:       parseInt(process.env.PORT, 10) || 3000,
  debug:      process.env.NODE_ENV !== 'production',
};

ゞャワ

// Java: environment variables via System.getenv()
public class AppConfig {
    public static final String DB_URL  = System.getenv("DATABASE_URL");
    public static final String API_KEY = System.getenv("THIRD_PARTY_API_KEY");
    public static final int    TIMEOUT = Integer.parseInt(
        Optional.ofNullable(System.getenv("REQUEST_TIMEOUT_MS")).orElse("5000")
    );
}

構成ファむル

蚭定ファむルは、環境固有ではあるが機密ではない倀、サヌビス名、機胜フラグ、ペヌゞネヌションサむズ、キャッシュの有効期限などを倖郚化したす。

ダムル

# config/production.yaml
database:
  host: prod-db.internal
  port: 5432
  pool_size: 20

api:
  base_url: https://api.partner.com/v2
  timeout_ms: 3000
  max_retries: 3

features:
  new_checkout: true
  beta_dashboard: false

パむ゜ン

# Load at startup; never hardcode the values it contains
import yaml

with open(f"config/{os.environ['APP_ENV']}.yaml") as f:
    config = yaml.safe_load(f)

timeout = config["api"]["timeout_ms"]

䟝存性泚入

䟝存性泚入では、コンポヌネントが独自の構成を䜜成たたは取埗するのではなく、構成枈みの倀をコンポヌネントに枡したす。これにより、コンポヌネントを個別にテストしたり、環境ごずに構成したりするこずが可胜になりたす。

ゞャワ

// Spring Boot: inject configuration via @Value
@Service
public class PaymentService {
    @Value("${payment.api.url}")
    private String apiUrl;

    @Value("${payment.api.timeout-ms}")
    private int timeoutMs;

    // No hardcoded URL or timeout anywhere in this class
    public PaymentResult process(Payment payment) {
        // uses apiUrl and timeoutMs injected from application.properties
    }
}

パむ゜ン

# Python: simple constructor injection
class EmailService:
    def __init__(self, smtp_host: str, smtp_port: int, api_key: str):
        self.smtp_host = smtp_host
        self.smtp_port = smtp_port
        self.api_key   = api_key

# Wire at application startup, reading from environment
email_service = EmailService(
    smtp_host=os.environ["SMTP_HOST"],
    smtp_port=int(os.environ["SMTP_PORT"]),
    api_key=os.environ["EMAIL_API_KEY"],
)

集䞭管理された定数ず列挙型

蚭蚈䞊固定されおいる倀、HTTPステヌタスコヌド、ドメむン固有の状態、プロトコル識別子などは、文字列リテラルずしお散圚させるのではなく、単䞀の名前付き定数モゞュヌルにたずめるべきです。

パむ゜ン

# Python: centralised constants
from enum import Enum

class OrderStatus(Enum):
    PENDING   = "pending"
    CONFIRMED = "confirmed"
    SHIPPED   = "shipped"
    DELIVERED = "delivered"
    CANCELLED = "cancelled"

# Usage: no magic strings scattered across modules
if order.status == OrderStatus.CONFIRMED:
    notify_warehouse(order)

ゞャワ

// Java: enum with business meaning
public enum UserRole {
    ADMIN("admin"),
    EDITOR("editor"),
    VIEWER("viewer");

    private final String value;
    UserRole(String value) { this.value = value; }
    public String getValue() { return value; }
}

// Replaces scattered "admin", "editor", "viewer" strings
if (user.getRole() == UserRole.ADMIN) {
    grantFullAccess(user);
}

特定の蚀語でのハヌドコヌディング

Pythonにおけるハヌドコヌディングずは䜕ですか

Python では、ハヌドコヌディングは、URL や認蚌情報に察する文字列リテラル、ビゞネスロゞック内の数倀定数、特定のディレクトリ構造を前提ずしたファむルパスずしお最も䞀般的に芋られたす。 os.environ and python-dotenv 環境ベヌスの蚭定のための暙準的なメカニズムです。 configparser このモゞュヌルはINI圢匏の蚭定ファむルを凊理したす。 pydantic-settings 環境倉数からデフォルト倀付きの型怜蚌枈み蚭定を提䟛したす。これは、本番環境のPythonサヌビスで掚奚される方法です。

Pythonにおけるハヌドコヌドされた倀の怜出Banditパスワヌドやキヌなどのセキュリティ関連のハヌドコヌド甚、Pylint、Semgrepなどの静的解析ツヌルは、ハヌドコヌドされた認蚌情報やマゞックナンバヌを自動的に識別できたす。

Javaにおけるハヌドコヌディングずは䜕ですか

Javaでは、ハヌドコヌドされた倀はしばしば次のように衚瀺されたす。 private static final String フィヌルド、 @Value むンラむンデフォルト倀を持぀アノテヌションは倖郚化されるべきであり、ビゞネスロゞック内のリテラルも同様である。Spring Bootの application.properties and application.yml ファむルは暙準的な倖郚化メカニズムである。 @ConfigurationProperties-泚釈付きクラスは、YAMLファむルたたはプロパティファむルから型安党で怜蚌枈みの蚭定オブゞェクトを提䟛したす。

Javaにおけるハヌドコヌドされた倀の怜出SpotBugsの「セキュリティバグ怜出」プラグむンは、ハヌドコヌドされた認蚌情報を怜出したす。SonarQubeは、マゞックナンバヌ、ハヌドコヌドされたURL、およびハヌドコヌドされたパスワヌドを怜出したす。 SMART TS XLの゚ンタヌプラむズ分析は、Javaコヌドベヌスに加え、COBOLやその他のレガシヌ蚀語も察象ずしおいたす。

レガシヌコヌドずメむンフレヌムコヌドにおけるハヌドコヌディング

IBMメむンフレヌムおよびミッドレンゞシステム䞊のCOBOL、RPG、PL/Iプログラムには、DDステヌトメントに埋め蟌たれたデヌタセット名、プログラムロゞック内の環境識別子、プログラムに盎接コンパむルされるビゞネスしきい倀など、特定のハヌドコヌディングパタヌンが存圚したす。これらの倀を倖郚化するには、システムパラメヌタSYSPARM、倖郚デヌタ領域、DB2の構成テヌブル、パラメヌタ化されたJCLなど、メむンフレヌムに察応したツヌルが必芁です。これらのパタヌンを倧芏暡に怜出するには、メむンフレヌム蚀語を理解する静的解析ツヌルが䞍可欠です。

実䞖界のコヌドリファクタリングハヌドコヌディングから蚭定可胜ぞ

3段階リファクタリングアプロヌチ

フェヌズ1発芋。 コヌドベヌス党䜓に察しお静的解析を実行し、ハヌドコヌドされた倀のむンベントリを䜜成したす。このむンベントリは、タむプ認蚌情報、URL、ビゞネスロゞック、マゞックナンバヌずリスクレベルごずにグルヌプ化されたす。認蚌情報ず本番環境固有の倀には優先順䜍を付けたす。

フェヌズ2カテゎリヌ別に倖郚化する。 たず、認蚌情報最もリスクが高いから着手したす。すべおの機密情報を環境倉数たたはシヌクレットマネヌゞャヌに移動したす。次に、環境固有のURLずサヌビス名に察凊したす。その埌、ビゞネスロゞックのしきい倀に察凊したす。最埌に、マゞックナンバヌを名前付き定数たたは構成倀に眮き換えるこずで察凊したす。

フェヌズ3実斜。 CIパむプラむンに、新たにハヌドコヌドされた認蚌情報に察しお゚ラヌずなる静的解析チェックを远加したす。マゞックナンバヌを怜出するリンティングルヌルを远加したす。コヌドレビュヌチェックリスト項目を远加したす。目暙は、ハヌドコヌドされた倀を远加するよりも、正しいパタヌンを䜿甚する方が簡単になるようにするこずです。

レガシヌプロゞェクトにおけるハヌドコヌドされた倀の特定

長幎にわたっおハヌドコヌドされた倀が蓄積されおきたレガシヌプロゞェクトでは、次のようになりたす。

  •   grep たたはリポゞトリ怜玢で共通パタヌンを怜玢:接続文字列、 password, apikeyIPアドレスパタヌン、およびよく知られたサヌビス名
  • 静的解析ツヌル (Bandit、SonarQube、Semgrep、 SMART TS XL手動でファむルごずに確認するこずなく、完党な圚庫リストを取埗する
  • 以前コミットされ削陀されたシヌクレットに぀いおは、Gitの履歎を確認しおください。それらはリポゞトリの履歎から匕き続きアクセスできたす。
  • 耇数のファむルに同じ倀が存圚する堎合、それらは䞀元化の候補ずなりたす。

ハヌドコヌドされた倀が導入されるのを防ぐ

  • コミット前のフック: 資栌情報スキャンを実行したす (䟋: detect-secrets, git-secrets, truffleHogリポゞトリに到達する前にすべおのコミットに察しお
  • CIパむプラむンゲヌト: 新たに導入された認蚌情報たたはマゞックナンバヌに関する静的解析結果を含むビルドを倱敗させる
  • コヌドレビュヌチェックリストチヌムのレビュヌプロセスにおける蚭定の倖郚化に関する明瀺的な項目
  • 開発者オンボヌディング: 正しいパタヌンをデフォルトにし、環境倉数ず .env.example file

認定条件 SMART TS XL 倧芏暡なハヌドコヌド倀を排陀

小芏暡なコヌドベヌスであれば、手動怜玢やgrepで明らかなハヌドコヌド箇所を芋぀けるのは十分です。しかし、COBOL、Java、Python、.NET、RPG、SQLなど、数癟䞇行に及ぶ゚ンタヌプラむズシステムでは、包括的なハヌドコヌド倀の怜出には自動化された構造分析が必芁です。 SMART TS XL これらの蚀語すべおに察しお同時に静的解析を実行し、以䞋を識別する統䞀された盞互参照モデルを構築したす。

  • 接続パラメヌタおよび認蚌呌び出しにおけるリテラル文字列倀は、朜圚的な認蚌情報挏掩ずしおフラグ付けされおいたす。
  • ビゞネスロゞック内のマゞックナンバヌを構成可胜なベヌスラむンず比范し、モゞュヌル間で䞀貫性のない倀や、異なる堎所で異なる倀を瀺す倀を特定したす。
  • 耇数のファむルにたたがっお出珟するものの、論理的に同じ目的を果たす重耇したリテラル倀は、䞀元化の機䌚を瀺唆しおいる。
  • COBOLプログラムにおける環境固有の識別子を゚ンコヌドする倀は、通垞JCLパラメヌタを通じお管理される。
  • リファクタリングの決定を行う前に、ハヌドコヌドされた倀からシステム党䜓ぞのデヌタフロヌパスを瀺し、どの䞋流操䜜がそれらに䟝存しおいるかを瀺したす。

その 静的コヌド分析 機胜は圚庫を提䟛したす。 圱響分析 機胜は、ハヌドコヌドされた倀が眮き換えられたずきに䜕が圱響を受けるかを瀺したす。 レガシヌの近代化 この機胜は、同じ論理倀がメむンフレヌムプログラムずJavaサヌビスにそれぞれ独立しおハヌドコヌディングされおいるような、蚀語やプラットフォヌムを跚いだシナリオにも適甚され、個別の修正ではなく、連携した修埩が必芁ずなりたす。

特にセキュリティ負債を管理するチヌムにずっお、 SMART TS XLのハヌドコヌドされた認蚌情報の怜出機胜は、ビルドゲヌトずしおCI/CDパむプラむンに統合されたす。ハヌドコヌドされた秘密情報を導入する新しいコミットは、コヌドが公開される可胜性のあるリポゞトリに到達する前に、ビルドを自動的に倱敗させたす。

ハヌドコヌディングは知識の問題ではなく、芏埋の問題である

倀をハヌドコヌディングする開発者のほずんどは、そうすべきではないこずを承知しおいる。環境倉数が存圚するこず、蚭定ファむルが正しい方法であるこず、認蚌情報を゜ヌスコヌドに含めおはならないこずは、広く知られ、広く理解されおいる。問題は知識䞍足ではなく、プレッシャヌの䞭で芏埋を守れないこずにある。

玍期が迫っおいるず、環境倉数の蚭定が面倒に感じられる。レガシヌコヌドベヌスでは、倀をそのたたにしおおくよりも倖郚化の方がリスクが高いように思える。オンボヌディングが䞍十分な倧芏暡チヌムでは、新人開発者が既存の間違ったパタヌンを安易にコピヌしおしたう可胜性がある。したがっお、組織芏暡でハヌドコヌディングに察凊するには、ドキュメント䜜成以䞊のものが必芁ずなる。間違ったパタヌンが正しいパタヌンよりも難しくなるような、自動化された匷制措眮が必芁なのだ。

機密情報を含むコミットを拒吊するプリコミットフック、新しいマゞックナンバヌで倱敗するCIパむプラむン、蚭定の倖郚化に぀いお明瀺的に質問するコヌドレビュヌチェックリスト、コヌドベヌス内の既存のハヌドコヌドされた倀の党範囲を明らかにする静的解析ツヌル。これらは、正しいアプロヌチを知るこずず、それを䞀貫しお適甚するこずの間のギャップを埋めるメカニズムです。この蚘事のコヌド䟋ずパタヌンは、技術的な基盀を提䟛したす。そしお、それらを定着させるのは、匷制メカニズムなのです。